[PHP初心者でも安心]PHPでチャットを作ってみた![作り方解説]
みなさんこんにちは!ワトスンです。
今回は、、
といった疑問に答えます。
簡単なチャット機能(掲示板風)を作ってみたので、作り方ご紹介したいなと思います。
PHPでチャット機能を作ることによって、データベースの使い方も学習できるのでおすすめです。
PHP初心者はぜひ参考にしてみて下さい。
PHP言語での作り方になります。
この記事はデータベースの詳しい扱い方(テーブルの作り方など)を解説しないので、PHP・MySQLの基本を理解している方向けです。
では早速作り方を紹介していきます!
目次
PHPでチャットを作る手順
まず大雑把に手順だけ紹介します↓
➀データベースの作成(テーブルを新規追加)
➁投稿フォームを制作
➂データベースに書き込む
➃データベースから取り込み
➄CSSでページデザインを整えてあげる
という感じです。
詳しく解説していきます。
データベースの作成(テーブルを新規作成)
一番最初に、「投稿内容を保存しておくためのテーブル」を作成しておきます。
今回はテーブル名を「chat-tb」にしました。
下の画像のとおり「番号」「名前」「メッセージ」「日時」の情報を取得するためのテーブルを作成してください。
テーブルの作成方法がわからない方は、「[データベース]テーブルの作成方法」をご覧ください。
投稿フォームを制作
チャット利用者がメッセージを投稿するための投稿フォームを作成します。
今回は「名前」と「メッセージ」の二つを投稿できるようにしました。
1 2 3 4 5 6 7 8 9 |
<form action="" method="post" onsubmit="return validate()" name="form"> 名前 <div><input type="text" name="n"></div> メッセージ <div><textarea name="m"></textarea></div> <div class="chat-submit"> <input type="submit" value="送信" name="submit"> </div> </form> |
もしフォームの作成方法がわからない方は、「HTMLでのフォーム作成方法」をご覧ください。
データベースに書き込む
作成したフォームから投稿があった際、その情報を取り出してデータベースに書き込む(保存する)ようにプログラムを組んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<!-----------DBに書き込み---------------> <?php if(isset($_POST['n'])) { $my_nam=htmlspecialchars($_POST["n"], ENT_QUOTES);//名前を$my_namに代入 $my_mes=htmlspecialchars($_POST["m"], ENT_QUOTES);//メッセージを$my_mesに代入 $dsn= "mysql:host=ホスト名;dbname=データベース名;charset=utf8"; $user="データベースのユーザー名"; $pass="データベースのパスワード"; try{ $db = new PDO($dsn,$user,$pass);//データベースへアクセス(PDO文) $db->query("INSERT INTO `chat-tb` (ban,nam,mes,dat) VALUES (NULL,'$my_nam','$my_mes',NOW())");//テーブルに値を入れる(Mysqlのqueryを実行) //SQL文で'chat-tb'テーブルに番号・名前・メッセージ・日付の内容を取得して保存していく }catch (Exception $e) { echo $e->getMessage() . PHP_EOL;//エラーが出たときの処理 } header("Location: {$_SERVER['PHP_SELF']}");//このページに戻ってくる(header関数) exit; } ?> <!-----------DBに書き込み---------------> |
try・catch文がわからない場合は「例外処理のtry・catch」をご覧ください。
PDOの使い方は「【PDO】PHPでデータベースに接続する方法」をご覧ください。
header関数については「header関数とは」をご覧ください。
投稿された情報を’chat-tb’テーブルに書き込むことができました。
次はテーブルに書き込んだ情報をページに表示させるプログラムを組んでいきます。
データベースから取り込み
ユーザーが投稿した情報をデータベースに書き込んだら、その情報を取り出し、ページに表示してあげます。
データベースから情報(投稿された内容)を取り出すプログラムを組んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<!-----------DBから取り込む---------------> <?php $dsn= "mysql:host=ホスト名;dbname=データベース名;charset=utf8"; $user="データベースのユーザー名"; $pass="データベースのパスワード"; $db = new PDO($dsn,$user,$pass); $ps = $db->query("SELECT * FROM `chat-tb` ORDER BY ban DESC");//「chat-tb」テーブルから番号の降順に投稿内容を取得する //ここから「何分前」の表示プログラム==================================== //定数====================================================== define("SECMINUITE", 60); //1分(秒) define("SECHOUR", 60 * 60); //1時間(秒) define("SECDAY", 60 * 60 * 24); //1日(秒) define("SECWEEK", 60 * 60 * 24 * 7); //1週(秒) define("SECMONTH", 60 * 60 * 24 * 30); //1月(秒) define("SECYEAR", 60 * 60 * 24 * 365); //1年(秒) //======================================================== function niceTime($dest,$sour) { $sour = (func_num_args() == 1) ? time() : func_get_arg(1); $tt = $dest - $sour; if ($tt / SECYEAR < -1) return abs(round($tt / SECYEAR)) . '年前'; if ($tt / SECMONTH < -1) return abs(round($tt / SECMONTH)) . 'ヶ月前'; if ($tt / SECWEEK < -1) return abs(round($tt / SECWEEK)) . '週間前'; if ($tt / SECDAY < -1) return abs(round($tt / SECDAY)) . '日前'; if ($tt / SECHOUR < -1) return abs(round($tt / SECHOUR)) . '時間前'; if ($tt / SECMINUITE < -1) return abs(round($tt / SECMINUITE)) . '分前'; if ($tt < 0) return abs(round($tt)) . '秒前'; if ($tt / SECYEAR > +1) return abs(round($tt / SECYEAR)) . '年後'; if ($tt / SECMONTH > +1) return abs(round($tt / SECMONTH)) . 'ヶ月後'; if ($tt / SECWEEK > +1) return abs(round($tt / SECWEEK)) . '週間後'; if ($tt / SECDAY > +1) return abs(round($tt / SECDAY)) . '日後'; if ($tt / SECHOUR > +1) return abs(round($tt / SECHOUR)) . '時間後'; if ($tt / SECMINUITE > +1) return abs(round($tt / SECMINUITE)) . '分後'; if ($tt > 0) return abs(round($tt)) . '秒後'; return '現在'; } //=================================================== //ここまで「何分前」の表示プログラム==================================== try{ while($r = $ps->fetch()){ //それぞれの投稿内容(名前+メッセージ+番号+日時)を$rに代入(while文とfetch関数を使用) //ここから「何分前」の表示プログラム================== $beforedest = $r['dat'];//投稿された時刻を$beforedestに代入 $dest = strtotime($beforedest);//$beforedestの時刻をUnix タイムスタンプに変換(strtotime関数を使用) $sour = time(); //現在の時刻を$sourに代入 $outstr = nicetime($dest,$sour);//上で作ったnicetime関数に第一・ニ引数を入れて$outstrに代入 ?> <div class="chat-list"> <div class="chat-name"> <?php print "{$r['nam']}";?>//名前の表示 </div> <div class="chat-date"> <?php print $outstr;?>//何分前の表示 </div> <div class="chat-message"> <?php print nl2br($r['mes']); ?> //メッセージを表示 </div> </div><hr> <?php } }catch(Exception $e){ echo $e->getMessage() . PHP_EOL;//エラーが出たときの処理 } ?> |
「何分前」の表示は少し複雑なので別の記事でまた解説します。
CSSでページデザインを整えてあげる
基本的なチャット機能が実装できれば、あとはCSSでページの見た目を好きなように整えたら完成です!
PHPの勉強にチャットを作成
完成したコードをGithubで公開しているので、参考にしたい方はのぞいてみて下さい!
今回ご紹介した作り方はいろいろと応用できると思うので、どんどん応用して成長していってください。
プログラミング上達の方法はどんどんチャレンジしていく他ありません。
作ってみたいなと思ったものがあればすぐ取り掛かっていきましょう!!!
チャット制作は意外と簡単で、PHP初心者の勉強にもなるので、ぜひお試しください。
私のブログでは駆け出しエンジニアのための記事をたくさん用意してあるので他の記事も参考にして下さい。
なにか疑問点がありましたらコメントまたはTwitterのDMでご連絡ください!
以上です。
1 件の投稿
すごい!