Edited at

$_POSTとMySQLを使って簡単な提示板を作る

More than 1 year has passed since last update.


PHP初心者が簡単な提示板を作ってみた

PHPを始めて2週間の僕が試行錯誤しながら簡単な提示板を作ったので、そのメモを残しておきます。まだ概念があやふやなので間違いが多々あると思います。


要件

・投稿者名(名前)、投稿コメント(ひとこと)、投稿日時をデータベースで管理し、表示する。

・名前やひとことが未入力で送信ボタンが押された時はエラーメッセージを表示する。

(スペースのみの場合もエラーを表示する)

・名前は20文字以内、ひとことは100文字以内それを超える場合はエラーメッセージを表示する。


完成図

スクリーンショット 2018-03-13 19.19.47.png


ソースコード


php

<?php

//最初に変数の初期化
$user_name = ''; //投稿者名
$comment = ''; //投稿コメント
$error = array(); //エラーメッセージは配列$errorに入れる
$data = ""; //名前,ひとこと、日時をここに入れる
$host = 'localhost';
$username = 'mysqlユーザー名';
$password = 'パスワード';
$dbname = 'データベース名';
$charset = 'utf8';

//エラー処理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
//空白除去
if (isset($_POST['user_name']) === TRUE) {
$user_name = str_replace(array(" ", " "), "", $_POST['user_name']);
}
if (isset($_POST['comment']) === TRUE) {
$comment = str_replace(array(" ", " "), "", $_POST['comment']);
}
//エラーメッセージは配列$errorに入れる
if ($user_name === '') {
$error[] = '名前を入力してください';
}
//mb_strlen()で文字数カウント
else if (mb_strlen($user_name) > 20) {
$error[] = '名前は20文字以内で入力してください';
}

if ($comment === '') {
$error[] = 'ひとことを入力してください';
}
else if (mb_strlen($comment) > 100) {
$error[] = 'ひとことは100文字以内で入力してください';
}
}


$_SERVER['REQUEST_METHOD'] === 'POST'

ページのアクセスする際のリクエストメソッドがPOSTだった時

$_SERVERについて


iseet()

変数がnullでないことを調べる


str_replace(array(" ", " "), "", $POST['username']);

スペースのみで送信できないように空白除去(スペースを除去)する。str_replace()を使う。

空白除去について


PHP続き データベースに接続する

//PDO_MYSQL データソース名

$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset;
$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//エラーが0個かつ送信ボタンが押された時に以下の処理を実行
if (count($error) === 0 && isset($_POST['submit'])) {
//投稿情報をデータベースに入力
try {
//投稿日時を$datetimeに挿入
$datetime = date("Y-m-d H:i:s");
//sql文
$sql ='insert into `post`(`user_name`, `user_comment`, `create_datetime`) values (?,?,?)';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $user_name, PDO::PARAM_STR);
$stmt->bindValue(2, $comment, PDO::PARAM_STR);
$stmt->bindValue(3, $datetime, PDO::PARAM_STR);
$stmt->execute();
} catch (PDOException $e) {
echo '接続できませんでした。理由:'.$e->getMessage();
}
}
//投稿情報をデータベースから出力
try{
$sql ='select user_name,user_comment,create_datetime from post';
$stmt = $dbh->prepare($sql);
$stmt->execute(null);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$data .= "<p>".$row['create_datetime']." ".$row['user_name']." ".$row['user_comment']."</p>";
}
} catch(PDOException $e) {
echo '接続できませんでした。理由:'.$e->getMessage();
}
?>

データベースとの接続、入力、処理をおこないます。今回はMySQLデータベース内にあるpostというテーブルを使います。


new PDO(データソース名,ユーザー名,パスワード,接続オプション)


PDO::MYSQL_ATTR_INIT_COMMAND

接続する時のオプションを設定する。今回は文字コードをutf8にする。

MySQLとPDOの組み合わせでcharsetを指定する


HTML

<!DOCTYPE html>

<html lang="ja">
<head>
<meta charset ="UTF-8">
<title>ひとこと提示版</title>
</head>
<body>
<h1>ひとこと提示版</h1>
//エラーがある時にメッセージを表示
<?php if(count($error) > 0) { ?>
<?php foreach ($error as $value) { ?>
<?php echo "<p>".$value."</p>" ?>
<?php } } ?>
<form method ="post">
名前:<input type ="text" name ="user_name" size ="15">
ひとこと:<input type ="text" name ="comment" size ="45">
<input type ="submit" name ="submit" value ="送信">
</form>
<?php echo $data; ?>
</body>
</html>


感想

書くだけなら簡単ですがPDOクラスの概念を理解するのは難しいですね、、

また理解が進んだところで追記していきたいと思います。