PHPとMySQLで簡単な提示板を作る

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

##要件
・投稿者名(名前）、投稿コメント(ひとこと)、投稿日時をデータベースで管理し、表示する。
・名前やひとことが未入力で送信ボタンが押された時はエラーメッセージを表示する。
 (スペースのみの場合もエラーを表示する）
・名前は20文字以内、ひとことは100文字以内それを超える場合はエラーメッセージを表示する。

##完成図
![スクリーンショット 2018-03-13 19.19.47.png](https://qiita-image-store.s3.amazonaws.com/0/239041/e38a2dba-3b89-5289-9a51-1b69dfaa7646.png)


##ソースコード
###php
```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について](http://wepicks.net/phpref-server/)

#####iseet()
変数がnullでないことを調べる

#####str_replace(array(" ", "　"), "", $_POST['user_name']);
スペースのみで送信できないように空白除去(スペースを除去)する。str_replace()を使う。
[空白除去について](http://ysklog.net/php/2997.html)

###PHP続き　データベースに接続する
```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を指定する](https://qiita.com/hiro_y/items/6fabdef669e35e92bdc4)


###HTML
```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クラスの概念を理解するのは難しいですね、、
また理解が進んだところで追記していきたいと思います。