日記
もうすぐにぽたんの誕生日なので本気出す。
PHPの基本を復習しよう
自分は今まで参考書とGoogleを頼りにコードを書いていたが、
何かを見ながらだとなかなか覚えないよね><
ある程度、基礎的なことを理解したら(ってまだ理解してないんだけどドント・マインド)、
計算ドリル的なノリで、1000本ノックをするべし!するべし!!
で、PHPの簡単な練習問題を探してみた。
私はとても役に立ったので、PHPを勉強中の初心者の方には是非&ぜひオススメしたい!
以下、易しい順にリンク張っておくにょ。
■PHP基礎問題集(PreAlphaVersion) - 初心者のプログラミング体験記
# 基本中の基本をシンプルに復習。
もうちょい難易度が高い練習問題もあるけど、私はそっちはやってないw
■練習問題 - プログラミングスレまとめ in VIP
# これはなんとPHPの解答例が載っていないというまさかの村八分( ;Д;)
■【お題】PHP学習課題スレ【出せや】 - WEBプログラミング@2ch掲示板
# これは良かった。
疲れたときの3時のおやつには 『今の自分の心境をPHPで表すスレ』 がイイ!
■新しくプログラミング言語を覚えたいときに行うべき10の練習問題 - IDEA*IDEA
# ひゃ!
復習を兼ねた感想など(長いので適当にスルーしてくださいナ)
配列いじり † (練習問題 - プログラミングスレまとめin VIP)
配列の先頭はそのままに、先頭以外の要素をすべて0に置き換える。
例: 置換前 3 5 2 4 2
置換後 3 0 0 0 0
べにぢょの答え
<html>
<head>
<title>PHP練習問題 - 配列いじり</title>
</head>
<body>
<?php
$num = array(3,5,2,4,2);
foreach($num as $line){
echo $line;
}
echo "<br>";
$change = array(5,2,4);
$new_num = str_replace($change,0,$num);
foreach($new_num as $line){
echo $line;
}
?>
実行結果: 配列いじり - PHP練習問題
私の解釈は、出題者の意図とちと違っているような・・・。
確かに相違なく表示されているが、この問題ではこの方法の理解が問いたかったのだろうか?
うーむ。.....まぁいいか!!
一言メッセージ×10行のチャット、名前入力必要なし。 (【お題】PHP学習課題スレ【出せや】 の >>11)
これは分からなかったので、>>12の解答をググりながら解釈。
<?php
$log = @file('chat.log'); //chat.logを読み込んで$logに代入
if(!is_array($log)){ //$logが配列じゃなかったら
$log = array(); //配列にする
}
if(isset($_POST['monolog'])){ //$_POST['monolog']がセットされていたら
array_unshift($log, $_POST['monolog']."<br>"); //$logの先頭に$_POST['monolog']を追加
$log = array_slice($log,0,10); //$logの0番目から10番目までを取り出す
file_put_contents('chat.log',$log); //chat.logに$logを書き込む
header("location:2ch_12.php"); //リダイレクト
exit;
}
?>
<html>
<head>
<title>10行チャット - PHP学習課題スレ</title>
</head>
<body>
<p>10行チャット<br>
<form method = "POST" action = "2ch_12.php">
<input type="submit" value="送信">
<input type="text" name="monolog">
</form></p>
<?php
foreach($log as $idx=>$value){ //$logの要素を$valueに代入
echo "<hr>".$value; //$value表示
}
?>
<hr>
</body>
</html>
スレの解答例にはエスケープなかったけどいいのかな。
それと、ファイルを操作するときはロックをしないとまずいというのをどこかで読んだような・・・
どうなんだろう、この場合は要らないんだろか。
初心者がイキがって余計なことしない方がいいかな><と思ったが、せっかくの機会なので書いてみる。
べにぢょの答え(変更してない箇所は省略)
if(isset($_POST['monolog'])){
$post = htmlspecialchars($_POST['monolog'], ENT_QUOTES); //array_unshiftする前にエスケープ
array_unshift($log, $post."<br>");
さて、問題はどこでファイルにロックをかけるかだが・・・
$log = @file('chat.log'); の次はダメだ。
@flock($log,LOCK_SH); としたいところだけど、flock の第一引数はファイルポインタなので、
chat.log の内容を配列で読みこんだ $log は引数にできない。
となると、次にファイルに対してアクションを起こすのは file_put_contents('chat.log',$log);
だがしかし!こやつは開く&書き込むを1人でやってしまうので、止めに入る間がない。
くそぅ・・・万事休すか・・・・っ と思ったら、フラグていうのがあるらしい(゚∀゚)
じゃあ、これでいいのかな?
file_put_contents('chat.log',$log,LOCK_EX);
実行結果: 10行チャット - PHP学習課題スレ
ほ。とりあえずエラーは出ていない。
1人でチャットしながらコード直していったので、記念に貼っておく!
あ、そうだ。
下から2番目の「属性なの?」という発言について。
最初、「てすとだ」 とだけ書き込んだ chat.log をサーバーにUPしたのね。
そのあとフォームに 「ハローワールド!」 と入力して送信したんだが、何度リロードしても一向に変化なし。
「おい!聞いてるのか!!!」・・・なんて昔の私だったらキレるところだけど、
実はうすうすできない気がしていた。
アレだろ?パーミッションだろ?やっぱりな!そうくると思ってたぞ。
chat.log の属性を 666 に変えて、「属性なの?」 と入力してみる。
ほらキタ!書けた書き込めた!まいったか!
・・・という知られざるストーリーがあったのだった。とっぴんぱらりのぷぅ。
2ちゃんねるのスレなど見ていて思ったけど、他人が書いたコード見るのってちょっと楽しいね。