こんにちは、キャスレーコンサルティングID(インテグレーション&デザイン)部の金長です。

今回は、PHPの学習がてらにPHP、MySQLを使った簡単なチャットを作成してみました。

目次

・動作環境
・フォーム作成
・チャット機能作成
・終わりに

動作環境

PHP(7.2.5)
Apache(2.4.33)
MySQL(10.1.32)
※XAMPPを使用しています。設定方法については割愛します。
Windows10
Google Chrome(66.0.3359.139)

フォームの作成

名前とメッセージを入力後、送信ボタンでチャットを投稿できるような、フォームになっております。
投稿した内容は、表示できるようにチャット履歴の項目を、設けています。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>チャット</title>
</head>

<body>
    


<h1>チャット</h1>




    


<form method="post" action="chat.php">
        名前    <input type="text" name="name">
        メッセージ <input type="text" name="message">

        <button name="send" type="submit">送信</button>

        チャット履歴
    </form>



</body>

実際の表示は、以下の通りです。

チャット1

チャット機能の作成

次に、実際のチャット機能を作っていきます。
事前に、MySQLに以下のテーブルを作成済みです。

テーブル名:message
カラム名、name(名前)、message(メッセージ)、time(投稿日時)

フォームと同じファイルに、追記していきます。
①画面を表示した際に、DBに登録されている投稿内容を表示する。
②送信ボタンを押下した際に、DBに登録し、登録した内容を表示する。

    


<section>
        <?php // DBからデータ(投稿内容)を取得 $stmt = select(); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $message) {
                // 投稿内容を表示
                echo $message['time'],": ",$message['name'],":",$message['message'];
                echo nl2br("\n");
            }

            // 投稿内容を登録
            if(isset($_POST["send"])) {
                insert();
                // 投稿した内容を表示
                $stmt = select_new();
                foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $message) {
                    echo $message['time'],": ",$message['name'],":",$message['message'];
                    echo nl2br("\n");
                }
            }

            // DB接続
            function connectDB() {
                $dbh = new PDO('mysql:host=localhost;dbname=chat','root','');
                return $dbh;
            }

            // DBから投稿内容を取得
            function select() {
                $dbh = connectDB();
                $sql = "SELECT * FROM message ORDER BY time";
                $stmt = $dbh->prepare($sql);
                $stmt->execute();
                return $stmt;
            }

            // DBから投稿内容を取得(最新の1件)
            function select_new() {
                $dbh = connectDB();
                $sql = "SELECT * FROM message ORDER BY time desc limit 1";
                $stmt = $dbh->prepare($sql);
                $stmt->execute();
                return $stmt;
            }

            // DBから投稿内容を登録
            function insert() {
                $dbh = connectDB();
                $sql = "INSERT INTO message (name, message, time) VALUES (:name, :message, now())";
                $stmt = $dbh->prepare($sql);
                $params = array(':name'=>$_POST['name'], ':message'=>$_POST['message']);
                $stmt->execute($params);
            }
        ?>
    </section>



実際に動かしてみると、このようになります。

チャット2

チャット3

終わりに

いかがでしたでしょうか。
今後は、 SIP(Session Initiation Protocol)との連携や、セキュリティなどの実装にも、深堀していきたいと思います。

最後までお読みいただき、ありがとうございます。