簡単なお知らせ ソースのアドバイス頂いた!
やった!すごい!週末頑張って勉強した部分、コメントでいろいろアドバイス頂きました。Redsnowさん、ありがとうございます!めっちゃ嬉しいです。じゃあさっそくアドバイスを元にソースを見直してみます。
file_put_contentsなんていう便利な関数があります
file_put_contents 文字列をファイルに書き込む
おおお。この関数はまったくノーマークでした。(PHP 5)って書いてあるからPHP4じゃダメってことなんですよね。そこだけ注意。
file_put_contents( ファイル名 , 書き込む値 , フラグ )
フラグは組み合わせができて、組み合わせる際には、論理 OR (|) 演算子で連結します
とのこと。んじゃ今回私が書いてるソースに置き換えてみると、書き込むファイルは$data_file、書き込む値は$newsなので・・・
file_put_contents($data_file , $news , FILE_APPEND | LOCK_EX)
こういう事ですね。3番目のパラメータは排他ロック、追記モードのフラグを指定しました。んじゃその辺りのソース変更してみます。
//変更前
//ログ用ファイルを開く
$file = fopen($data_file,"a") or die("エラー");
//ロック
flock($file,LOCK_EX);
//データを書き込む
fputs($file,"$news\n");
//ロック解除
flock($file,LOCK_UN);
//ファイルを閉じる
fclose($file);
//変更後
//ファイル開く→排他ロック→書き込む→ファイルを閉じる
file_put_contents($data_file , $news . "\n" , FILE_APPEND | LOCK_EX);
短っ!これってロックの解除も勝手にやってくれてるんですよね、きっと。こんな便利な関数があったのかぁ。素敵。書き換えてテストした結果も大丈夫。今までどおり動いた。
!($pass == $password)は$pass != $password
ふむふむ。慣習的にそう書くものなのかな。確かに私が書いたものだと括弧も2重になっちゃうし、あまり見やすいものではないですよね。そうかそうか。変更してみますー!
//変更前
elseif(!($pass == $password)){$error .= "パスワードが違います。<br />";}
//変更後
elseif($pass != $password){$error .= "パスワードが違います。<br />";}
これの動作は遅いのでphpで使用はあまり勧められていません
$subject = @$_POST["subject"];なんかのところで、「@」は初回アクセス時に$_POSTが存在しないためにエラーが出るのを防ぐって書いてあった。それは1つのファイルで完結する場合のお話?とりあえず言われるがままに書いておく。おまじない的なものと思っていいのかしら。
って書いた部分について教えていただきました。
この@はおまじないではなくてエラーが出た場合スルーするといった意味になります そしてこれの動作は遅いのでphpで使用はあまり勧められていません
とのことでした。そういうのすごく知りたかったんです!これは遅いとか速いとか、そういうの。ありがとうございますーヽ(´∀`ヽ)
あとごめんなさい。おまじないって書いたのは例えばHTMLの場合、DOCTYPEの説明がしてある本やらサイトやらで、たまに説明が一通り終わった後に「最初はこれはおまじないだと思って入れておきましょう」みたいに書いてあるのを見たことがあって、そういう意味で「分からなかったらとりあえず入れとくものとして考えていいんかな」っていう意味でした。まぎらわしくてすみません><
で、こう書く方がいよとお教え頂いたのがこれ。
$subject = isset($_POST["subject"])? $_POST["subject"] : null;
isset 変数がセットされているかどうかを検査する
issetは確かによく見かける。これを使って値が入ってたら変数に代入、値が入ってなかったらNULLにしてやればいいんですね。ここでも三項演算子出てきた。
//変更前
$subject = @$_POST["subject"];
$body = @$_POST["body"];
$pass = @$_POST["password"];
//変更後
$subject = isset($_POST["subject"]) ? $_POST["subject"] : NULL;
$body = isset($_POST["body"]) ? $_POST["body"] : NULL;
$pass = isset($_POST["pass"]) ? $_POST["pass"] : NULL;
タイトルでエラーがなかった場合に内部エラーが出てる気がしますよ!
error_reporting(E_ALL);で確認してみたらエラー($error)がない時にUndefined variableが出てきたのでエラー処理の部分に$error = "";を追加してみました。(その話じゃなかったらすごく見当違いな事いってますよね。すいません><)
修正したソース全文
<< 簡単なお知らせを表示する(4) | 簡単なお知らせを表示する(5) >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/211