PHP5.2.4(指定による)
掲示板を作る課題に取り組んでいます。
#背景
以前作ったテキスト保存の掲示板が何かタイプしてしまったのか動作しなくなり、MySQL版のときのように投稿機能だけを取り出して修正をしています。
##試したこと
検索機能を使い変数などのタイプミスがないか調べました。
スペースを可視化し、半角と全角がわかるようにしています。
コピペで取り出したので、余計な要素を削除しました。
各変数を見るとフォームのデータは送信出来ているようです。
fopen,fwrite,の使い方を検索し調べました。
正常に動作していたときのコードを書この質問からコピペし変数名を一致させ試しましたがちゃんと動作しませんでした。
##本題
別の部分が邪魔しているのでしょうか?
###全体のコード
php
1<?php 2session_start(); 3//投稿部分 4$file_name = "keijiban.txt"; //保存するファイル 5$date = date( "Y-m-d H:i" ); //投稿日時 6$delimiter = "<>"; //区切り文字 7$name = ( string )filter_input( INPUT_POST, "name" ); //post送信された投稿者の名前の文字列 8$comment = ( string )filter_input( INPUT_POST, "comment" ); //post送信されたコメントの文字列 9$post_password = ( int )filter_input( INPUT_POST, "post_password" ); //post送信された投稿用パスワード 10$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 11$replace = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "<>" ); //置き換える文字 12$replace_name = str_replace( $search, $replace, $name ); //置き換えられた名前 13$replace_comment = str_replace( $search, $replace, $comment ); //置き換えられたコメント 14//投稿番号の定義 15if ( is_file( $file_name ) ) { //ファイルが存在する時 16 //最後の行にプラス1 17 $rows = file( $file_name ); //ファイルを配列として読み込む 18 $lastline = $rows[ count( $rows ) - 1 ]; //行を0からcountするから-1する 19 $num = explode( $delimiter, $lastline ); //区切り文字で分割 20 $lastnum = $num[ 0 ] + 1; //分割した配列から番号だけ取り出し+1 21} else { //ファイルが無かった場合変数の定義を1とする 22 $lastnum = 1; 23} 24//書き込み内容 25$save = implode( $delimiter, array( $lastnum, $replace_name, $replace_comment, $date, $post_password, "\r\n" ) ); //区切り文字を各変数に挿入して保存 26//投稿する 27if ( !empty( $name ) && !empty( $comment ) && !empty( $post_password ) ) { //もし、名前とコメントとパスワードがpost送信された時 28 $fp = fopen( $file_name, "ab" ); //追記・バイナリモードでファイルを開く 29 if ( flock( $fp, LOCK_EX ) ) { //排他ロックできたら 30 fwrite( $fp, $save ); //指定したファイルに書き込み 31 $post_message = "投稿されました"; 32 } else { 33 $post_message = "投稿に失敗しました"; 34 } 35 flock( $fp, LOCK_UN ); //ロックを外す 36 fclose( $fp ); //ファイルを閉じる 37 $_SESSION[ 'post_message' ] = $post_message; 38 /*header( 'Location: toko_text.php', true, 303 ); //二重投稿防止のリダイレクト 39 exit;*/ 40} 41?> 42<!doctype html> 43<html lang="ja"> 44<head> 45<meta charset="utf-8"> 46<title>投稿テキスト版</title> 47<style> 48.akaji { 49 color: red; 50} 51</style> 52</head> 53 54<body> 55<?php 56echo "file_name:"; 57var_dump( $file_name ); 58echo "<br>"; 59echo "save:"; 60var_dump( $save ); 61echo "<br>"; 62echo "lastnum:"; 63var_dump( $lastnum ); 64echo "<br>"; 65echo "name:"; 66var_dump( $name ); 67echo "<br>"; 68echo "comment:"; 69var_dump( $comment ); 70echo "<br>"; 71echo "post_password:"; 72var_dump( $post_password ); 73echo "<br>"; 74echo "post_message:"; 75var_dump( $post_message ); 76echo "<br>"; 77echo "post_message(session):"; 78var_dump( $_SESSION[ "post_message" ] ); 79echo "<br>"; 80?> 81<hr> 82<!--投稿フォーム--> 83<form method="post"> 84 <div> 85 <label for="name">お名前<span class="akaji">【必須】</span></label> 86 <?php 87 if ( isset( $_SESSION[ "post_message" ] ) ) { 88 echo $_SESSION[ "post_message" ]; 89 } 90 ?> 91 <br> 92 <input type="text" name="name" required > 93 <br> 94 </div> 95 <div> 96 <label for="comment">コメント<span class="akaji">【必須】</span></label> 97 <br> 98 <textarea name="comment" cols="30" rows="3" required></textarea> 99 <br> 100 </div> 101 <div> 102 <label for="post_password">パスワード<span class="akaji">【必須】</span></label> 103 <br> 104 <input type="password" name="post_password" required> 105 <br> 106 </div> 107 <input type="submit" value='投稿' > 108</form> 109<?php 110$file_name = "keijiban.txt"; 111$search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "<>", ); //置き換え時の検索文字 112$replace = array( "\r\n", "\r", "\n", "<>", ); //置き換える文字 113//XSS対策 114function h( $str ) { 115 return nl2br( htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ) ); 116} 117//投稿一覧 118if ( !empty( $file_name ) ) { 119 $rows = file( $file_name ); 120 foreach ( $rows as $row ) { 121 $select = explode( $delimiter, $row ); 122 $select = str_replace( $search, $replace, $select ); 123 echo h( $select[ 0 ] ) . "<br>";//番号の表示 124 echo h( $select[ 1 ] ) . "<br>";//名前の表示 125 echo h( $select[ 2 ] ) . "<br>";//コメントの表示 126 echo h( $select[ 3 ] ) . "<br>";//日時の表示 127 } 128} else { 129 echo "<p>投稿はまだありません</p>"; 130} 131?> 132</body> 133</html>