LoginSignup
20
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-03-13

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['user_name']);

スペースのみで送信できないように空白除去(スペースを除去)する。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クラスの概念を理解するのは難しいですね、、
また理解が進んだところで追記していきたいと思います。

20
7
3

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
20
7