ポンクソフト

5Wゲーム - PHPとPostgreSQLの連携入門

前ページ PHPとPostgreSQLの連携入門 TOP 次ページ

目次

  1. PHPとPostgreSQLの連携入門
  2. 掲示板1
  3. 掲示板2
  4. 5Wゲーム
  5. 販売管理システム
  6. 画像アップロード掲示板
  7. ショッピングカート

5Wゲーム

ちょっと小休憩、ということで5Wゲームを作ります。5Wゲームとは「いつ(when)」「どこで(where)」「誰が(which1)」「誰と(which2)」「何をした(what)」という文章をランダムに表示するものです。

テーブルの作成

以下のようなテーブルを「pg5w」という名前で作成してください。
列名データ型説明
acttextアクション
valtext
psqlを使う場合は、以下のように入力します(# はプロンプト)。
# create table pg5w(act text, val text);
act には動作(when, where, which1, which2, what のいずれかの文字列)が入り、val にはそれに対応する値が入ります。

プログラムの作成

以下のソースを入力してください。但し
dbname=postgres user=postgres password=postgres
上記の部分は、テーブルを作成したDB名、ユーザ名、パスワードに変更してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>5W</title>
</head>
<body>
<?php
$w = array(
  array("いつ?", "", "when", "今日"),
  array("どこで?", "で", "where", "学校"),
  array("だれが?", "が", "which1", "僕"),
  array("だれと?", "と", "which2", "君"),
  array("何をした?", "をした。", "what", "屁")
);
foreach ($w as $i) {
  print "<form method='post' action='pg5w.php'>";
  print "{$i[0]}<input type='text' size='50' name='val'>{$i[1]}";
  print "<input type='hidden' size='50' name='act' value='{$i[2]}'>";
  print " <input type='submit' value='追加'>";
  print "</form>\n";
}
$con = pg_connect("dbname=postgres user=postgres password=postgres");
if ($_POST['val']) {
  $act = pg_escape_string(htmlspecialchars($_POST['act']));
  $val = pg_escape_string(htmlspecialchars($_POST['val']));
  $rs = pg_query($con, "select * from pg5w where act='$act' and val='$val'");
  if (pg_num_rows($rs) > 0) print "その値は既に追加されています。<br><br>";
  else pg_query($con, "insert into pg5w values('$act','$val')");
}
foreach ($w as $i) {
  $rs = pg_query($con, "select val from pg5w where act='{$i[2]}'");
  $num = pg_num_rows($rs);
  if ($num == 0) $v = $i[3];
  else $v = pg_fetch_result($rs, rand(0, $num - 1), 0);
  print $v . $i[1];
}
?>
</body>
</html>
入力が終わったら「pg5w.php」というファイル名で保存、サーバにアップロードし、実行してみてください。

ソースの解説

$w = array(
  array("いつ?", "", "when", "今日"),
  array("どこで?", "で", "where", "学校"),
  array("だれが?", "が", "which1", "僕"),
  array("だれと?", "と", "which2", "君"),
  array("何をした?", "をした。", "what", "屁")
);
$w は2次元配列になっており、それぞれの要素の最初の要素がテキストフィールドに表示するラベル、2番目の要素が値に付く助詞、3番目の要素がテキストフィールドの名前・テーブルの act 列のアクション、4番目の要素が値が無いときに表示されるデフォルト値です。
foreach ($w as $i) {
  print "<form method='post' action='pg5w.php'>";
  print "{$i[0]}<input type='text' size='50' name='val'>{$i[1]}";
  print "<input type='hidden' size='50' name='act' value='{$i[2]}'>";
  print " <input type='submit' value='追加'>";
  print "</form>\n";
}
配列 $w を利用してテキストフィールドを5個表示しています。act 列に入るアクションは隠しフィールドで持っています。
if ($_POST['val']) {
  $act = pg_escape_string(htmlspecialchars($_POST['act']));
  $val = pg_escape_string(htmlspecialchars($_POST['val']));
  $rs = pg_query($con, "select * from pg5w where act='$act' and val='$val'");
  if (pg_num_rows($rs) > 0) print "その値は既に追加されています。<br><br>";
  else pg_query($con, "insert into pg5w values('$act','$val')");
}
追加ボタンが押されたとき、テーブルにレコードを追加している部分です。隠しフィールドから渡されたアクションとテキストフィールドから渡された値をインサートしますが、同じレコードが既に存在する場合はエラーを表示して追加しません。
foreach ($w as $i) {
  $rs = pg_query($con, "select val from pg5w where act='{$i[2]}'");
  $num = pg_num_rows($rs);
  if ($num == 0) $v = $i[3];
  else $v = pg_fetch_result($rs, rand(0, $num - 1), 0);
  print $v . $i[1];
}
テーブルからランダムで取得した値を元に文章を表示している部分です。まず最初に同じアクションの行を select 文で取得し、pg_num_row 関数で取得した行数を $num に格納します。行数が 0 ならば配列 $w のデフォルト値を表示し、行数が 1 以上ならその中から rand 関数でランダムに 1 行取得し val 列の値を表示しています。
前ページ PHPとPostgreSQLの連携入門 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0