【dbconnect.php】MySQLのアカウント情報
<?php
try {
$db
= new PDO ('mysql:dbname=test;host=127.0.0.1;
charset=utf8', 'root', 'root');
} catch (PDOException $e) {
echo 'DB接続エラー' . $e->getMessage();
}
?>
---------------------------------------------------------------------
【test.php】HTML・PHP・MySQLで会員登録フォームを作る
<?php
// ★ポイント1★
session_start();
require('dbconnect.php');
if (!empty($_POST) ){
$_SESSION['join'] = $_POST;
header('Location: test3.php');
exit();
}
?>
<!DOCTYPE html>
<html
lang="ja">
<head>
<title>会員登録をする</title>
</head>
<body>
// ★ポイント2★
<form
action="" method="post" enctype="multipart/form-data"
class="registrationform">
// ★ポイント3★
// ★ポイント4★
<p>ニックネーム<input type="text"
name="name" style="width:150px" value="<?php echo htmlspecialchars($_POST['name']??"",
ENT_QUOTES); ?>"></p>
<p>好きな映画歌趣味など<input type="text"
name="email" style="width:150px" value="<?php echo htmlspecialchars($_POST['email']??"",
ENT_QUOTES); ?>"></p>
<p>パスワード<input type="password"
name="password" style="width:150px" value="<?php echo htmlspecialchars($_POST['password']??"",
ENT_QUOTES); ?>"></p>
<p>パスワード再入力<span
class="red">*</span><input type="password"
name="password2″ style="width:150px"></p>
<input
type="submit" value="確認する" class="button">
</form>
</body>
</html>
------------------------------------------------------------------------------------------
【test2.php】PHPで会員登録フォームにエラーチェック機能を追加する
<?php
session_start();
require('dbconnect.php');
// ★ポイント1★
if (!empty($_POST) ){
// ★ポイント2★
if ($_POST['name'] ==
""){
$error['name'] = 'blank';
}
if ($_POST['email'] ==
""){
$error['email'] = 'blank';
}
if ($_POST['password'] ==
"" ) {
$error['password'] = 'blank';
}
if ($_POST['password2'] ==
"" ) {
$error['password2'] = 'blank';
}
// ★ポイント3★
if (strlen($_POST['password']
)< 6 ) {
$error['password'] = 'length';
}
// ★ポイント4★
if (($_POST['password'] !=
$_POST['password2']) && ($_POST['password2'] != "")){
$error['password2'] = 'difference';
}
if(empty($error)) {
$_SESSION['join'] = $_POST;
header('Location: test3.php');
exit();
}
}
?>
<!DOCTYPE html>
<html
lang="ja">
<head>
<title>会員登録をする</title>
</head>
<body>
<form
action="" method="post" enctype="multipart/form-data"
class="registrationform">
<p>ニックネーム<input type="text"
name="name" style="width:400px" value="<?php echo htmlspecialchars($_POST['name']??"",
ENT_QUOTES); ?>">
<?php
if (isset($error['name']) && ($error['name']
== "blank")): ?>
<p class="error">名前を入力してください"</p>
<?php
endif; ?>
</p>
<p>好きな映画歌趣味など<input type="text"
name="email" style="width:150px" value="<?php echo htmlspecialchars($_POST['email']??"",
ENT_QUOTES); ?>">
<?php
if (isset($error['email']) &&
($error['email'] == "blank")): ?>
<p class="error">emailを入力してください</p>
<?php
endif; ?>
</p>
★ポイント5★
<p>パスワード<input type="password"
name="password" style="width:150px" value="<?php echo htmlspecialchars($_POST['password']??"",
ENT_QUOTES); ?>">
<?php
if (isset($error['password']) &&
($error['password'] == "blank")): ?>
<p class="password"> パスワードを入力してください</p>
<?php
endif; ?>
<?php
if (isset($error['password']) &&
($error['password'] == "length")): ?>
<p class="error"> 6文字以上で指定してください</p>
<?php
endif; ?>
</p>
<p>パスワード再入力<span
class="red">*</span><input type="password"
name="password2"
style="width:150px">
<?php
if (isset($error['password2']) &&
($error['password2'] == "blank")): ?>
<p class="error"> パスワードを入力してください</p>
<?php
endif; ?>
<?php
if (isset($error['password2']) &&
($error['password2'] == "difference")): ?>
<p class="error"> パスワードが上記と違います</p>
<?php
endif; ?>
</p>
<input
type="submit" value="確認する" class="button">
</form>
</body>
</html>
--------------------------------------------------------------------------
【test3.php】会員登録フォーム投稿後の確認画面を作成する
<?php
session_start();
require('dbconnect.php');
// ★ポイント1★
if (!isset($_SESSION['join']))
{
header ('Location:
test2.php');
exit();
}
// ★ポイント2★
$hash = password_hash($_SESSION['join']['password'],
PASSWORD_BCRYPT);
// ★ポイント3★
if(!empty($_POST)){
$statement = $db->prepare('INSERT INTO members SET name=?, email=?,
password=?, created=NOW()');
$statement->execute(array(
$_SESSION['join']['name'],
$_SESSION['join']['email'],
$hash));
unset($_SESSION['join']);
header('Location:
test4.php');
exit();
}
?>
<!DOCTYPE html>
<html
lang="ja">
<head>
</head>
<body>
<form
action="" method="post">
<input
type="hidden" name="action" value="submit">
<div
class="label">
// ★ポイント4★
<p>ニックネーム
<span
class="check"><?php echo (htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES));
?></span>
</p><br />
<p>好きな映画歌趣味など
<span
class="check"><?php echo (htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES));
?></span>
</p><br />
<p>パスワード
<span class="check">[セキュリティのため非表示] </span>
</p><br
/>
// ★ポイント5★
<input
type="button" onclick="location.href='test2.php?action=rewrite'"
value="修正する"
name="rewrite" class="button02">
<input
type="submit" onclick="location.href='test4php'"
value="登録する"
name="registration" class="button">
</form>
</body>
</html>
<?php
session_start();
require('dbconnect.php');
// ★ポイント1★
if (!isset($_SESSION['join']))
{
header ('Location:
test2.php');
exit();
}
// ★ポイント2★
$hash = password_hash($_SESSION['join']['password'],
PASSWORD_BCRYPT);
// ★ポイント3★
if(!empty($_POST)){
$statement = $db->prepare('INSERT INTO members SET name=?, email=?,
password=?, created=NOW()');
$statement->execute(array(
$_SESSION['join']['name'],
$_SESSION['join']['email'],
$hash));
unset($_SESSION['join']);
header('Location:
test4.php');
exit();
}
?>
<!DOCTYPE html>
<html
lang="ja">
<head>
</head>
<body>
<form
action="" method="post">
<input
type="hidden" name="action" value="submit">
<div
class="label">
// ★ポイント4★
<p>ニックネーム
<span
class="check"><?php echo (htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES));
?></span>
</p><br />
<p>好きな映画歌趣味など
<span
class="check"><?php echo (htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES));
?></span>
</p><br />
<p>パスワード
<span
class="check">[セキュリティのため非表示] </span>
</p><br
/>
// ★ポイント5★
<input
type="button" onclick="location.href='test2.php?action=rewrite'"
value="修正する"
name="rewrite" class="button02">
<input
type="submit" onclick="location.href='test4php'"
value="登録する"
name="registration" class="button">
</form>
</body>
</html>
----------------------------------------------------------------------------------
【test4.php】登録した情報を使ってログインする画面の作成
<?php
session_start();
require('dbconnect.php');
// ★ポイント1★
if(!empty($_POST)) {
if(($_POST['email'] != '')
&& ($_POST['password'] != '')) {
$login = $db->prepare('SELECT * FROM
members WHERE email=?');
$login->execute(array($_POST['email']));
$member=$login->fetch();
if(password_verify($_POST['password'],$member['password'])) {
$_SESSION['id'] = $member['id'];
$_SESSION['time'] =time();
header('Location: test5.php');
exit();
} else
{
$error['login']='failed';
}
} else {
$error['login'] ='blank';
}
}
?>
<!DOCTYPE html>
<html
lang="ja">
<head>
</head>
<body>
<form action=''
method="post">
<p>好きな映画歌趣味など<input type="text"
name="email" style="width:150px" value="<?php echo htmlspecialchars($_POST['email']??"",
ENT_QUOTES); ?>">
<?php
if (isset($error['login']) && ($error['login'] =='blank')): ?>
<p
class="error">メールとパスワードを入力してください</p>
<?php
endif; ?>
<?php
if( isset($error['login']) && $error['login'] =='failed'): ?>
<p
class="error">メールかパスワードが間違っています</p>
<?php
endif; ?>
</p><br />
<p>パスワード<input type="password"
name="password" style="width:150px" value="<?php echo htmlspecialchars($_POST['password']??"",
ENT_QUOTES); ?>">
</p>
<div
class="login2"><input type="submit" value="ログインする"
class="button"></div>
</form>
</body>
</html>
-------------------------------------------------------------------------------------
【test5.php】PHPで投稿画面に「ログアウト」と「削除機能」をつける
<?php
session_start();
require('dbconnect.php');
if (isset($_SESSION['id'])
&& ($_SESSION['time'] + 3600 > time())) {
$_SESSION['time'] = time();
$members=$db->prepare('SELECT * FROM members WHERE id=?');
$members->execute(array($_SESSION['id']));
$member=$members->fetch();
} else {
header('Location:
test4.php');
exit();
}
if (!empty($_POST)){
if (isset($_POST['token'])
&& $_POST['token'] === $_SESSION['token']) {
$message=$db->prepare('INSERT INTO posts
SET created_by=?, message=?, created=NOW()');
$message->execute(array($member['id'] , $_POST['message']));
header('Location: test5.php');
exit();
}else {
header('Location: test4.php');
exit();
}
}
$posts=$db->query('SELECT m.name, p.* FROM members m, posts p
WHERE m.id=p.created_by ORDER BY p.created
DESC');
$TOKEN_LENGTH = 16;
$tokenByte
= openssl_random_pseudo_bytes($TOKEN_LENGTH);
$token = bin2hex($tokenByte);
$_SESSION['token'] =
$token;
?>
<!DOCTYPE html>
<html
lang="ja">
<body>
<!-- ★ログアウト★ -->
<header>
<div
class="head">
<h1>週末プラン投稿画面</h1>
<span
class="logout"><a href="test4.php">ログアウト</a></span>
</div>
</header>
<form action=''
method="post">
<input
type="hidden" name="token"
value="<?=$token?>">
<?php
if (isset($error['login']) && ($error['login'] =='token')): ?>
<p
class="error">不正なアクセスです。</p>
<?php
endif; ?>
<div
class="edit">
<p><?php echo htmlspecialchars($member['name'],
ENT_QUOTES); ?>さん、ようこそ</p>
<textarea
name="message" cols='50' rows='10'><?php
echo htmlspecialchars($message??"",
ENT_QUOTES); ?></textarea>
</div>
<input
type="submit" value="投稿する" class="button02">
</form>
<?php
foreach($posts as $post): ?>
<div
class="message">
<?php
echo htmlspecialchars($post['message'], ENT_QUOTES);
?>
<span
class="name"><?php echo htmlspecialchars($post['name'], ENT_QUOTES); ?> | <?php echo htmlspecialchars($post['created'],
ENT_QUOTES); ?> |
<!-- ★削除★ -->
<?php
if($_SESSION['id'] == $post['created_by']): ?>
<a href="test6.php?id=<?php
echo htmlspecialchars($post['message_id'],
ENT_QUOTES); ?>">削除</a>]<?php endif; ?></span></p>
<?php
endforeach; ?>
</body>
</html>
---------------------------------------------------------------
【test6.php(削除実行用ファイル)】
<?php
session_start();
require('dbconnect.php');
if(isset($_SESSION['id']))
{
$id = $_REQUEST['id'];
$messages = $db->prepare('SELECT * FROM posts WHERE message_id=?');
$messages ->
execute(array($id));
$message =
$messages->fetch();
if ($message['created_by'] == $_SESSION['id']) {
$del
= $db->prepare('DELETE FROM posts WHERE message_id=?');
$del->execute(array($id));
}
}
header('Location:
test5.php');
exit();
?>