• 締切済み

PHPのチャットアプリでの受信音について

下記のPHPスクリプトにおいて、左蘭で、氏名とメッセージを入力後、右蘭の メッセージ部分にメッセージが表示されるという仕組みなのですが、自分自身 が書いたメッセージのときにしか音が鳴りません。 本来、他のデバイスで書き込んだ時の受信音が自パソコンで鳴ればいいのですが。 どうすればよいのか教えていただきたいです。 ちなみに、$_SERVER['REMOTE_ADDR'] でIPによる振り分けも行ったのですが、 だめでした。(自パソコンから投稿したときしか音が鳴りませんでした。) ////////////////////////// // ファイルへの書き込み // ////////////////////////// function writeToLogFile($val){ $filename="log.txt"; date_default_timezone_set("Japan"); $date = date('H:i:s'); echo '<audio src="./music/buble.wav" volume="1" autoplay></audio>'; echo '<bgsound src="./music/buble.wav" loop="1" volume="1">'; if($val===1){ // 初回投稿時で、しかも名前とメッセージがある場合(ログファイルが0バイトの場合) $fp = fopen($filename, 'w'); // $log = $_POST['ip_addr']." ".$date." ".$_POST['name']." : ".$_POST['message']; $log = $date." ".$_POST['name']." : ".$_POST['message']; $buf = $log.",\n"; fwrite($fp, $buf); fclose($fp); } elseif($val===2){ // 既に投稿があって、しかも名前とメッセージがある場合(ログファイルのサイズが0バイトでない場合) $fp = fopen($filename, 'a'); $log = $date." ".$_POST['name']." : ".$_POST['message']; $buf = $log.",\n"; fwrite($fp, $buf); fclose($fp); }else{ return; } }

みんなの回答

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>おっしゃったように、投稿者名を投稿者のデバイスにクッキーで >送るようにしたんですが、自パソコンで音が鳴りません。 誰もそんなことは書いていません。「最終データの日時を入れておく」とは書きましたが、投稿者名のような基本的に(同一デバイスからであれば)変わらない値を保持しても意味がありません。同一デバイスで前回ログ表示したときのログの状態(更新日時)が必要です。ログの内容が(他からのアクセスによって)書き替えられたかどうかが問題ですので。 また、setcookieが呼び出されるのがbody部以降ではどうしようもありません。HTTPレスポンスヘッダで返すものはブラウザに何も返さないうちに実行する必要があります。 http://php.net/manual/ja/function.setcookie.php ---------- 引用ここから ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 ---------- 引用ここまで ><meta http-equiv="refresh" content="5;url=chatbody.php?count=<?php echo $_SESSION['cnt'];?>"> このmeta要素では、$_SESSION['cnt']を引き渡していますから、$_SESSION['cnt']に前回のログ行数でも渡しているんでしょうかね。もしそうであれば、それでチェックしてもいいです。ログの行数が前回の値($_GET['cnt'])と違っていれば音を鳴らすhtml要素を追加出力すればいいでしょう。 私はログファイルの更新日時が前回アクセス時のものと違っているかどうかチェックすればいいんじゃないかと思いましたけどね。リロードでどうせ読み込むなら行数でもいいです。 ただ、いずれにしても記述順序が間違ってますね。このmeta要素を書き出す前にチェックを終わらせておいて新しい値をセットしないといけません。実際の受信音用の要素の書き出しはbody以降になるので、チェック結果(音の鳴らす・鳴らさない)は変数に入れておけばいいです。 先に「ログに書き込むデータをPOSTされていたら書き込む」「ログを読み込んで表示用のデータを準備する」「前回のアクセスとログが変更されていないか確認する(ログファイルの更新日時もしくはログ行数でチェック)」「セッション変数に今回アクセスでのログファイルの更新日時(もしくは行数)を保存する」を行ってから、html要素の書き出しを始めてください。 (蛇足) 今現在の行数と$_SESSION['cnt']をチェックすればいいので、meta要素で$_GET['cnt']で渡す必要なんてないと思いますけどね。どういう動作が前提なんですかね。まさかアクセス回数ってわけではないだろうし(意味がなさすぎ)。リロードを確実にさせるためにURLを変えるなら <meta http-equiv="refresh" content="5;url=chatbody.php?<?= md5(microtime()); ?>"> でいい話だし。 なお、提示されたソースはchatbody.phpとは別のものですよね。session_start()すら存在しないので、セッション変数が使えません。$_SESSIONを使うソースになっていません。 http://php.net/manual/ja/function.session-start.php

beterugius
質問者

お礼

詳しいご回答、どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

提示されたソースは書き込み時の処理しかありませんので(当然ですが)「自分が書き込んだとき」しか反映されません。 >他のデバイスで書き込んだ時の受信音 他のデバイスで書き込んだとき、どうやってチャットログに反映させているのでしょうか?meta要素とかJavaScriptとかでReloadしているんですかね?もしそうであれば「当該デバイスに対して前回返した内容が変わった」ときにaudio要素やbgsound要素も書き出せばいいと思います。 Cookieに最終データの日時を入れておくのが楽だと思います。

beterugius
質問者

お礼

ご回答、どうも有難うございました。

beterugius
質問者

補足

おっしゃったように、投稿者名を投稿者のデバイスにクッキーで送るようにしたんですが、 自パソコンで音が鳴りません。 全ソースを記述しますので、どうすれば、他デバイスからの投稿で、自パソコンで音が鳴るか教えていただきたいです。 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--<meta http-equiv="refresh" content="5">--> <meta http-equiv="refresh" content="5;url=chatbody.php?count=<?php echo $_SESSION['cnt'];?>"> <title>チャット</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script> $(function() { $('html,body').animate({ scrollTop: $('#last').offset().top },'fast'); }); </script> </head> <body text="white" background="./image/mokume2.jpg" onLoad="sound_beep()"> <?php ////////////////////////////// // フォームデータの読み込み // ////////////////////////////// function getPostData(){ $name = $_POST['name']; $message = $_POST['message']; $ip_addr = $_POST['ip_addr']; if(!is_null($name) && !is_null($message)) return 1; else return -1; } ////////////////////////// // ファイルへの書き込み // ////////////////////////// function writeToLogFile($val, $name){ $filename="log.txt"; date_default_timezone_set("Japan"); $date = date('H:i:s'); if($val===1){ // 初回投稿時で、しかも名前とメッセージがある場合(ログファイルが0バイトの場合) $fp = fopen($filename, 'w'); $log = $date." ".$_POST['name']." : ".$_POST['message']; $buf = $log.",\n"; fwrite($fp, $buf); fclose($fp); echo '<audio src="./music/chime.mp3" autoplay></audio>'; }elseif($val===2){ // 既に投稿があって、しかも名前とメッセージがある場合(ログファイルのサイズが0バイトでない場合) // 自パソコンがWEBサーバーから送られてきて食べたクッキーと違う投稿者名だった場合に音鳴らす if($name!==$_COOKIE['name']) echo '<audio src="./music/buble.wav" autoplay></audio>'; $fp = fopen($filename, 'a+'); $buf = fread($fp, filesize($filename)); $date_file = strtok($buf, ","); if($date!==$date_file){ // 時間が、ファイル内の時間と一致してれば何もしない $log = $date." ".$_POST['name']." : ".$_POST['message']; $buf = $log.",\n"; fwrite($fp, $buf); fclose($fp); } }elseif($val===3){ return; } } //////////////////////////////////////// // ファイルのリードと、ログの画面出力 // //////////////////////////////////////// function dispLogFile($val){ $filename="log.txt"; $fp = fopen($filename, 'r'); if($val===1){ // 初回で正常投稿された場合 $buf = fread($fp, 5000); fclose($fp); }elseif($val===2 || $val===3){ // 既存の投稿があって、正常投稿されたまたは何もされなかった場合 $buf = fread($fp, filesize($filename)); fclose($fp); }else{ fclose($fp); return; } $log = strtok($buf, ","); echo '<b>'.$log.'</b><br>'; while(($log=strtok(","))!=FALSE){ echo '<b>'.$log.'</b><br>'; } } ////////////////////////////////////// // ログクリアボタンとアイコンの表示 // ////////////////////////////////////// function dispClearButton(){ $filename="log.txt"; if(filesize($filename)){ echo '<br><br>'; echo '<form name="form1">'; print("<input type=\"button\" name=\"clear\" value=\"メッセージクリア\" onclick=\"location.href='clear_message.php'\">"); echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'; echo '<img src="./image/coffee.gif">'; echo '</form>'; } } //////////////////// // メインルーチン // //////////////////// $val = 0; $filename="log.txt"; if(getPostData()===1){ // 名前メッセージ両方入力あって、送信ボタンをクリックするかエンターキー押下 $name = $_POST['name']; setcookie("name", $name); // 投稿デバイスでの投稿者名をクッキーとして、投稿デバイスに送る if(!filesize($filename)){ // 初回投稿時 $val = 1; writeToLogFile($val, $name); dispLogFile($val); dispClearButton(); }else{ // 既に投稿がある場合 $val = 2; writeToLogFile($val, $name); dispLogFile($val); dispClearButton(); } }else{ if(filesize($filename)){ // 既に投稿がある場合(何もしなければ) $val = 3; // writeToLogFile($val); dispLogFile($val); dispClearButton(); }else{ // 初回投稿で何もされなかった場合、何もしない ; } } ?> <div style="height: 90px;"> </div> <div id="last"></div> </body> </html>

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHP チャットの相手の入場時にチャイム鳴動

    下記のPHPスクリプトで、自分が先にチャットのページを開いていたとして、 相手がチャットのページを開いたら(入場したら)チャイムを鳴動させたいのですが、 相手が入場したときに、相手側にしか音が鳴りません。こちらは、相手がいつ入場したのか わかるために、チャイムを鳴動させたいのですが、どこがどう間違っているのでしょうか。 ご指導よろしくお願い致します --------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////// // IPアドレスをファイルに保存 // /////////////////////////////////////////////////// function reserveIpAdress(){ $filename="ip_log.txt"; if(!filesize($filename)){ // ファイルが空だったら $fp = fopen($filename, 'w'); // 追加書き込み用に、IPログファイルをオープン $buf = $_SERVER['REMOTE_ADDR']."\n"; fwrite($fp, $buf); // IPアドレスを追加書き込み fclose($fp); echo '<audio src="http://5247423.raindrop.jp/chat/music/schjoin.hso" autoplay></audio>'; $_SESSION['ip_write_cnt']++; }else{ $fp = fopen($filename, 'r'); // while(($buf=fgets($fp))===false){ $buf = fgets($fp); // 1行目 // $buf1 = rtrim($buf1); // $buf2 = fgets($fp); // 2行目 fclose($fp); if(rtrim($buf)!==$_SERVER['REMOTE_ADDR']){ // 相手の方が先にチャットにアクセスした時 $fp = fopen($filename, 'a'); $buf2 = $_SERVER['REMOTE_ADDR']."\n"; // 自分のIPアドレスをファイルにライト fwrite($fp, $buf2); fclose($fp); echo '<audio src="http://5247423.raindrop.jp/chat/music/schjoin.hso" autoplay></audio>' }else{ } $_SESSION['ip_write_cnt']++; } } /////////////////////////////// // メインルーチン // /////////////////////////////// session_start(); // セッション開始 if(is_null($_SESSION['ip_write_cnt'])) $_SESSION['ip_write_cnt'] = 0; if($_SESSION['ip_write_cnt']<2){ // 2人でチャットする場合 reserveIpAdress(); // このページにアクセスしたデバイスのIPアドレスをファイルにライト } 以下略

    • ベストアンサー
    • PHP
  • PHPで掲示板

    PHPでひとこと掲示板を以下の要件を満たすように作成しています。 ・利用者が名前とコメントを入力し、発言できる。 ・利用者の過去の発言内容をテキストファイルで管理する。 ・全ての利用者の過去の発言内容を一覧で表示する。一覧には「名前」「コメント」「発言日時」の3つを1行ずつ表示する。 ・利用者の名前は最大20文字以内まで発言できる。もし20文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。 ・利用者のコメントは最大100文字以内まで発言できる。もし100文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。 ・利用者の名前とコメントは必ず文字が入力される。もし名前あるいはコメントが未入力で発言した場合はエラーメッセージを表示し、発言できないようにする。 ・(ソースコード)比較演算子は、「===」や「!==」を利用すること 初心者なので、頭がこんがらがって意味が分からなくなってしまいました。以下のコードでおかしいところのご指摘をお願いします。また、よろしければ皆さんのプログラミングのオススメ学習法を教えていただけると幸いです。 <?php const FILE_NAME = './bbs.txt'; $date = date("Y-m-d H:i:s"); $log = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $name = $_POST['name']; // $comment = $_POST['comment']; // $log = $name . ':' . $comment . '-' . $date . "\n"; if (($fp = fopen(FILE_NAME, 'a')) !== false) { if ((mb_strlen($name) <= $name_max) && (mb_strlen($name) !== 0)){ print '名前は20文字以内で書いてください'; if (fwrite($fp, $name) === false) { print 'ファイル書き込み失敗'; } } fclose($fp); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { // $name = $_POST['name']; $comment = $_POST['comment']; $log = $name . ':' . $comment . '-' . $date . "\n"; if (($fp = fopen(FILE_NAME, 'a')) !== false) { if ((mb_strlen($comment) <= $comment_max) && (mb_strlen($comment) !== 0)){ print 'ひとことは100文字以内で書いてください'; if (fwrite($fp, $log) === false) { print 'ファイル書き込み失敗'; } } fclose($fp); } $data = array(); if (is_readable(FILE_NAME) === true) { if (($fp = fopen(FILE_NAME, 'r')) !== false) { while (($tmp = fgets($fp)) !== false) { $data[] = htmlspecialchars($tmp, ENT_QUOTES, 'UTF-8'); } fclose($fp); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>一言掲示板</h1> <form method="post"> <p>名前 : <?php if (mb_strlen($name)){?><input type="text" name="name"> <?php } ?> ひとこと : <?php if (mb_strlen($comment)){?><input type="text" name="comment"><?php } ?> <input type="submit" value="送信"> </p> </form> <ul> <?php foreach ($data as $value) { ?> <li> <?php print $value; ?> </li> <?php } ?> </ul> </body> </html>

    • ベストアンサー
    • PHP
  • ファイルに書き込む時の負荷について

    PHPバージョン5.2.4を使っています。 次のような // ------------------------------------ $fp = fopen("data.txt", "w"); $buf = ""; for ($i = 1; $i <= 3; $i++) { $buf .= "aaa$i\n"; } fwrite($fp, $buf); fclose($fp); // ------------------------------------ という変数にいったん保存してから書き込む場合と // ------------------------------------ $fp = fopen("data.txt", "w"); for ($i = 1; $i <= 3; $i++) { $buf = "aaa$i\n"; fwrite($fp, $buf); } fclose($fp); // ------------------------------------ というその都度ファイルに書き込む場合とでは どちらが良い悪いというのはあるのでしょうか? たとえばこちらのやり方は負荷がかかるなど ループが多くなっていった場合に違いがでてくるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのファイル操作

    テキストボックスの値をPOSTで送信し、日時とユーザが入力した値を1行ずつファイル(review.txt)に保存し、ページ下部にファイル内容を1行ずつ表示するプログラムを作成しましたが、ブラウザに発言履歴が残りません。どの部分を修正すればいいですか? <?php //ブラウザに履歴がのこらないです $filename = './review.txt'; $comment = ''; $date = date('m/d H:i:s'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['comment']) === TRUE) { $comment = $_POST['comment']; } if (($fp = fopen($filename, 'a')) !== FALSE) { $result = fwrite($fp, $comment . '-' . $date . "\n"); if ($result === FALSE) { print 'ファイル書き込み失敗: ' . $filename; } fclose($fp); } } $work = []; if (is_readable($filename) === TRUE) { print "\n"; if(($fp=fopen($filename,'a')) !== FALSE) { print "\n";} while(($tmp = fgets($fp)) !==FALSE) { print "\n"; $work[] = htmlspecialchars($tmp,ENT_QUOTES,'UTF-8'); } fclose($fp); } else { print "\n"; $work[] = 'ファイルがありません'; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>ファイル操作</h1> <form method="post" > <label><p>発言:<input type="text" name="comment"><input type="submit" value="送信"></p></label> </form> <p>発言一覧</p> <?php foreach ($work as $value){?> <p><?php print $date; $value?></p> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP初心者です、教えていただけすか。

    /public_html /test のtest.txtの文字列をtest.phpで表示させたいのですが、 下記の文では表示されません、どこがおかしいのか教えてください。 <?php $fp = fopen ('test.txt', 'w'); $date = "test\n"; var_dump (fwrite($fp, $date)); fclose ($fp); ?>

    • ベストアンサー
    • PHP
  • phpのエラー

    phpで $fp = fopen("test.txt", a);//ココ1 $jyusin = $_POST['score'];//ココ2 fwrite($fp, $jyusin); fclose($fp); $f = fopen("test.txt", r);//ココ1 echo fgets($f); fclose($f); ココ1の場所でUse of undefined constant...というエラー ココ2の場所でUndefined index...というエラー 上記のエラーはどうしたら直りますか。 因みにissetで隠す方法以外でお願いします。

    • ベストアンサー
    • PHP
  • phpのCSVの保存について教えてください

    下記のようにinputタグから値をphpにおくり、csvファイルに保存しようとしています。 値1に12345 値2に67890 値3にあいうえお というように値を送って保存し、csvファイルを開くと、 12345," 67890",あいうえお というように、値2として送ったものの先頭にダブルコーテーションとスペース、最後にダブルコーテーションが勝手に入ってしまいます。なぜ何でしょうか?対処法も含め教えていただければありがたいです。よろしくお願いします。 --------------------html---------------------------------- <form action="send.php" method="post"> 値1:<input type="text" name="aaa" > 値2:<input type="text" name="bbb" > 値3:<input type="text" name="ccc" > <input type="submit" value="送信する"> </form> --------------------php---------------------------------- <?php $val[0] = $_POST['aaa']; $val[1] = $_POST['bbb']; $val[2] = $_POST['ccc']; $fp = fopen("valdata.csv", "a"); fputcsv($fp, $val); fclose($fp); ?>

    • ベストアンサー
    • PHP
  • phpでエラーが出て開発が進みません

    今、ファイルを指定してそのファイルを開き、表示するというプログラムを作っています。 それで Warning: file(): Filename cannot be empty in /home/runner/245ch/core.php on line 94 Warning: array_reverse() expects parameter 1 to be array, bool given in /home/runner/245ch/core.php on line 96 というエラーが出てしまいますどうか回答お願いします。 プログラムは <?php $i; $counter = 0; $filename = 'ip制限.dat'; // fopenでファイルを開く('r'は読み込みモードで開く) $fp = fopen($filename, 'r'); // fgetsでファイルを読み込み、変数に格納 $lines = file($filename, FILE_IGNORE_NEW_LINES); for($i = 0; $i <50 ; $i++){ if($lines[$counter] == $_SERVER["HTTP_X_FORWARDED_FOR"]){ header("location: https://245ch.teamperaggu.repl.co/ihan.html"); }; $counter = $counter + 1; } fclose($fp); // ファイルの指定 //エスケープする関数 function h($s){ return htmlspecialchars($s,ENT_QUOTES,'UTF-8'); } if(isset($_POST["sentaku"])){ $dataFile = trim($_POST['filee']) . ".dat"; $rr = trim($_POST['filee']) . ".dat"; } if(isset($_POST["kousin"])){ $message = trim($_POST['message']); $user = trim($_POST['user_name']); $ip = $_SERVER["HTTP_X_FORWARDED_FOR"] ; file_put_contents("ip.dat","user ". $user ." ". $ip . "\n", FILE_APPEND); //messageが空じゃなかったら if(!empty($message)){ //userが空の場合、名無しにする if(empty($user)){ $user = "名無し"; } //日付を取得する $postDate = date('Y-m-d H:i:s'); //ファイルに書き込むメッセージを作成する $newData = " /名前/ ". $user." /メッセージ/ ".$message." /時間 /".$postDate."\n"; //ファイルを開く $fp = fopen($dataFile,'a'); //ファイルに書き込む fwrite($fp,$newData); //ファイルを閉じる fclose($fp); } } //name="send_message"のPOST送信があった時 if(isset($_POST["send_message"])){ //送信されたname="message"とname="user_name"の値を取得する $message = trim($_POST['message']); $user = trim($_POST['user_name']); $ip = $_SERVER["HTTP_X_FORWARDED_FOR"] ; file_put_contents("ip.dat","user ". $user ." ". $ip . "\n", FILE_APPEND); //messageが空じゃなかったら if(!empty($message)){ //userが空の場合、名無しにする if(empty($user)){ $user = "名無し"; } //日付を取得する $postDate = date('Y-m-d H:i:s'); //ファイルに書き込むメッセージを作成する $newData = " /名前/ ". $user." /メッセージ/ ".$message." /時間 /".$postDate."\n"; //ファイルを開く $fp = fopen($dataFile,'a'); //ファイルに書き込む fwrite($fp,$newData); //ファイルを閉じる fclose($fp); } } //一行ずつデータを取り出して配列に入れる $post_list = file($dataFile,FILE_IGNORE_NEW_LINES); //逆順に並べ替える $post_list = array_reverse($post_list); ?> <style> a.text { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 50; font-size: 25px; } a.test { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 200; font-size: 25px; } a.test { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 200; font-size: 25px; } </style> <body> <h1>掲示板へようこそ</h1> <!--ここで投稿内容を送信する--> <form action="" method="post"> <from method="post"> <input type="text" name="filee"> <input type="submit" name="sentaku" value="選択"> </from> メッセージ:<input type="text" name="message"> ユーザー名:<input type="text" name="user_name"> <input type="submit" name="send_message" value="投稿"> <input type="submit" name="kousin" value="更新"> </form> <h2>投稿一覧</h2> <ul> <!--post_listがある場合--> <?php if (!empty($post_list)){ ?> <!--post_listの中身をひとつづつ取り出し表示する--> <?php foreach ($post_list as $post){ ?> <li><?php echo h($post); ?></li> <?php } ?> <?php }else { ?> <li>まだ投稿はありません。</li> <?php } ?> </ul> <a class="text" href="kiyaku.html">利用規約</a> <a class="test" href="otoiawase.php">お問い合わせ</a> </body>

    • ベストアンサー
    • PHP
  • PHP

    PHPで書き込みができません。なぜでしょうか? <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $erandayoubi = $_POST['youbi']; foreach($erandayoubi as $youbi){ $youbi2=$youbi2.$youbi. ','; } $youbi3 = rtrim($youbi2, ","); $fp = fopen("/etc/cron.d/autopbxrestart", "w"); fwrite($fp, $_POST['opt'] .$_POST['fun']. " " .$_POST['jikan']. " * * " .$youbi3. " root /usr/local/sbin/auto_pbxrestart.pl"); fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • PHP 掲示板記述

    現在、PHPで掲示板をメモ帳で作成しています。 今回は、よくよく分からないものを記載! PHPタグ================================= <?php // 保存するログファイル名 $LOGFILE = "log.txt"; … (1) // POST で mode = write の属性が送られていたら書き込み処理 if ($_POST["mode"] == "write") { … (2)   $name = $_POST["name"]; … (3)   $message = $_POST["message"];   $date = date("Y/m/d H:i:s"); … (4)   if (file_exists($LOGFILE)) { … (5)     $lines = file($LOGFILE); … (6)   }   $fp = fopen($LOGFILE,"w"); … (7)   fputs($fp,"$name,$message,$date\n"); … (8)   for ($i=0;$i<count($lines);$i++) { … (9)     fputs($fp,$lines[$i]); … (10)   }   fclose($fp); } ?> PHP 解説よくよく分からない=========== (1) では変数で説明した変数に保存するファイル名を指定しています。ファイル名は保存、読み込みのところで複数回つかうので使いまわしできるように変数に入れています。 (2) では前ページで説明した、 <input type="hidden" name="mode" value="write"> でフォームから送られる情報を $_POST["mode"] で受け取って、その値が "write" かどうかチェックしています。 「投稿する」ボタンを押してサーバに情報が送信される際に mode=write も送られていますので、それを if文で判定しています。通常のアクセスでは mode=write が送られないため、書き込み処理を行わないという感じです。 (3) では(2)同様、フォームから送られた name の情報を受け取って $name という変数に入れています。 (4) では現在の日付を取得しています。PHPには date 関数という代物があって簡単に現在の日付を取得できます。 (5) ではファイルが存在するかチェックしています。 file_exists関数でファイルが存在するか調べています。 (6) では file 関数によって配列にデータをすべて入れています。なぜここでデータを変数に入れるかというと、新しく投稿されたデータを1行目に書き込んで、残りに古い情報を書き込むためです。 なまえ,メッセージ,2005/02/06 なまえ,メッセージ,2005/02/06 なまえ,メッセージ,2005/02/06 青が新しく投稿された情報で赤が元々保存されていたふるい情報 (7) ではこれから書き込むのでfopen関数でファイルを書き込みモードで開いています。 (8) では開いたファイルにfputs関数で書き込んでいます。名前、メッセージ、日付をカンマ区切りで1行にしてファイルに書き込んでいます。 (9),(10) では古いファイルの情報(投稿前に書き込まれていた情報)を書き込んでいます。これを行わないと、新しく投稿された情報は書き込まれますが、古い情報が消えてしまうのでこの処理をしています。 PHPの解説でよくわからないので、お答えしてください。                                     ♪♪宜しくお願いします。♪♪

    • ベストアンサー
    • PHP