はじめてのプログラム ~ 簡単な掲示板の作成

今回は簡単な "掲示板" というより「コメント入力欄」の作成を通して、PHP によるプログラミングに親しんでみましょう。

「コメント入力欄」とは、一般的なブログ等にしばしば付いている、「コメント入力機能」のことです。ブログなどのコメント を、みなさん一度は書き込んだことがあると思いますが、あれです。

何回かに分けて、ある程度の機能を完成させたいと思っていますが、今回はごく基本的な機能のみを実装します。

テーブルはひとつだけ。次のような中身(スキーマ)とします。

CREATE TABLE `oyamafam_bbs1`.`comments` (
  `cid`          INTEGER     UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `aid`          INTEGER     UNSIGNED NOT NULL,
  `logdate`      DATETIME             NOT NULL,
  `ip`           CHAR(16)    CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `name`         VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL,
  `url`          VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL,
  `subject`      VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL,
  `body`         TEXT        CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL
);

さっそくコードですが、実は今回は後でいろいろな場所から呼び出すことを想定して作りたかったので、当初の予定以上に複雑 になってしま いました。まぁ "複雑" といっても大したことは無いのですが、いくつか、単なる掲示板なら要らないようなフラグが追加されています。その点に注意してください。

<?php

  ///////////////////////////////////////////////////////////////////////////
  //
  // Parameters Definitions
  //

  // Database Parameters
  $mysql_host = 'your hostname here';
  $mysql_user = 'your username here';
  $mysql_pass = 'your password here';
  $mysql_db   = 'your database here';
  // BBS parameters
  $article_id = 0;
  $comment_id = 0;
  $dataOnly   = false;
  $formOnly   = false;
  $noHeader   = false;

  ///////////////////////////////////////////////////////////////////////////
  //
  // Get Parameters
  //

  // GET
  if ( isset($_GET['aid']) ) {
    $article_id = (int)$_GET['aid'];
  }
  if ( isset($_GET['cid']) ) {
    $comment_id = (int)$_GET['cid'];
  }
  if ( isset($_GET['dataonly']) && $_GET['dataonly'] == 'true' ) {
    $dataOnly = true;
  }
  if ( isset($_GET['formonly']) && $_GET['formonly'] == 'true' ) {
    $formOnly = true;
    if ( $dataOnly ) {
      $dataOnly = false;
    }
  }
  if ( $dataOnly
      || $formOnly
      || (isset($_GET['noheader']) && $_GET['noheader'] == 'true') ) {
    $noHeader = true;
  }

  // POST
  if ( isset($_POST['aid']) ) {
    $article_id = (int)$_POST['aid'];
  }

  ///////////////////////////////////////////////////////////////////////////
  //
  // Save Data
  // cmd という名前の POST パラメータが write という値を持っていたら DB に書き込む
  //

  if ( isset($_POST['cmd']) && $_POST['cmd'] == 'write' ) {

    $link = mysql_connect( $mysql_host, $mysql_user, $mysql_pass )
      or die('Could not connect: ' . mysql_error());
    mysql_select_db( $mysql_db )
      or die('Could not select database');

    $query = sprintf (
      "INSERT INTO comments (aid,logdate,ip,name,url,subject,body) VALUES(%d,'%s','%s','%s','%s','%s','%s')",
      $article_id,
      date("Y/m/d H:i:s"),
      quote_smart($_REQUEST['IpAddress']),
      quote_smart($_POST['name']),
      quote_smart($_POST['url']),
      quote_smart($_POST['subject']),
      quote_smart($_POST['body'])
    );

    $result = mysql_query($query) or die('Query failed: ' . mysql_error());
    mysql_close($link);
  }

  ///////////////////////////////////////////////////////////////////////////
  //
  // HTML Header
  // HTML のヘッダー部分+<body>タグの書き出し。

  if ( !$noHeader ) {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?php
  } // end of !$noHeader

  ///////////////////////////////////////////////////////////////////////////
  //
  // Comment Table
  //

  if ( !$formOnly ) {

    $link = mysql_connect( $mysql_host, $mysql_user, $mysql_pass )
      or die('Could not connect: ' . mysql_error());
    mysql_select_db($mysql_db)
      or die('Could not select database');

    $query = "";
    if ( $comment_id == 0 ) { // if comment_id is zero, show entire comment table.
      $query = sprintf(
        "SELECT logdate, name, subject, body FROM comments WHERE aid=%d ORDER BY logdate ASC",
        $article_id );
    }
    else { // if comment_id is set, show the specified comment only.
      $query = sprintf(
        "SELECT logdate, name, subject, body FROM comments WHERE cid=%d",
        $comment_id );
    }

    $result = mysql_query($query)
      or die('Query failed: ' . mysql_error());

    echo "<table border='1' cellpadding='0' cellspacing='0'>\n";
    while ( $line = mysql_fetch_array($result, MYSQLI_ASSOC)) {
      echo "<tr><td valign='top' rowspan='2'>";
      echo $line['name'];
      echo "<br><small>[";
      echo $line['logdate'];
      echo "]</small></td><td>";
      echo $line['subject'];
      echo "&nbsp;</td></tr>\n<tr><td>";
      echo nl2br($line['body']);
      echo "&nbsp;</td></tr>\n";
    }
    echo "</table>\n";
    mysql_free_result($result);
    mysql_close($link);

  }

  ///////////////////////////////////////////////////////////////////////////
  //
  // Comment Input Form
  //

  if (!$dataOnly) {
    echo  "<form action='bbs1.php' method='post'>\n";
    echo  "<input type='hidden' name='cmd' value='write'>\n";
    echo  "<input type='hidden' name='aid' value='$article_id'>\n";
    echo<<<END_OF_INPUT_TABLE
    <table width='1'>
    <tr><td>名前:</td>< td><input type='text' name='name'></td></tr>
    <tr><td>URL:</td><td><input type='text' name='url'></td></tr>
    <tr><td>タイトル:</td>< td><input type='text' name='subject'></td></tr>
    <tr><td valign='top'>コメント:</td><td>< textarea name='body' rows='5' cols='30'></textarea><td></tr>
    <tr><td colspan='2' align='right'><input type='submit' value='OK'></td></tr>
    </table>
END_OF_INPUT_TABLE;
    echo  "</form>\n";
  }

  ///////////////////////////////////////////////////////////////////////////
  //
  // HTML Footer
  //
  if ( !$noHeader ) {
?>
</body>
</html>
<?php
  } // end of !$noHeader


  ///////////////////////////////////////////////////////////////////////////
  //
  // Helper Functions
  //
 
  function quote_smart($value) {

    // Stripslashes
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    // Quote if not integer
    if (!is_numeric($value)) {
        $value = mysql_real_escape_string($value);
    }
    return htmlentities( $value, ENT_QUOTES, "UTF-8" );
  }
?>

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説