php・mysql・javascriptを使ったチャットシステムの作り方を載せてみました。
名前と文章を入力して送信ボタンを押してください。
| 名前 | 投稿日時 | 文章 |
|---|---|---|
| ギア | 09-24 14:18:34 | 6時間目に国語はいじめ |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 14:02:14 | てか保健高くね? |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 14:01:54 | 5.6時間目は進路に関することでした |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 14:01:26 | 昼休みにコンギョは草 |
| たい | 09-24 13:28:24 | |ू・ω・` ) |
| わら猫 | 09-24 13:17:29 | にししししし |
| わら猫 | 09-24 13:17:23 | 保体の点数43/50やああ |
| わら猫 | 09-24 13:17:09 | 昼休みなったけどコンギョ流してる人いて草 |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 13:02:06 | マジで知らん(ホームルームだけど何も言われてない) |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 13:01:49 | さて、今から5時間目と6時間目。俺は何するの? |
| ごじ@特になし | 09-24 12:30:17 | ご飯ご飯⊂((・⊥・))⊃ |
| ギア | 09-24 12:28:54 | 僕ももう終わるな |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 12:20:52 | さあ昼だ |
| ギア | 09-24 12:07:12 | 笑笑 |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 12:04:05 | 怖かった(普通にノート褒められただけ |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 12:03:41 | 泣泣 |
| ギア | 09-24 12:02:26 | 笑笑 |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 12:01:46 | 急に先生に話しかけられてビビった |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 12:01:26 | いいやん |
| ギア | 09-24 11:58:03 | 音楽65だった |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 11:55:05 | つよ |
| ギア | 09-24 11:54:44 | で |
| ギア | 09-24 11:54:40 | 62てした |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 11:54:29 | 俺とは大違いや(英語の定期テスト19点) |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 11:54:00 | その調子〜! |
| ギア | 09-24 11:53:59 | うれしい |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 11:53:51 | 良かったやん |
| ギア | 09-24 11:53:50 | 30点ぐらい |
| ギア | 09-24 11:53:43 | なんかめっちゃ上がってた |
| ᴋɢʀɪ ➴⁎⋆✰⁎ | 09-24 11:53:39 | ほう |
CREATE TABLE `chat` ( `chid` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `text` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, `date` datetime DEFAULT NULL, `ip` varchar(255) DEFAULT NULL, `id` char(32) DEFAULT NULL, PRIMARY KEY (`chid`) ) ENGINE=MyISAM AUTO_INCREMENT=1000000001 DEFAULT CHARSET=utf8mb4
<? if(!isset($_SESSION)) session_start(); $msg = "<p>名前と文章を入力して送信ボタンを押してください。</p>"; // チャット内容の取得 $_chat = array(); $rst = mysql_query("select * from chat order by date desc limit 30"); while($col=mysql_fetch_assoc($rst)) $_chat[$col["chid"]] = $col; mysql_free_result($rst); // 直近のIDをセッションに登録 $_SESSION["max_chid"] = count($_chat) ? max(array_keys($_chat)) : 0 ; // 本人を特定するID $id = isset($_COOKIE["id"]) ? $_COOKIE["id"] : 0 ; if(!$id) setcookie("id",md5(rand()),time()+10*365*24*60*60,"/","systemexpress.co.jp"); // 名前 クッキーがあればクッキーをポストされればポストを $name = isset($_COOKIE["name"]) ? $_COOKIE["name"] : "" ; $name = isset($_POST["name"]) ? $_POST["name"] : $name ;
<?=$msg?> <form onsubmit="sendChatData();return false"> <table summary="送信フォーム"> <tr><th style="width:150px">名前(10文字以内)</th><td><input type="text" name="name" value="<?=@$name?>" style="width:100%" maxlength="10" required /></td></tr> <tr><th>文章(50文字以内)</th><td><input type="text" name="text" value="" style="width:100%" maxlength="50" required /></td></tr> </table> <p><input type="submit" value="送信" class="button" /></p> </form> <table summary="チャット" id="chat"> <tr id="thead"><th style="width:150px">名前</th><th style="width:180px">投稿日時</th><th>文章</th></tr> <tbody id="board"> <?foreach($_chat as $val){?> <tr class="chat<?=$val["id"]?>"><td><?=htmlspecialchars($val["name"])?></td><td><?=substr($val["date"],5,14)?></td><td><?=htmlspecialchars($val["text"])?></td></tr> <?}?> </tbody> </table> <script type="text/javascript"> // 名前か文章にカーソルをフォーカス if(document.getElementsByName("text")[0]) document.getElementsByName("text")[0].focus(); if(document.getElementsByName("name")[0]) document.getElementsByName("name")[0].focus(); // xmlHttpObjectの作成 function createXMLHttpRequest(){ var xmlHttpObject = null; if(window.XMLHttpRequest){ xmlHttpObject = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{ xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } return xmlHttpObject; } // チャットの内容の取得 function loadChatData(){ xmlHttpObject = createXMLHttpRequest(); xmlHttpObject.onreadystatechange = displayHtml; xmlHttpObject.open("GET","/loadChatData.php",true); xmlHttpObject.send(null); } // 新たな書き込みがあった場合に表示する function displayHtml(){ if((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200) && xmlHttpObject.responseText){ document.getElementById("board").innerHTML = xmlHttpObject.responseText + document.getElementById("board").innerHTML; } } // チャットに書き込みをする function sendChatData(){ xmlHttpObject = createXMLHttpRequest(); xmlHttpObject.open("POST","/sendChatData.php",true); xmlHttpObject.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlHttpObject.send("name="+encodeURIComponent(document.getElementsByName("name")[0].value)+"&text="+encodeURIComponent(document.getElementsByName("text")[0].value)); document.getElementsByName("text")[0].value = ""; loadChatData(); } // 1秒ごとにチャットの内容を取りに行く setInterval('loadChatData()',1000); </script> <style> table#chat{ background-color:#8dabd8; padding:0 1% 10px; } table#chat tr#thead{ display:none; } table#chat td{ display:block; border:none; float:left; padding:10px; } table#chat td:nth-of-type(1){ font-weight:bold; font-size:13px; padding-bottom:0; } table#chat td:nth-of-type(2){ color:#333333; font-size:13px; padding-bottom:0; } table#chat td:nth-of-type(3){ clear:both; width:80%; background-color:white; border-radius:20px; } <?// 本人の書き込みを右詰にする if(@$id){?> table#chat tr.chat<?=$id?> td{ float:right; } table#chat tr.chat<?=$id?> td:nth-of-type(3){ background-color:#6fe67a; } <?}?> </style>
<? if(!isset($_SESSION)) session_start(); // キャッシュを取らないように header("Expires: Thu, 01 Dec 1994 16:00:00 GMT"); header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0",false); header("Pragma: no-cache"); header("Content-type: text/html; charset=utf-8"); $max_chid = isset($_SESSION["max_chid"]) ? $_SESSION["max_chid"] : 0 ; // チャットの内容の取得 $_chat = array(); $rst = mysql_query("select * from chat where chid > {$max_chid} order by date desc limit 30"); while($col=mysql_fetch_assoc($rst)) $_chat[$col["chid"]] = $col; mysql_free_result($rst); // 直近のID $_SESSION["max_chid"] = count($_chat) ? max(array_keys($_chat)) : $max_chid ; // チャットデータの書き出し foreach($_chat as $val){?> <tr class="chat<?=$val["id"]?>"><td><?=htmlspecialchars($val["name"])?></td><td><?=substr($val["date"],5,14)?></td><td><?=htmlspecialchars($val["text"])?></td></tr> <?}?>
<? // 本人を特定するID $id = isset($_COOKIE["id"]) ? $_COOKIE["id"] : md5(rand()) ; setcookie("id",$id,time()+10*365*24*60*60,"/","systemexpress.co.jp"); $name = isset($_POST["name"]) ? preg_replace("/^\s+|\s+$/u","",$_POST["name"]) : "" ; $text = isset($_POST["text"]) ? preg_replace("/^\s+|\s+$/u","",$_POST["text"]) : "" ; $err = array(); if(!$name) $err[] = "名前 を入力してください"; if(mb_strlen($name)>10) $err[] = "名前 は10文字以内で入力してください"; if(!$text) $err[] = "文章 を入力してください"; if(mb_strlen($text)>50) $err[] = "文章 は50文字以内で入力してください"; // 名前をクッキーに登録 setcookie("name",$name,time()+10*365*24*60*60,"/","systemexpress.co.jp"); if(!count($err)){ mysql_query("insert into chat set date = now(), name = '".addslashes($name)."', text = '".addslashes($text)."', ip = '".$_SERVER["REMOTE_ADDR"]."', id = '".$id."'"); }else{ $msg = showerr($err); }
Copyright(C) systemexpress.co.jp All Rights Reserved. Author Takayuki Yukawa