ゲストブック - データベースに値を挿入

フォームに入力されたメッセージをデータベースに追加する

  • INSERT文を組み立てて実行する
  • 追加画面→追加確認画面→追加完了画面
  • 追加完了画面でINSERT文を実行するには、入力フォームに入力されたメッセージを$_POSTや$_SESSIOを経由して受け渡し、その値をもとにINSERT文を組み立てます
INSERT文を実行する
  • PDOでデータベースに接続し、SQLを実行する

PDO

  • PHP Data Object
  • データベースでの実行は、「データベースに接続」して「データベースを捜査する許可を得る」必要があります
  • そのために「PDO」という命令を使って、「ユーザー名」と「パスワード」を設定します
  • 通常のオブジェクトと同様、このオブジェクトの中には「データベースへの接続」や「SQLの実行」「実行結果の取得」などデータベースを使ったアプリケーション開発に必要な命令がそろっています
データベースに接続
  • データベースサーバー:MySQL
  • サーバーコンピューター:localhost(自分のコンピューター)
  • 使用するデータベース名:guestbook
  • ユーザー名:root
  • パスワード:root
  1. 情報を指定してユーザー認証(使用許可を得る)
  2. 認証変数を使ってデータベースを操作できるようになる
$conn = new PDO('mysql:dbname=guestbook; host=localhost', root, root);
  • 「$conn」は、任意のオブジェクト名で、使用許可をまとめた「目印」の役割をします
  • PDOを値を変数化して代入する例もあります
  • 「$conn」を通してPDOの命令を呼び出すときには、以下のように記述します
$conn->prepare($sql)
  • prepareメソッドを実行するという意味
SQLの実行
  • 1つの処理に「prepareメソッド」と「executeメソッド」の2つの命令を使います
  • 「prepareメソッド」でSQL文を準備して
  • 「executeメソッド」で実行する

NOW()

  • MySQLのNOW関数で、INSERT文が実行された時点の時刻をmessageテーブルに追加します
SQLの実行の流れ
  1. 各列の値を取得:$m_name、$m_mail、$m_message
  2. SQLの組み立て:$sqlにINSERT文を作成
  3. SQLの準備:prepareメソッドを使う
  4. SQLのパラメータを変数値に置換:bindParamメソッドを使う
  5. SQLの実行:executeメソッドを使う

データベースに値を挿入

《submit.php

<?php
  // セッションの開始
  session_start();
  if (empty($_SESSION)) {exit;}

  // 接続設定
  $user = 'root';
  $pass = '';

  // データベースに接続
  $dsn = 'mysql:host=localhost;dbname=guestbook;charset=utf8';
  $conn = new PDO($dsn, $user, $pass);
  
  // 入力内容の取得($_SESSIONから)
  $m_name = htmlspecialchars($_SESSION['m_name'], ENT_QUOTES, 'UTF-8');
  $m_mail = htmlspecialchars($_SESSION['m_mail'], ENT_QUOTES, 'UTF-8');
  $m_message = htmlspecialchars($_SESSION['m_message'], ENT_QUOTES, 'UTF-8');

  // データの追加
  $sql = 'INSERT INTO message(m_name, m_mail, m_message, m_dt)
              VALUES(:m_name, :m_mail, :m_message, NOW())';
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(':m_name', $m_name);
  $stmt->bindParam(':m_mail', $m_mail);
  $stmt->bindParam(':m_message', $m_message);
  $stmt->execute();

// エラーチェック
  $error = $stmt->errorInfo();
  if ($error[0] != '00000') {
    $message = 'データの追加に失敗しました。' . $error[2];
  } else {
    $message = 'データを追加しました。データ番号:' . $conn->lastInsertId();
  }

// セッションデータの破棄
  $_SESSION = array();
  session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ゲストブック</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<p>追加完了画面</p>
<table>
<tr>
<th>名前</th>
<td><?php echo $m_name; ?></td>
</tr>
<tr>
<th>メールアドレス</th>
<td><?php echo $m_mail; ?></td>
</tr>
<tr>
<th>メッセージ</th>
<td><?php echo nl2br($m_message); ?></td>
</tr>
</table>
<p><a href="index.php">トップページへ</a></p>
</body>
</html>