前回、こちらにてデータベース設計を行いました。次は今、制作しているBaseballサークルサイトの掲示板を作成していきましょう。
まずは、ナビゲーションのプログラムを修正していきます。「#」としていましたが、bbs.phpと修正します。bbsはちなみに前回のデータベースで作成したときにつけたたテーブルの名前でしたね。
navbar.php
そしてindex.phpファイルをコピーしてbbs.phpを作っていきたいと思います。
bbs.phpファイルには本文を下記のように作成しましょう。
<h1>掲示板</h1> <form action=”write.php” method=”post”> <div class=”form-group”> <label>タイトル</label> <input type=”text” name=”title” class=”form-control” > </div> <div class=”form-group”> <label>名前</label> <input type=”text” name=”name” class=”form-control”> </div> <br> <div class=”form-group”> <textarea name=”body” class=”form-control” rows=”5″></textarea> </div> <div class=”form-group”> <label>削除パスワード(数字4桁)</label> <input type=”text” name=”pass” class=”form-control”> </div> <br> <input type=”submit” class=”btn btn-dark” value=”書き込む”> </form> | <form action=”write.php” method=”post”>はフォームに書かれたデータの送信先はwrite.phpへpost形式で送信するとの内容です。 bootstrapのデザインを反映させるため各classを指定しています。 |
アドレスにhttp://localhost/baseball/bbs.phpと入力。実装結果は以下の通りです。
データベースへの書き込み
フォームで書かれたデータを受け取ってデータベースへ登録するwrite.phpを作っていきましょう。
bbs.php「データの送信」→write.php「データの受信」→必須項目の入力チェック→➀不備であればbbs.phpファイルへ。⓶OKであればデータベースに接続→レコード(行)に追加
write.php
<?php $name = $_POST[‘name’]; $title = $_POST[‘title’]; $body = $_POST[‘body’]; $body = $_POST[‘pass’]; | それぞれに変数を付けてデータを受け取るようにします |
if($name == ” || $body == ”){ header(“location: bbs.php”); exit(); } | 名前と本文は必須項目にしたため、それらが空になっていないか調べ、いずれかが空の場合、bbs.phpに戻る。header関数はHTTPヘッダを送信します。HTTPヘッダとは例えば送信するデータ容量などHTML以外の情報のことです。中でもLocationヘッダは「URLを指摘し他のページへのジャンプを指示する情報」です。 |
if(!preg_match(“/^[0-9]{4}$/”, $pass)){ header(“location: bbs.php”); exit(); } | 削除パスワードの書式チェック。 削除パスワードは数字4桁で必須項目としてます。preg_matchは文字列が指定の形式にあっているかをチェックします。第一引数に指定したパターンを、第二引数に指定した文字列が合ってればTRUEを返します。今回は0~9の数字で4桁で$/で末尾を表します。 「!」がついているので否定の意味となり、「指定したパターンに合っていなければ、bbs.phpに移動する」という処理になっています。 |
$dsn = ‘mysql:host=localhost;dbname=baseball;charset=utf8’; $user = ‘baseballuser’; $password = ‘ここにはパスワードを ‘; | 「データベースに接続」 この部分では、DSNとユーザー名、パスワードを設定しています。DSNとはData Source Nameの略。どのサーバーのどのデータベースを使うのか指定します。 書式は「mysql:host=ホスト名;dbname=DB名;charset=文字コード」 |
try{ | try-catchは例外処理のための構文。 tryの中に入っている処理は、データベース(DB)に接続して命令(クエリ)を実行する部分です。 |
$db = new PDO($dsn ,$user,$password ); $db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); | PDO(php Data Object)とはDBMS(DB管理システム)を簡単に利用できるようにするPHP拡張機能。 PDOは様々な異なるDBMS(例えばOracleやSQLiteなど)に対して同じ処理ができるようにします。 new演算子を使ってPDOクラスのインスタンスを作成します。その時引数にDSN、ユーザー名、パスワードを必要とし変数dbに代入。 アロー関数(->)によりsetAttributeメソッドを使い、プリペアードステートメントを使う際に、セキュリティを高めるための設定をしてます。 |
$stmt = $db->prepare(“ | プリペアードステートメントとは、実行したいクエリのテンプレートのようなものです。 prepareメソッドでは、文を実行する準備を行い、文を返します。 |
INSERT INTO bbs (name, title, body, date, pass) VALUES (:name, :title, :body, now(), :pass)” ); | INSERT文はテーブルに新しいレコードを追加します。テーブル名を書き、カッコ内にはデータを入れたいカラム(列)を書きます。 VALUESの後には各カラムに対応する値を書きます |
$stmt->bindparam(‘:name’, $name, PDO::PARAM_STR); $stmt->bindparam(‘:title’, $title, PDO::PARAM_STR); $stmt->bindparam(‘:body’, $body, PDO::PARAM_STR); $stmt->bindparam(‘:pass’, $pass, PDO::PARAM_STR); | bindparamメソッドで後から値を埋め込みます。 |
$stmt->execute(); header(‘Location: bbs.php’); exit(); } catch (PDOException $e){ exit(‘エラー:’ . $e->getMessage()); } ?> | クエリを実行しているのはexecute()です。プリペアードステートメントでクエリを組み立ててexecute()で実行します。 クエリ実行が終わったら、header関数を使いbbs.phpへ戻ります。 catch (PDOException $e){~ではPDOExceptionという種類の例外が発生したときのみ、catch内の処理を実行します。PDOExceptionは$eという変数に代入され、$e->getMessage()でエラーメッセージが取得できます。exitに引数としてエラーメッセージを指定すると、それを表示してプログラムを終了することができます。 |