'add',)となります。=>の左側がキーで、input,textareaではname=で与えられた文字列です。右側は値で入力された文字列が入ります。buttonのところは、入力する場所がなく、value=で与えられた文字列が値になります。どのボタンが押されたかが、"add"と"clear"で区別できます。''は空の文字列を意味します。値が定義されていない(1)と、値が''である(3)は異なる状態です。$_POSTから個別にデータを取り出す$_POSTは配列なので、値を個別にとるには[]内にキーを書きます。$_POST['title'];しかし、これだと上の(1)の様にtitleというキーがなかった時にNoticeがでます。その対策としては、isset()関数を使います。if文でもできますが、三項演算子を使うと便利です。falseのときは''というのを一度に書く方法です。buttonの値を取り出してページにh3要素、p要素として書き出します。"<p>($sender)</p>\n";//ここまで後に削除?>最後の$senderはページを要求してきたクライアントのIPアドレスです。定義済み変数(配列)です。画面にはこんな感じで入力して追加ボタンを押します。formに入力して追加ボタンを押す表示後のスクリーンショットです。画面に出すファイルに書き込みます画面に表示できたので、これをファイルに書き込むようにします。$titleが''の時には、書かないことにします。fclose($fp);}fopenの"a"はappendで、ファイルへの追加書き込みです。ウェブページは同時に複数のブラウザからアクセスされる可能性があります。書き込む前に他のアクセスをブロックしてから書き込んで、fflush()でバッファに溜まったものをすぐに書き込み、書き終わったらロック解除します。dateは書き込みの日時です。fwriteが実際に書く内容の指示です。4つの文字列をタブ区切りで行末に改行を入れて1行で書きます。fopenしたものはfcloseします。LOCK_EX);}stream_set_write_bufferの動作を確認していて、file_put_contentsを見つけました。PHP5から使えるようになっていました。fopenして読み書きし、fcloseで終了という、概念ではないやり方が流行っています。これも後で試してみます。どちらにしても、書き出すファイルを予め作って書き込み権限を与える必要があります。エラーログの時と同じです。memostore.txtファイルの読み出し追加書き込みするファイルから読み出してページに表示する部分を加えます。入力直後に表示する部分は削除してしまいます。}}まずfile_exist()でファイルが無い場合にもエラーを起こさないようにしておきます。file()関数は第一引数をファイル名として、ファイルを行ごとに読み出して文字列の配列を作ります。莫大なデータでなければ問題なくファイル全体を読み出すので便利です。これも最近のopen-closeを内部でやってしまう関数です。後ろに書いたフラグは、文字列に改行コードを残さないという指示と、空行(改行コードだけの行)を無視するという指示です。array_reverse()は配列の順序を逆転します。foreachは配列を1要素づつ、つまりはファイルの1行づつを反復処理します。htmlspecialchars()は、画面表示の時に必要になるものなので、忘れずに置きます。1行をタブで4つに区切って$title,$message,$date,$senderに分けて代入します。expload()の第3引数は、代入先が4つしかないので、制限をします。省略するとタブの数+1の配列にしてしまいます。これをh3とpのタグを付けて書き出します。2つ追加したときのスクリーンショットです。一応完成したかに見えますが、重大な欠陥があります。記事の枠は文章を入れる想定でtextareaにしましたが、ここに2行以上入れるとNotceがでて、表示もずれたりします。これは$messageの中に改行も文字として含まれてしまうためです。行ごとに読み出す時に$messageの途中の改行文字で途切れてしまい、タブの数が足りなくなります。次の行は$messageの続きから始まるので、ダータがずれ、やはりタブの数が足りなくなります。$messageはpタグに入れるので改行文字は半角スペースになってしまいます。pタグの中で改行するには<br>に変換する必要があります。書き込み前にこの変換をしてしまいましょう。読み込んだ後、htmlspecialchars()関数で&lt;br&gt;になってしまいますが、これをさらに<br>に戻すことにします。str_replace()関数は、次の$subject内の$searchを$replaceに置換します。$subject)しかも、$search,$replace共に配列を使用すると複数の置換を順にやってくれます。改行文字は、OSによって異なることがあるので3つ用意します。タブも入っていると項目がずれますので、スペースに変換しておきます。}}クリア書き込みの別解を使って簡単に作ります。このプログラムは実用というより習作ですから、溜まってきた試行錯誤の入力をバッサリ整理するためにあります。本来なら記事をひとつずつ書き換えたり、削除したりできるようになっているといいかもしれませんが、今回は簡単のためここまでとします。ウェブですから複数の人がアクセスして書き込むことが可能です。誰でも消去できるというのも問題なので、IPアドレスで制限を設けました。これも人で認証するしくみが欲しいかもしれませんが、ここまでにしておきます。消去したら消去したことがわかるように、読み出しの前に次のプログラムを加えます。}}2つあるボタンは、それぞれbuttonの値としてaddとclearを返します。このうちclearしか使っていません。clearでもtitleに値が入っていれば、データが書き込みされますが、すぐに消去されますので結果は同じです。titleが入っていない時にaddすると書き込みは行われず、消去もされないので、再表示となります。新規でこのページにきたときには、読み込みだけ行いますから、再表示と同じ動作になります。最終プログラムこのページのプログラムを組み合わせた最終形態です。記事の見栄えのためです。index.htmlに戻るボタン。//公開する時は0にします。}}?></body></html>UTF-8正当性チェックセキュリティ上の問題もほぼ無いと思います。ログをチェックせずに放置するならログへの記録をやめる、ini_set('log_errors','Off');がよいでしょう。正常な書き込みでもファイルは増加する一方ですから注意が必要です。スパム広告などの書き込みはこのまでは防げませんから長期運用なら認証などの対策が必要です。最近不正な文字コードを送りつけて、負荷をかけたり誤動作をさせるという攻撃があると聞いたので、ちょっと対策を考えてみました。フォームから入力することだけを考えるなら不要ですが、httpリクエストを直接送る分については自由に文字コードを操作できると考えられます。....mb_check_encodingの導入DebianやUbuntuでは、mb_check_encodingを使うためにパッケージが必要です。php-mbstringを入れます。debianでは、ディストリビューションの設定に基づき、PHPのバージョンにあったものが導入されます。02:31:16php-intlも導入したいcollator_asort()もついでに。日本語の辞書順を可能にしてくれます。下記は上とは違うホストのUbuntuのものです。10:34:36安達順一(2020-01-19)https://dabiyone.com/。