dbconnect.phpMySQLのアカウント情報

 

<?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.phpHTMLPHPMySQLで会員登録フォームを作る

<?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.phpPHPで会員登録フォームにエラーチェック機能を追加する

<?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.phpPHPで投稿画面に「ログアウト」と「削除機能」をつける

<?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();

?>