PHPスクリプトのサンプル集PHPによるWebアプリケーションスーパーサンプル 第2版の特徴です。
本書の特徴 目次 デモ PHPとは 最初の1ページ ゲストブックを作成しよう DBスクリプト自動生成 wiki 【広告】PHPの頻出関数リファレンス「PHP辞典 第2版」 【広告】PHP入門書でありながらSmarty・PEARまで説明します「初めてのPHP & MySQL 第2版」
簡単なゲストブックの作成を通して、データベースを扱うWebアプリケーションの作成手順を見ていきましょう。データベースを準備して、メッセージを書き込み、表示させる手順を紹介します。
※このページは、PHPによるWebアプリケーションスーパーサンプル 第2版 「14-2 ゲストブックを作成する」から必要な部分のみを抜粋しています。それぞれの手順の解説は本書をご覧ください。
○完成したゲストブック
これから作成するゲストブックには2つの機能があります。メッセージの書き込みと表示です。これらは、ブラウザの書き込みフォームからメッセージを書き込むことと、蓄積されたメッセージを表示するという処理になります。
ゲストブックの作成は、データベースの準備とスクリプトの記述という手順で進めます。記述するスクリプトは次の4つの部品で構成されます。
○ゲストブックを構成する部品 部品1:メッセージ書き込みフォーム 部品2:データベース接続スクリプト 部品3:メッセージ書き込みスクリプト 部品4:メッセージ表示スクリプト
これらの要素は、「データベースの準備」に続けて紹介します。本書付録CD-ROMではguestbook1.txt〜guestbook4.txtという名前のテキストファイルに収めてあります。これらを参考にスクリプトを記述またはコピー&ペーストし、必要に応じて修正すると、ゲストブックが完成します。
ゲストブックへの書き込みデータを保存するデータベース「guestbook」に、テーブル「guestdata」を作成します。なおここでは、データベースにMySQLを使うことを想定しています。
○テーブル「guestdata」の構造
次のSQLコマンドを任意のファイル名(例:create.sql)で保存し、コマンドラインツールなどから実行します。また、ブラウザからMySQLを管理できるツールphpMyAdminでは、SQLコマンドをテキストエリアにペーストして実行できる機能があるので、そのようなツールを使う場合は、ファイルに保存しなくてもSQLコマンドを実行できます。
ファイルに記述されたSQLコマンドを実行してデータベースやテーブルを作成する方法は本書「第16章 各種設定」も参考にしてください。その章では、MySQLのインストール手順から説明していますが、ApacheやPHP、MySQLのインストールをまとめて完了させたい場合は、「XAMPP(一括インストールツール)」によるインストールをおすすめします。(このツールは本書CD-ROMには付属していませんので、リンク先からダウンロードしてください。)
[create.sql]
CREATE DATABASE guestbook; USE guestbook; CREATE TABLE guestdata ( id int(11) NOT NULL auto_increment, g_name varchar(50) NOT NULL , g_mail varchar(50), g_mes text NOT NULL, g_date datetime, PRIMARY KEY (id) );
このSQLコマンドをコマンドラインから実行する場合は、次のようにコマンドラインツールのmysqlにcreate.sqlを実行するオプションを指定して実行します。(下記コマンドでは便宜上、パスを省略して表記していますが、「"C:\Program Files\MySQL\MySQL Server 5.0\bin\mysql.exe" <オプション>」のようにパスを指定してmysql.exeを実行することもできます。)
mysql < C:\create.sql -u user1 -p Enter password: ********
このコマンドの「-u」、「-p」オプションはそれぞれユーザー名、パスワードを指定してデータベースにアクセスするためのオプションです。「-u user1 -p」は「user1」という名前のユーザーでパスワードを指定してデータベースにアクセスするという意味です。このオプションにより表示された「Enter password:」というメッセージに続けて、パスワードを入力してコマンドを実行します。
データベースの準備ができたら、メッセージを書き込むフォームを準備しましょう。まずPHPスクリプトが記述できるソフト(エディタでかまいません)を起動します。起動したエディタの新規ドキュメントに、次の「部品1」を貼り付けます。
ファイルに名前(例:guestbook.php)をつけてPHPスクリプトとして保存します。PHPスクリプトを実行可能なディレクトリに保存するように注意してください。 guestbook.phpにアクセスすると、次のように書き込みフォームが表示されます。
○書き込みフォーム
メッセージの書き込みフォームが無事ブラウザに表示できたら、メッセージの書き込みスクリプトを追加します。このメッセージ書き込み処理はデータベースへの接続(部品2)とデータの書き込み(部品3)で構成されています。 まず、部品2(データベースへの接続)を追加します。作成中のゲストブックスクリプトにある目印「部品2から部品4 ここから↓」と「部品2から部品4 ここまで↑」の間に貼り付けます。
[部品2:データベース接続スクリプト] <!-- 部品2:データベースへの接続 --> <?php // 接続設定(サーバ/データベース/ユーザ/パスワード) $sv = "localhost"; $dbname = "guestbook"; $user = "root"; $pass = "********"; // データベースに接続する $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die("接続エラー"); ?>
このコード内の、サーバー/データベース/ユーザー/パスワードは自分の設定に合わせて変更してください。とくにデータベースにログインできるユーザー名($user)とパスワード($pass)は、ご利用の環境に合わせて変更しないと、そのままでは動作しません。
続けて、部品3(メッセージ書き込みスクリプト)を追加します。作成中のゲストブックスクリプトに配置した部品2の下に貼り付けます。
[部品3:書き込みスクリプト] <!-- 部品3:メッセージ書き込みスクリプト --> <?php // POSTメソッドで送信された場合は書き込み処理を実行する if ($_SERVER["REQUEST_METHOD"] == "POST") { // フォームからデータを受け取る $g_name = cnv_dbstr($_POST["g_name"]); $g_mail = cnv_dbstr($_POST["g_mail"]); $g_mes = cnv_dbstr($_POST["g_mes"]); // 名前とメッセージが入力されていればデータの追加を実行する if (!empty($g_name) and !empty($g_mes)) { // データを追加する $sql = "INSERT INTO guestdata(g_name, g_mail, g_mes, g_date) "; $sql .= "VALUES("; $sql .= "'" . $g_name . "',"; $sql .= "'" . $g_mail . "',"; $sql .= "'" . $g_mes . "',"; $sql .= "'" . date("Y/m/d H:i:s") . "'"; $sql .= ")"; $res = mysql_query($sql, $conn) or die("データ追加エラー"); if ($res) { echo "<p>書き込みありがとうございました</p>"; } } // 名前やメッセージが空白の場合はエラーメッセージを出力する else { echo "<p><b>お名前とメッセージを入力してください</b></p>"; } } // SQLコマンド用の文字列に変換する関数 function cnv_dbstr($string) { // タグを無効にする $string = htmlspecialchars($string); // magic_quotes_gpcがONの場合はエスケープを解除する if (get_magic_quotes_gpc()) { $string = stripslashes($string); } // SQLコマンド用の文字列にエスケープする $string = mysql_real_escape_string($string); return $string; } ?>
メッセージ書き込み部分の処理は、フォームへの入力データを受け取り、受け取ったデータをデータベースに追加するという流れになります。
部品3まででメッセージの書き込みが可能となります。エラーが発生せず、メッセージ書き込みまでうまくできたら、最後にデータを表示する部分を追加しましょう。作成中のゲストブックにある部品3の下に追加してください。
[部品4:表示スクリプト] <!-- 部品4:メッセージ表示スクリプト --> <?php // SELECTコマンドを実行してデータを取得する $sql = "SELECT * FROM guestdata ORDER BY id DESC"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); // 取得したデータを1件ずつ表示する while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<hr>"; if (!is_null($row["g_mail"])) { echo "<a href=\"mailto:" . $row["g_mail"] . "\">" . $row["g_name"] . "</a>"; } else { echo $row["g_name"]; } echo "(" . date("Y/m/d H:i", strtotime($row["g_date"])) . ")"; echo "<p>" . nl2br($row["g_mes"]) . "</p>"; } ?>
メッセージを表示するには、guestdataテーブルからデータを取得して、取得したデータを1行ずつ表示していくという流れになります。
ページは表示できるのに、書き込んだメッセージがうまく表示されない場合は、文字コードの問題が考えられます。スクリプトの文字コード、Apacheのデフォルト文字コード、MySQLの文字コードが原因と成り得ます。
このサンプルコードでは必要な処理コードを単純に見せるため、文字コードを変換する処理を省略しているので、例えば、スクリプトの文字コードとデータベースの文字コードが異なると、上手くデータを表示できないことも考えられます。この場合、データを表示するときにmb_convert_encoding関数で文字コードを変換する方法や、スクリプトの文字コードとデータベース、Apacheのデフォルト文字コードを同じ文字コード(例:「EUC-JP」)に統一するという方法があります。
ここまでの手順で、メッセージを書き込み、書き込まれたメッセージを表示するゲストブックが完成しました。ゲストブックにアクセスして、データが書き込まれるか表示されるかを確認しましょう。 これまでの手順で作成したスクリプトは「完成したゲストブック」(guestbook.php)になります。うまく動作しないときにはこちらと見比べてください。
[完成したゲストブック] <!-- 部品1:書き込みフォーム --> <html> <head> <title>ゲストブック</title> </head> <body> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table border="1"> <tr> <td>お名前</td> <td><input type="text" name="g_name" size="30"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="g_mail" size="30"></td> </tr> <tr> <td>メッセージ</td> <td> <textarea rows="5" cols="30" name="g_mes"></textarea> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="書き込む"> </td> </tr> </table> </form> <!-- 部品2から部品4 ここから↓ --> <!-- 部品2:データベースへの接続 --> <?php // 接続設定(サーバ/データベース/ユーザ/パスワード) $sv = "localhost"; $dbname = "guestbook"; $user = "root"; $pass = "********"; // データベースに接続する $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die("接続エラー"); ?> <!-- 部品3:メッセージ書き込みスクリプト --> <?php // POSTメソッドで送信された場合は書き込み処理を実行する if ($_SERVER["REQUEST_METHOD"] == "POST") { // フォームからデータを受け取る $g_name = cnv_dbstr($_POST["g_name"]); $g_mail = cnv_dbstr($_POST["g_mail"]); $g_mes = cnv_dbstr($_POST["g_mes"]); // 名前とメッセージが入力されていればデータの追加を実行する if (!empty($g_name) and !empty($g_mes)) { // データを追加する $sql = "INSERT INTO guestdata(g_name, g_mail, g_mes, g_date) "; $sql .= "VALUES("; $sql .= "'" . $g_name . "',"; $sql .= "'" . $g_mail . "',"; $sql .= "'" . $g_mes . "',"; $sql .= "'" . date("Y/m/d H:i:s") . "'"; $sql .= ")"; $res = mysql_query($sql, $conn) or die("データ追加エラー"); if ($res) { echo "<p>書き込みありがとうございました</p>"; } } // 名前やメッセージが空白の場合はエラーメッセージを出力する else { echo "<p><b>お名前とメッセージを入力してください</b></p>"; } } // SQLコマンド用の文字列に変換する関数 function cnv_dbstr($string) { // タグを無効にする $string = htmlspecialchars($string); // magic_quotes_gpcがONの場合はエスケープを解除する if (get_magic_quotes_gpc()) { $string = stripslashes($string); } // SQLコマンド用の文字列にエスケープする $string = mysql_real_escape_string($string); return $string; } ?> <!-- 部品4:メッセージ表示スクリプト --> <?php // SELECTコマンドを実行してデータを取得する $sql = "SELECT * FROM guestdata ORDER BY id DESC"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); // 取得したデータを1件ずつ表示する while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<hr>"; if (!is_null($row["g_mail"])) { echo "<a href=\"mailto:" . $row["g_mail"] . "\">" . $row["g_name"] . "</a>"; } else { echo $row["g_name"]; } echo "(" . date("Y/m/d H:i", strtotime($row["g_date"])) . ")"; echo "<p>" . nl2br($row["g_mes"]) . "</p>"; } ?> <!-- 部品2から部品4 ここまで↑ --> </body> </html>
このページは、PHPによるWebアプリケーションスーパーサンプル 第2版 より抜粋しました。本書では、各手順の解説もしています。また、MySQL以外のデータベースの処理や、ゲストブック以外のサンプルも多く紹介しています。ぜひ参考にしてください。(本書の内容はこちらです。)
PHPによるWebアプリケーションスーパーサンプル 第2版
制作:西沢直木