PHP掲示板その15

くもり今日はおやすみ。 8時過ぎに起きてダラダラ過ごす。
PHP掲示板でもやるかな~

今日やることは検索機能をつける。
マルチバイト正規関数というのを使って一致するかどうか調べる。
で、ログ内から見つかったものをリストアップする。 さらに、表示するときに一致した文字の背景に色をつける。
Googleのキャッシュ検索の表示みたいな感じのやつ。
ここまではすぐ作る事が出来た……
ただ、ここからが……
検索するときに半角スペースをあけるとor検索になるようにする。 たとえば「こんにちは おはよう」と入力したら「こんにちは」「おはよう」のどちらかが入ってる文章が検索されるように。
半角スペースはホントは&検索なんだけど、それはあとで修正しよう……
入力されたものを半角スペースか全角スペースで区切って配列に代入した。
まずは背景色をつけるところから。 今の検索対象は「本文」のみ。 本文中から配列[0]に入ってるものがあるかどうかチェック、あれば<font>をつけて色を変える。 それの繰り返し。
そしてここからがすっごい悩んだ。 表示の部分。

同じように配列[0]に入ってるものが本文中にあるかチェック。 あれば出力、そして配列[1]にに入ってるものがあるかチェック。 あれば出力そして配列[2]に行く。 という繰り返しをやっていたのだけど、本文中に「こんにちは」「おはよう」の両方があると、同じ記事が2つ出力されてしまう。
表示された記事番号を新しい配列に当てはめて、それのみを出力して試してみた。
検索のorを増やせば増やすほど、重複する。 そして「8,8,7,6,5,5,5,4,3,3,3,2,1,1」のように、同じ記事が複数回出力されてしまう。
どうやって直せばいいんだ~~~
「8,8,4,6,5,5,5,4,3,3,3,2,1,1」の配列から重複したものを削除しようとした。
関数でarray_uniqueというのがあったから使ってみたけど。
重複したものを削除するのだけど、やってみたら
[0] = 8
[2] = 4
[3] = 6
[4] = 5
[7] = 3
[10] = 2
[11] = 1
というふうに、重複したところが削除された。 だけど希望としては削除されたところを前につめてほしかった……
判れば出来るのかもしれないけれど、オレはそれが思いつかなかった。
なので元の配列をforとifで1つずつ順にチェックしていって重複しないように新しい配列に代入して行った。

だけど、今度はこれをどうやって使うのかわからなかった……

そんなこんな悩んで、どうやっても進まなくなった……

どうしてもできなくなって、PHPの本を読んでいた。 すると「break;」というのを見つけた。
これをforの中に組み込めば、そこでループが終わる!
さっそくやってみた。 そしたらできた!
こんな単純なことだったとは…… 悩んだ数時間がいったい……

サンプル
ソース
検索

ちなみに検索のチェックボックスと表示件数は飾りです。 まだ動作さしない……

妊娠

くもりタイトルの通り、妻が妊娠しました。
わかったのは9月上旬。 ずっと基礎体温をつけていて、普通なら低温期に入るはずなのに、ずっと高温期を維持している。 これは……!
と思い、検査薬で検査したら陽性。 で、病院に行って確認してもらったら妊娠しているとのことでした。
今11週目。 予定日は5月8日らしいです。 そんなに先なのに予定日なんてわかるのか……すごい!
エコー写真であかちゃんらしきものは見せてもらいました。 けどよくわからないな~
病院で、赤ちゃんの心臓が動いてる映像をビデオに撮ってくれたのだけど、VHSビデオを再生する機械がない……
ずっと日記で「妻の体調が悪い」と書いていたのは「つわり」だったんです。
これからどんどんお腹が大きくなっていくのかな~ 楽しみだな~

さて、今日は日曜日。 昼から妻と長女と不二家レストランに行く。 3人で出かけるのはかなりひさびさ。
不二家レストランでパフェとパスタを食べました。 パフェはなかなかおいしかった~♪

夜、ずっと前から楽しみにしていた番組を見ました。 それは「天使の梯子」という2時間ドラマ。
村山由佳原作の同名の小説がドラマ化された。 それと話が繋がっている「天子の卵」という小説もあり、これは昨日から映画化されている。 大好きな人の書いたものなので、楽しみ。 さて、見よう!
本を読んだのは2年前。 だいぶストーリーを忘れてしまったけれど、かなり楽しめた! ドラマのストーリーや感想を書いてしまうとそのイメージが崩れてしまうので割愛。

牟礼

晴れ今日は牟礼で仕事。 7時15分~17時まで。 社長は途中からいなくなったので早く終わった!

夜、野球の日本シリーズ日本ハムVS中日を見る予定だった……
だけど妻にテレビを取られて見ることができなかった……

明日は観音寺で展示会撤去の仕事がある予定だったのに、なしになった。
そして月火も休み。 こんなところで三連休……

寝坊

くもりたしか目覚ましを5時半にセットしたはずだった…… 2回は止めた覚えがある。 たしか全部で6回なるはず……
誰かがオレを揺らしている。 目を開けると妻がいた。
「起きて、仕事行くんやろ」と。
慌てて時計を見るとなんと6時25分…… うわ~、今日は6時40分から仕事なので、遅くても6時20分にでないと間に合わない……
夕べのうちに弁当も作ったし、顔を洗って着替えればすぐ出れる。 とりあえずどう頑張っても遅刻なので、社長に電話することに。
「すみません、寝坊して10分くらい遅れます」と。 そしたら、「じゃあ道の駅で拾うからそこで待ってて」と。
よかった~ たいして怒られなくてすみそうだ。
しかし、仕事で寝坊した事なんて今までで1度しかないはず。 18歳くらいのころスーパーのバイトの時、1時間くらい寝坊したかな…… それしか記憶にない。 明日から気をつけなくては……
しかし妻が起こしてくれなかったら……と考えると怖い。

今日は琴平でファイン1616。 不思議な事に社長が現場に来ると仕事がものすごい遅くなる。
いるだけでジャマ。 ずっと電話ばかりしてるし、グチグチ言うし、手直ししようとして逆にヒドクしてるし。
そんなわけで現場が終わったのが18時半……ありえん。 普通に2人で行っていたら16時には終わるようなものなのに。
道の駅直行で6時50分~19時10分解放。

明日も社長が現場にくるらしい……

ショッキングな事実

晴れ生まれてから23年9ヶ月ほど。 ずっと勘違いして覚えていた事があった。
それは小学校中学年程度の基礎知識。 それを今まで誤って覚えていた。
そう、それは都道府県の場所。 とある場所と隣の県を入れ違えて覚えていた……
その県とは……長崎県と佐賀県…… てっきり、福岡県の西にあるのが長崎県、その西にあるのが佐賀県だと思っていた…… しかし日本地図で確認したら、福岡県の西にあるのが佐賀県、その西にあるのが長崎県だったヽ(;´д`)ノ

こんな覚え間違いをしていたとは……恥ずかしい……
なぜ気づいたか?
いろいろなホームページを見ていたら「経県値」というのを測るものがあった。 名前の通り経験した県の値。
住んだ、歩いた、通過したなど項目を選んで行くもの。 自分のデータを入れて地図で確認してみたら……なんだかおかしい。 いや、おかしいのはオレの記憶の方だった。
実は長崎県には行ったことがあるけど、佐賀県には行った事が無い。 なので気づいた。
しかし長崎県の方が西にあるということは、佐賀県は絶対に車で通過したことがあるはず。 というと……まだ足を踏み入れた事の無い都道府県が1つ減る事になる!! まぁ車で通過しただけだけど。
残るは、奈良、和歌山、大分、沖縄の4県!!
さて、問題のオレの経県値はというと……
http://keiken.uub.jp/km.cgi?MAP=44444444444545444444445244340044432453441430340&NAM=U&CAT
ほとんどの県で泊まったことがある。 まぁ旅してたからね。

さて、PHP。
今日はあまり時間がなかったので管理モードのセッションだけいじった。
表現が間違ってるかもしれないけど気にしない。
パスワードを入れてログイン、記事を削除して「削除しました」画面でセッションを開始する。 セッションが開始されていたら、ログイン画面をパスして記事一覧画面へ。 記事一覧画面を表示したらセッションを解除する。 また記事を削除したらセッションを開始する。 このような流れでいいのかな。
記事一覧画面でセッションを解除しないと、削除ボタンを押してもその画面から動かない。 最初の分岐でセッションが開始されていたら、記事一覧に飛ぶとしてるから、$_POSTにdeleteが入るソースがもっと下にあるので、そこまで辿り着かないのかな? ソースの記述順序を変えればできるのかな? そのあたりはまた明日。

今日はURLリンクが文字モード
サンプル
ソース
管理モード
(パスはaaaa)

今日の仕事は円座で展示分ファイン1616、7時40分直行~18時40分まで。

PHP掲示板14

晴れ今日は松縄でキッチンの仕事。 7時15分~12時まで。 あ~今日も半日の仕事……

家に帰ってさっそくPHP掲示板。 昨日から頭の回転の調子がいい!
まずやったこと
・URL入力欄作成
・上のに伴い、URLリンク方法を画像or文字を選択できるように
・本文中にURLがあった場合それにリンクする
・管理者機能の作成

ざっとこんな感じかな。
URL入力欄はただ普通に増やしただけ。 ログの一番最後に記入するので、取り出したときに改行コードも一緒に取り出されるみたい。 なのでereb_replaceでを除去。
IEの仕様かわからないけど、URLを http://aaa.com/aaa のように、最後をスラッシュで閉じない場合、勝手にスラッシュで閉じてくれる? NetscapeでもFireFoxでも試したけど、ぜんぶ勝手に閉じてくれた。 まぁいいや。
書き込むときに正規表現でURLが変ではないかチェックしてもらう。

^(https?|ftp)://[0-9a-zA-Z]+[0-9a-zA-Z_./?#(&amp;)=%-]*$

頭に http:// , https:// ftp:// のいずれかがくる。
その後に0-9,a-z,A-Zのどれかが1回以上きて、0-9,a-z,A-Zか記号(./?#&=%~-)のどれかがくる(こないでも可)。 これをURLとして判断してる。
ちょっとめんどくて、メールアドレスみたいに細かくチェックしてないので……
そのうち細かくチェックするようにします。 ただ、URLの定義が相変わらずわからない。

本文中のURLにリンクする。 これは苦労した。
本文の中から上の正規表現を使って、URLを探す。 見つけたら、URLを<a href=”URL”>URL</a>に置き換えたいのだけど、どうやってやればいいのか全然わからず。 参考書を読む事十数分…… 「」とかいうのをみつけた。 これを使ってやってみたらできた。 やった~♪
ただ、複数のURLに対応するのがすごい難しかった。 改行されていればまだしも、同じ行にURLが2個以上あると……
それと、なぜだかわからないけど、同じ行に同じURLを記入すると、1つしか表示されない。 まぁこれはいいか。
返信するときに、リンクの<a href~~ が入らないようにはじく。
これで本文中のURLにリンクも完成!

そして
・URLリンク方法を画像or文字を選択できるように
0だったら画像、1だったら文字 を使うに設定した。 ただ実際は0だったら画像、0以外だったら文字にしてある。
画像の家アイコンは適当に作ってみた。 まぁこれは特に苦労することなくできたけど……これでいいのかな~

そして一番苦労した管理者モードの作成
とりあえずパスワードでログインするように。
ログインしたら、記事を表示する。 何件表示というのを設定すればいいのだろうけど、めんどうなので全件表示。
削除用のチェックボックス、記事番号、名前、題名、本文、日付、が表示してある。
削除したい記事にチェックして削除ボタンを押せば削除する! という機能。
文字で説明するだけならとても簡単だけど、これを作るのに何時間かかったことか……

チェックボックスにチェックされている記事ナンバーを配列に代入。
削除処理と同じスクリプトの内容を使って複数件の削除を考えた。
削除する順番は記事番号の大きい順。 小さい順だと、削除したあと記事番号が変わってしまうため。
削除する記事が10、15、30、47の場合、
配列[0]に47、[1]に30、[2]に15、[3]に10が入ってる。
それをループで回して、削除のループに入れる。
これでとりあえず完成!
文字で説明するとたったの7行。 実際にかかった時間は4時間ほど……
あと削除したあと、管理モードに戻るのにいちいちパスワードをいれないといけない。 これをなんとかしなくては。

とりあえず今日はここまで。
サンプル
ソース
管理者モード (パスはaaaa)

PHP掲示板13

晴れ今日は成合の西村ジョイの展示コーナーでお風呂撤去の仕事。 どうやら展示品が売れたらしい。 組み立てはあさって。 現地直行で7時50分集合。 お店が9時からなのでお客さんがくるまでになるべく撤去作業を進めて、邪魔にならないようにしなくては……
10時前くらいに撤去完了。 バラバラになったお風呂を近所にあるお客さんの家に持っていく。
今日は組まないけど、お客さんの家の庭にバラバラになったお風呂を置いて帰る。
11時くらいに仕事終了。
給料明細をもらった。
9月から日給が1000円アップしていた。 だけど、出勤日数が……たった15日。 4日は熱で休んだけれど…… 休みが多いな~ まぁ月初めに4連休、末にも4連休があったからなぁ。 それに比べて今月はすごいたくさん仕事がある。 今月は17日間のうち12日半仕事をした。 このペースだと22日くらい仕事があるのかな? 給料が1000円アップしたということは、22日で22000円アップ。 まぁまぁ嬉しいかな。
まぁ今の仕事も今月限り。 仕事内容に不満はないけれど、やっぱり給料がね~ 仕事のある月はいいけれど、無い月は半分もないし…… 5、6、8、9月とゴールデンウィークがあったし…… やっぱり望むは安定した収入。

うどんを食べて家に帰って、少し昼寝をする。
さて、ひさびさのPHP掲示板。 MySQLはちょっとおいといて……
そういえば、MySQLの日本語の謎がやっと解けた。
いろいろ検索で調べて
skip-character-set-client-handshake
とmy.iniに記入したら直った! それと文字コードのEUC-JPはどうやらeucjpmsではなくujisだったらしい……
それとPHPスクリプトのフィアルをやっぱりSJISではなくEUC-JP形式にした。 どうやらその方が望ましいらしい。
どの参考書みてもそう書いてあるしね。 なぜSJISではいけないのかは不明。
ということで、今日からEUC-JP。
さすがに返信機能を1から考えるのはとてもむずかしいので、kentのaska bbsを設置して、マネしました。

さて、とりあえずやったことをずらずらと。 方法は後ろの方で
・パスワードの暗号化のバグを修正
・書き込みました画面でリロードしたら、二重投稿禁止と出るようにした
・返信機能をつけた
・本文の一番最後に改行があった場合、それを消すようにした

方法
・パスワードの暗号化のバグを修正
パスが空の場合は暗号化しないようにした。 これによってログにはパスは0バイトで記入されるようになった。 記事を書いた人が消す事もできなくなった。

・書き込みました画面でリロードしたら、二重投稿禁止と出るようにした
write.phpで処理した。 変数に代入した時点で、ログの最終行(一番最近の記事)から名前と本文を抜き出す。
それを照らし合わせて内容が同じなら「二重投稿禁止です」とエラーを表示させるようにした。
ただ弊害が……
自分で、テスト用に記事を増やしたいとき、何度も書くのが面倒なので、更新を連打して、同じ記事で件数を増やしていたのだけど、それができなくなった。。。 まぁテストするのが面倒になっただけだからいいか。。。

・返信機能をつけた
これはすっごい苦労した。
まず仕様
返信ボタンを押すと、タイトルに
Re:[??] 題名
と表示されるように。 ??は返信元の記事ナンバー、題名は返信元の題名。
本文のテキストエリアに
> 本文
> 本文
のように、引用符をつけて表示する。 で、記事表示部分では引用された部分を色を変えて表示する。 色はとりあえず#804000にした。 Kentのaska bbsのデフォルトの色。 はい、マネです。
返信モードかどうかを判断するために、返信ボタンを押したときはURLに bbs.php?res=?? と表示
最後の??は返信元の記事ナンバー。 これをGETで取得して、テキストボックスにValueで表示。 テキストエリアに表示。
返信のタイトル。
Re:[??] 題名
と最初やっていたのだけど、返信にたいする返信、 記事5に記事6で返信、記事6に記事7で返信、記事7に記事8で返信した場合
Re:[7] Re:[6] Re:[5] 無題
のように Re:[??] の部分がひたすら増えていく…… これを最新の返信元のみRe:[??]にするように。
返信元のタイトルを取得した時点で Re:[??] があった場合はこれを消す。
Re:[6] 無題
というタイトルだったら、取得する時点で前の Re:[6] をはじいて 無題 のみ取得。
これを最新のRe:[??]と組み合わせて表示した。 ereg_replaceというのを使ったけどこれでいいのかな~ とりあえずできてるからいいか。
ただ手入力でタイトルを Re:[33]みたいに入力されてあって、それに返信した場合はそのタイトルが消されてしまう。 まぁそんなことする人はいないという前提で……

次に本文の引用。
行ごとに > で引用するので、行ごとに取得する必要が。
explode(“<br>” , 変数) で取得した。 だけどログ内の<br>が消されてしまうので、あとで行ごとに文末に<br>を付け加える。
行ごとに
> 取得した文章 <br>
と代入する。
元の文章が
123<br>
45<br>
67
というものだったら
> 123<br>
> 45<br>
> 67<br>
となる。 見てわかるように絶対に最終行にも<br>が入ってしまうバグが。
そのために
・本文の一番最後に改行があった場合、それを消すようにした
をした。
これで引用の第一段階は完成。

次にwrite.phpでの処理。
これも本文を行ごとに取得する。
文の始めに引用符があり<br>で終わるもの、文の始めに引用符がありそのまま終わるもの
以上の2つの場合、引用とみなして、色を変える処理。 ログに<font color='#??????'>文</font>を付け加える。
全ての行をあとで結合。 結合したやつをログファイルに書き込み。
これで完成!

ログに書き込む時点で<font color>を指定した事によって、返信する本文でバグが。
引用されたものを返信するとき、ログ内容を1行ずつ取得してそのまま表示すると
> こんにちは
という、すでに#804000に色が変わってるものを引用すると
> <font color='#804000'> > こんにちは</font>
と引用されてしまう。 返信の返信に対してのバグ。
これもereg_replaceで<font>を除去してみた。
最初は前の<font color~~>の部分を消す。 次に最後の</font>を消す。
両方を消したものを引用する。 これでいいのかな~
上の > こんにちは に返信すると
> > こんにちは
となるようになった。 これでいいっぽい。

本文を入力するときに自分で>というのを使うと色が変わるけど、これはaska bbsでもそうなったからいいや。 > の前にスペースをいれると、普通の文字色で表示される。

あともう一個。 引用符以降の文字色変更はきちんと動作するのだけど、デフォルトの文字色があるため
<font color='デフォルト色'><font color='引用色'> > 引用された文章</font></font>とかなるけど、これはいいのかな……?

とりあえず返信機能は完成。
レスがツリー式やテーブルでひとまとめになる掲示板ではないので、ここで終わり。 だけどそれらの掲示板だったらややこしそう。 けど、そのうちそれらのタイプの掲示板も作ってみなくては。

さて、今後の課題
・管理者機能をつける
・検索機能をつける
・本文中のURLにリンクをつける
・投稿欄でURLの入力部分をつける……はどうしようかな~。。。
・アイコンをつけられるようにする……もどうしようかな~。。。
・画像アップロード掲示板にしようかなぁ……

というか、掲示板を作り始める前に、仕様を全部決めておかなくてはならないのですね。。。
次のを作るときは、最初に全部決めなくては…… 今のはとりあえずただの勉強なのでゴチャゴチャ機能つけてみようかなぁ。。。

サンプル
ソース
ログ

夜の過ごし方

晴れ今日はミカドキッチン。 カップボードつき。 7時20分~17時15分まで。

最近、夜の過ごし方が変わってきた。 今まではずっとパソコンをやっている感じだったのだけど、最近では9時くらいに寝てしまったり、ベッドに入ってずっと話していたり。 パソコンやテレビから離れてる感じがします。
夕べもリビングの電気やテレビをつけたままベッドで話をしていたらいつの間にか寝てしまって、気づいたら1時。 テレビと電気とつけっぱなしのパソコンを消してそのまま寝た。

けっこう睡眠時間はあるはずなのだけど、毎日眠い…… こればかりは仕方ないのか。