はじめてのプログラム ~ 簡単な掲示板の作成
今回は簡単な "掲示板" というより「コメント入力欄」の作成を通して、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
" </td></tr>\n<tr><td>";
echo
nl2br($line['body']);
echo
" </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" );
}
?>