ひとこと掲示板にて、利用者の過去発言内容をデータベースで管理するよう、
プログラムを作っていきます。
ルール
1利用者が名前とコメントを入力し、発言できる。
2利用者の過去発言内容をデータベースで管理する。
全ての利用者の過去発言を一覧で見ることができ、「名前、コメント、
発言日時」の最低限3つを1行ずつ表示する。
利用者の名前は最大20文字以内とし、それ以上の場合はエラーメッセージを表示し、発言できないようにする。
利用者のコメントは最大100文字以内とし、それ以上の場合はエラーメッセージを表示し、発言できないようにする。
利用者の名前、コメントのどちらか又は両方が未入力だった場合、エラーメッセージを表示し、発言できないようにする。
##変数設定
$name = ''; //名前
$comment = ''; //コメント
$log = date('Y/m/d H:i:s') . "\n"; //年日時
$error = []; //エラーメッセージ
$user_data = []; //ユーザーデータ
$host = ''; //IPアドレスまたはデータベースのホスト名
$username = ''; //ユーザー名
$passwd = ''; //パスワード
$dbname = ''; //データベース名
//データベースの情報を渡して接続する値を$linkに代入する
$link = mysqli_connect($host, $username, $passwd, $dbname);
mysqli_connect()でデータベースに必要なデータの塊のIDで接続をします。
if($_SERVER['REQUEST_METHOD'] ==='POST') {
if(isset($_POST['name']) === true) {
$name = $_POST['name'];
if(isset($_POST['comment']) === true) {
$comment = $_POST['comment'];
データの送受信をPOSTを使うときに、その中の値をname,comment
にそれぞれ代入します。
$name = str_replace(array(" ", " "), "", $name);
$comment = str_replace(array(" ", " "), "", $comment);
str_replace()で、空白を入力しただけのデータを送信することを
防いでくれます。
##エラーの条件を設定
if(mb_strlen($comment) >= 101) {
$error[] = '100文字以内にして下さい';
}else if (empty ($comment) === true){
$error[] = 'コメントを入力してください' . "\n";
}
if(mb_strlen($name) >= 21) {
$error[] = '20文字以内にして下さい';
}else if (empty($name) === true){
$error[] = 'お名前を入力してください' . "\n";
}
```php
mb_strlenで文字の長さを出します。strlenは半角英数字を1文字にしていますが、mb_strlenは全角の文字でも1文字としてくれるので使用しています。
##データベースに接続します
カラム名 name,comment,date
テーブル名 comment_table
```php
if($link) {
//接続するときに文字化け防止
mysqli_set_charset($link,'utf8');
//テキストに入力があったとき
if(trim($name) !== '' && trim($comment) !== '') {
//データベースの実行内容を$queryに代入する
$query = 'INSERT INTO comment_table(name,comment,date)
VALUE(\''.$name.'\',\''.$comment.'\',\''.$log.'\')';
文字列の中に変数を入れる場合''.$name.''と記述します。
$query = "INSERT INTO comment_table(name,comment,date)
VALUE('$name','$comment','$log')";
SQLの命令文をダブルクォーテーションでくくって、変数を
シングルクォーテーションでくくります。
こちらの記述の方がシンプルで見やすいですね。
##実行します
mysqli_query($link, $query);
##過去の発言を見れるようにする
//データベースに入った順番、名前、コメント日付を取得
$query = 'SELECT id,name,comment,date FROM comment_table';
//クエリ実行
$result = mysqli_query($link, $query);
//1行ずつ取得
while ($row = mysqli_fetch_array($result)) {
$user_data[] = $row;
}
```php
my_sqli_fetch_array()で取得したデータを1行を$rowに代入し、
それを$user_dataの配列として代入する
```php
mysqli_free_result($result);
mysqli_close($link);
}
} else {
echo 'DB接続失敗';
}
mysqli_free_result()でデータを保存したメモリを開放します。
#全コード
<?php
$name = '';
$comment = '';
$log = date('Y/m/d H:i:s') . "\n";
$error = [];
$user_data = [];
$host = '';
$username = '';
$passwd = '';
$dbname = '';
//データベースの情報を渡して接続する値を$linkに代入する
$link = mysqli_connect($host, $username, $passwd, $dbname);
/*変数が存在するかチェック*/
if($_SERVER['REQUEST_METHOD'] ==='POST') {
if(isset($_POST['name']) === true) {
$name = $_POST['name'];
if(isset($_POST['comment']) === true) {
$comment = $_POST['comment'];
$name = str_replace(array(" ", " "), "", $name);
$comment = str_replace(array(" ", " "), "", $comment);
/*エラーの条件*/
if(mb_strlen($comment) >= 101) {
$error[] = '100文字以内にして下さい';
}else if (empty ($comment) === true){
$error[] = 'コメントを入力してください' . "\n";
}
if(mb_strlen($name) >= 21) {
$error[] = '20文字以内にして下さい';
}else if (empty($name) === true){
$error[] = 'お名前を入力してください' . "\n";
}
}
}
}
if($link) {
mysqli_set_charset($link,'utf8');
if(trim($name) !== '' && trim($comment) !== '') {
$query = 'INSERT INTO comment_table(name,comment,date)
VALUE(\''.$name.'\',\''.$comment.'\',\''.$log.'\')';
//var_dump($query);
$result = mysqli_query($link, $query);
//var_dump($result);
$query = 'SELECT id,name,comment,date FROM comment_table';
$result = mysqli_query($link, $query);
//var_dump($result);
while ($row = mysqli_fetch_array($result)) {
$user_data[] = $row;
}
//var_dump($user_data);
mysqli_free_result($result);
mysqli_close($link);
}
} else {
echo 'DB接続失敗';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--エラーメッセージ-->
<p><?php foreach($error as $key => $string){
print htmlspecialchars($value['string'], ENT_QUOTES, 'UTF-8');$string;
} ?>
</p>
<form method="post" action="./16-11.php">
名前:<input type="text" name="name" value="">
コメント:<input type="text" name="comment" value="">
<input type="submit" value="送信">
</form>
<!--送信後の名前、コメント、時間-->
<p><?php if($name === '' || $comment === ''){
print '';
} else {
}
foreach ($user_data as $read){
print htmlspecialchars(($read['name'] . $read['comment'].
$read['date'].),ENT_QUOTES,'UTF-8')"<br>";
}
?>
</p>
</body>
</html>