1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-18

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

ルール

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>
1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?