PHPとMySQLを使った掲示板の作り 参考サンコウURL https://biz.addisteria.com/bbs_creation1/
【データベースを作る】
目次
1. 要件定義を行う
   1) MySQLにデータベース作成
(1) phpMyAdminにログインする
(2) MySQLにデータベースを作る
(3) データベースの中にテーブルを作る
ア. ユーザー情報用のテーブルを作る
ア) データ型とは
イ) 基本となるidの設定
2) 投稿情報用のテーブルを作る
3. さいごに
MySQLにデータベースを作る
データベースメイ:test
ユーザー情報用のテーブルを作る
テーブル【members】を作る
6種類の情報をいれたいので、カラム数は6としておきます。
id 番号
name 名前
email メールアドレス
password パスワード
created 作成日時
modified 更新日時
テーブル:members作成サクセイでコマンドプロンプト〜ツク場合バアイのコマンドは以下イカです。
CREATE TABLE members (message_id INT AUTO_INCREMENT PRIMARY KEY ,name VARCHAR(30) ,email VARCHAR(128) ,password varchar(255) not null ,created DATETIME NOT NULL ,modified DATETIME NOT NULL );
                     
掲示板ケイジバン作成サクセイ講座コウザ、2回目カイメ 「PHPとHTMLを使った会員登録フォームの作り方」
目次      
 1.  HTMLとPHPで会員登録フォームを作る  
  1)  ポイント@ 接続情報を設定する  
  2)  ポイントA POSTメソッドを選択する  
  3)  ポイントB inputタグの中にname属性を割り当てる  
  4)  ポイントC inputタグの中にvalue属性をPHPで設定する  
    a  HTMLの中でPHPのコードを埋め込む  
  b  Value属性の中に$_POSTの値を入れる  
  c  htmlspecialcharsでセキュリティ対策をする  
  d  Notice Undefined index エラーを回避するためにダブルクエスチョンを入れる
5  さいごに      
作成するサイトは次のようになります。
コードは次のとおり。
1つめのコードは次のとおり。
【test.php】
// ★@ポイント★
session_start();
require('dbconnect.php');
if (!empty($_POST) ){
        $_SESSION['join'] = $_POST;
        header('Location: test3.php');
        exit();
    }
?>
<!DOCTYPE html>
<head>
    <title>会員登録をする</title>
</head>
<body>
// ★ポイント2「ユーザーが入力した情報をサーバーに送信する」
<form action="test2.php" 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>email<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>
MSQの接続情報を設定する
2つ目のコードはMySQLに接続するための【dbconnect.php】というファイル作成サクセイします。
【dbconnect.php】
<?php
try {
    $db = new PDO ('mysql:dbname=データベースの名前;host=127.0.0.1; charset=utf8', 'root', '');
} catch (PDOException $e) {
    echo 'DB接続エラー' . $e->getMessage();
}
?>
               
               
作成サクセイ講座コウザB
登録したフォームにエラーメッセージを表示ヒョウジさせる
クワしい内容ナイヨウにつきましては以下イカのURL〜ごランになれます。
https://biz.addisteria.com/bbs_creation3/
3回目 PHPとHTMLとMySQLを使った、こんな会員登録フォームの作り方
目   次      
1 PHPで会員登録フォームにエラーチェック機能を追加する  
 1) ポイント@ 【値が入っていたら】というif条件式を入れる  
 2) ポイントA 【フォームの要素が空っぽだったら】というif条件式を入れる 
 3)  ポイントB パスワードは一定の文字数以上で入力してもらう  
 4)  ポイントC 確認用のパスワードの値を一致させる  
 5)  ポイントD パスワードは入力中も見えないようにする  
2 さいごに      
PHPで会員登録フォームにエラーチェック機能を追加する
コードは次のとおり。
【test2.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>email<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>
                 
作成サクセイ講座コウザC
PHPとMySQLで登録トウロクきの確認カクニン画面ガメンツク
クワしい内容ナイヨウにつきましては以下イカのURL〜ごランになれます。
https://biz.addisteria.com/bbs_creation5/
   
目次  
1. 会員登録フォーム投稿後の確認画面を作成する  
1) ポイント@ セッション情報を設定する  
2) ポイントA パスワードをセキュアにする  
3) ポイントB MySQLに入力されたデータを登録する
4) ポイントB 入力された値を表示させる  
5) ポイントC 前のページに戻れる設定をする  
2. さいごに  
   
会員登録フォーム投稿後の確認画面を作成する
【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>email
    <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>
         
作成サクセイ講座コウザD
登録した情報を使ってログインする画面の作成サクセイ
クワしい内容ナイヨウにつきましては以下イカのURL〜ごランになれます。
https://biz.addisteria.com/bbs_creation5/
前回は、会員情報の登録画面を作りました。
今回は、登録した情報を使ってログインする画面を作ります。
目次
1. PHPでログイン画面を作る
1) ポイント@ MySQLのデータと今回の情報を照らし合わせる
2) ポイントA MySQLのデータと今回の情報を照らし合わせる
3) ポイントB 無事ログインできなかったときのエラーメッセージ表示
1. htmlでのエラーメッセージ表示設定
2. さいごに
PHPでログイン画面を作る
コードは次のとおり。
【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>email<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>
         
作成サクセイ講座コウザE
ログイン後の投稿画面作成サクセイ
クワしい内容ナイヨウにつきましては以下イカのURL〜ごランになれます。
https://biz.addisteria.com/bbs_creation6/#toc1
CSRF対策となるワンタイムトークンの設定方法や、投稿一覧画面作成サクセイ
目次
1. PHPで投稿画面を作る
1) ポイント@ ログイン状態をチェック
2) ポイントA CSRF対策のトークンを設定する
(1) セッションのトークン発行
(2) 今回送信するときのトークン発行
3). ポイントB MySQLに保存された投稿データ表示
2. さいごに
コードは次のとおり。
【test5.php】
<?php
session_start();
require('dbconnect.php');
// ★ポイント1★
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();
}
// ★ポイント2★
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();
    }
}
// ★ポイント3★
$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>
<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 endforeach; ?>
</body>
</html>
         
作成サクセイ講座コウザF
前回作成した投稿画面に、削除機能を追加ツイカする
クワしい内容ナイヨウにつきましては以下イカのURL〜ごランになれます。
https://biz.addisteria.com/bbs_creation7/
目次
1. PHPで投稿画面にログアウトと削除機能をつける
1) ポイント:削除機能をつける
2. さいごに
PHPで投稿画面にログアウトと削除機能をつける
前回解説したコードに、【ログアウト】と【削除】を加えました。
コードは次のとおり。
【test5.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>
ポイント:削除機能をつける
削除機能は、投稿内容を表示する【foreach】文の中に入れてあります。
<?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>
「もしセッションIDが、投稿者のIDと同じであれば」「削除をクリックできる」となっています。
実際に【削除】を押すと、test6.php に飛びます。
このファイルには、次のように記述しておきます。
【test6.php(削除実行用ファイル)】
 
<?php
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();
?>