REDLINE MAGAZINE | 簡単なお知らせ ソースのアドバイス頂いた!REDLINE MAGAZINEトップページへ

すべてのエントリを見る

簡単なお知らせ ソースのアドバイス頂いた!

やった!すごい!週末頑張って勉強した部分、コメントでいろいろアドバイス頂きました。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




※コメント欄に「<」「>」等を含むソースを記載する場合は実体参照に変換してください。

このページの一番上へ

その他の情報など

最近のコメント

サイトデザインの考え方(1)
Fireworks コレ、5分で作ります。その2
ボックス全体をリンクにしたい
  • Red - 2009.12.28
  • - 2009.12.28
  • なおと - 2009.12.29
  • kaz - 2010.07.22
  • Red - 2010.07.23
bodyにfont-size:62.5%を指定すると・・・
  • tack - 2010.06.26
  • Red - 2010.06.28
MODx スニペットを使ってみる
  • webd - 2010.06.07

メッセージを送る

name
e-mail
url
message