ひとこと掲示板をデータベースで管理

ひとこと掲示板にて、利用者の過去発言内容をデータベースで管理するよう、
プログラムを作っていきます。

## ルール
１利用者が名前とコメントを入力し、発言できる。
２利用者の過去発言内容をデータベースで管理する。
全ての利用者の過去発言を一覧で見ることができ、「名前、コメント、
発言日時」の最低限3つを1行ずつ表示する。
利用者の名前は最大20文字以内とし、それ以上の場合はエラーメッセージを表示し、発言できないようにする。
利用者のコメントは最大100文字以内とし、それ以上の場合はエラーメッセージを表示し、発言できないようにする。
利用者の名前、コメントのどちらか又は両方が未入力だった場合、エラーメッセージを表示し、発言できないようにする。

##変数設定
```php

$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で接続をします。

```php
if($_SERVER['REQUEST_METHOD'] ==='POST') {
    if(isset($_POST['name']) === true) {
        $name = $_POST['name'];
    if(isset($_POST['comment']) === true) {
        $comment = $_POST['comment'];
  
```
データの送受信をPOSTを使うときに、その中の値をname,comment
にそれぞれ代入します。

```php
       $name = str_replace(array(" ", "　"), "", $name);
       $comment = str_replace(array(" ", "　"), "", $comment);
```
str_replace()で、空白を入力しただけのデータを送信することを
防いでくれます。

##エラーの条件を設定
```php
    
            if(mb_strlen($comment) >= 101) {
                $error[] = '１００文字以内にして下さい';
            }else if (empty ($comment) === true){
                $error[] = 'コメントを入力してください' . "\n";    
            }
            if(mb_strlen($name) >= 21) {
                $error[] = '２０文字以内にして下さい';
            }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.'\'と記述します。


```php
        $query = "INSERT INTO comment_table(name,comment,date) 
        VALUE('$name','$comment','$log')";

```

SQLの命令文をダブルクォーテーションでくくって、変数を
シングルクォーテーションでくくります。
こちらの記述の方がシンプルで見やすいですね。

##実行します

```php
mysqli_query($link, $query);
```

##過去の発言を見れるようにする

```php
　　//データベースに入った順番、名前、コメント日付を取得
    $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
<?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[] = '１００文字以内にして下さい';
            }else if (empty ($comment) === true){
                $error[] = 'コメントを入力してください' . "\n";    
            }
            if(mb_strlen($name) >= 21) {
                $error[] = '２０文字以内にして下さい';
            }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>
```