ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

phpMixiBBSコミュのcal-bの前に豆腐を食べませんか?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
cal-bは確りとしたBBSにするべきだと思いますが…
しっかりとしたものを作ろうとするあまり、議論が先行しているというのが現状だと観察しております。(私見です)そして、実物が無いので議論が停滞している気もしております。

そこで、とりあえずtoufuという名前のBBSを先に作成する事にしました。
http://cal-b.sourceforge.jp/toufu/index.php
( ソース : http://cal-b.sourceforge.jp/toufu/index.phps )
この豆腐、実はまだ全然完成しておりません。そして、稚拙で突っ込みどころ満載な代物です。

いっそのこと、突っ込んでください。
そして、できれば直してください。
改良ソースを振りかけてください。
提案をしてください。
よろしくお願いいたします。

既に判明している問題:
クラスを利用していない
ファイルロックが出来ていない
書き込みファイルを全読み込みしている
ページングが出来ていない
コードとデザインが癒着状態

コメント(25)

#まさにIRCに指摘を書いただけだと消えてしまうでしょ?

半分以上既に指摘済のものばかりですが

・DOCTYPEとxml宣言の順番が逆?
・str_replace( "\n","<br />", $targetstr); => nl2br() でもいいかと.
・defineにはprefixを
ex)define( "BBS_FOO", "foo");
・「$mMode = $_POST['mMode'];」以下数行,存在チェック.
・「書き込む」内のhtmlspecialchars()抜け
・「$fp = fopen( FILE_PATH,'a');」エラーハンドリング
・input要素が閉じてない
・要素属性は「name = value」ではなく「name="value"」
・「$Strings = file( FILE_PATH);」ファイル存在チェック
・インデントのソフトタブ&ハードタブ混在

コーディングスタイルは最後のタブ混在以外はそれぞれの人で書き方があるのであえて指摘しません.
その他もロジックとして怪しいところ以外は合えて指摘していません.
$henakan_table = array( ","=>"#kanma",
"\""=>"#doubleko",
"\n"=>"#kaigyou"
);

これだけだと、双方向の変換が対称ではありません。
たとえば「#kanma」って書いたら、
変換して逆変換したら「,」に変わってしまう。
「"#" => "##"」とかを追加しましょう。

また、
str_replace( array_values( $table), array_keys( $table), $targetstr);
というふうに、毎回array_values()やarray_keys()をやるくらいなら、
変換テーブルを作らず、str_replace()を複数行記述した方が、
効率的だと思います。どれだけ効率的か評価できないですけどネ。

書き込み確認の前にenhenkan()をしてhiddenで出力し、
実際にファイルに書き込む前にdehenkan()していますが、
これではカンマ等をエスケープした意味が無いように思います。
違うかなあ?

加えて、表示の前にenhenkan()してるのもよくわかりません。

<form>のactionとしてPHP_SELFを指定していますが、
PHP_SELFには「index.php」の部分も含まれてしまうので、
このままだと、利用者にindex.phpが見えてしまうのが、
少々具合悪いです。

submitボタンのvalueによってモードを変えているようですが、
別のhiddenな値でモードを変える方が望ましいと思います。
日本語コードの自動判定が不安定なことがあるので。

コーディングスタイルは若干不思議な気持ちがしました。
> submitボタンのvalueによってモードを変えているようですが、
> 別のhiddenな値でモードを変える方が望ましいと思います。

ソースを見たわけではないのですが、上記について一言。
押されていないsubmitボタンのnameは送られないのを利用して、submitボタンのnameでモードを変えるという技もあります。
Googleで採用されていて、検索とI'm Feeling Luckyを、sumitボタンのname(btnGとbtnI)で振り分けています。

Hiddenを利用した場合、JavascriptがOFFだと苦しいですが、この方法ではJavaScriptも日本語を気にすることなく、モードの判別が可能です。
>押されていないsubmitボタンのnameは送られないのを利用して、
>submitボタンのnameでモードを変えるという技もあります。

それもありましたね。
つまり、簡単には、モードごとに違うnameのボタンを表示すると。

>Hiddenを利用した場合、JavascriptがOFFだと苦しいですが、

これがよくわかんなかったです。
詳細教えてください。
> >Hiddenを利用した場合、JavascriptがOFFだと苦しいですが、
> これがよくわかんなかったです。
> 詳細教えてください。

Hiddenを利用する=submitボタンが押された時にJavaScriptでHiddenの値を書き換える
と解釈したためです。
押されたボタンによって処理を分ける方法が他に思いつかなかったもので…。

私の早とちりでしたら申し訳ありません。
かねさんの想定しているHiddenを利用した方法をお教え願えないかと思います。
Otchyさん、

>かねさんの想定しているHiddenを利用した方法をお教え願えないかと思います。

いや、たいそうな方法じゃなくて、教科書にあるような方法です。
普通に、<input type="hidden" name="mode" value="1">とか
埋めておくだけの話なんです。
例のswitch/caseでは、この$_POST['mode']の値によって、
動作を変えます。

Googleを例に出していらっしゃってた、
送信ボタンの名前で判別する方法がシンプルかもしれませんね。

---
potatoさんの話、
XHTMLとか最近のHTMLは不勉強で…
elfさん>確かに…そうですね

○・DOCTYPEとxml宣言の順番が逆
○・str_replace( "\n","<br />", $targetstr); => nl2br() でもいいかと.
○defineにはprefixを
  TOUFU_をつけました。
○・input要素が閉じてない
○「書き込む」内のhtmlspecialchars()抜け
○・要素属性は「name = value」ではなく「name="value"」

△・「$mMode = $_POST['mMode'];」以下数行,存在チェック.
△・「$fp = fopen( FILE_PATH,'a');」エラーハンドリング
△・「$Strings = file( FILE_PATH);」ファイル存在チェック

?・インデントのソフトタブ&ハードタブ混在
…既に直っていたような…

かねさん>ありがとうございます。

○"#" => "##"の追加
△変換テーブルが非効率
ご意見募集中
△その他エスケープ絡みの問題
ただいま考え中

Otchyさん&かねさん>頑張ります。
△処理をボタンのnameで分ける方法に移行
是非コレにしたいと思いますが眠いので今日は…;;

potato さん>
○<td>→<th>
△HTML-lint にて完全エラー無し!
頑張ります〜
とりあえずHTML-lint さんから0点がもらえる仕様にしました(ぉ
あと、
・DOCTYPEとxml宣言の順番が逆
…逆にしたところHtmlLintに怒られました。

寝よう寝よう…。
PHP文書だとxml宣言を最初にするとw3cのvalidaterでも怒られますよね。これはPHPがxml宣言を簡易表記のPHPスクリプトだと勘違いしてエラーを出すからのようです。

xml宣言をまるごとecho文で書き出すと、大丈夫です(引用符はエスケープするのを忘れずに)。

って、ぼくも昨日知ったんですけど....。
オヤスミナサイ ° ° ° ° °
補足していただいてありがとうございます>かねさん

> Hiddenを利用する=submitボタンが押された時にJavaScript> でHiddenの値を書き換える
と解釈したためです。

私の想定していた詳しい状況を説明させて頂きます。

たとえば書込内容の確認画面では、「戻って書き直す」場合と、「そのまま書き込む」場合がありますよね。
いずれの場合にしても、書込画面で入力されたハンドルや本文などの内容は、次の画面へ引き渡さなければいけないわけです。

次の画面へ値を引き渡す方法としては、セッションを用いる方法と、リクエストに乗せる方法が考えられるかと思います。
ユーザの環境(Cookieなど)に関わらず動作をさせるために、リクエストに乗せるとすると、仮の書き込み内容はHiddenで持たせて、「戻って書き直」したり「そのまま書き込」んだりします。

ここで、押したボタンによって動作を変えるために、Hiddenで静的にモードを埋め込むとすると、仮の書き込み内容も2つ埋め込まなければならないので、なんだかスマートではありません。

そこで、仮の書き込み内容をHiddenで1つだけ埋め込み、押されたSubmitボタンのnameによってモードを切り替えれば、スマートではないかなという事です。

これをHiddenのモードで実現しようとした場合、JavascriptでHiddenのモードを切り替えてからSubmitを行うという手順になるかと思います。

以上です。
少々冗長でしたが真意が伝われば幸いですm(__)m
2: かね さん>>
> str_replace( array_values( $table), array_keys( $table), $targetstr);
> というふうに、毎回array_values()やarray_keys()をやるくらいなら、
> 変換テーブルを作らず、str_replace()を複数行記述した方が、
> 効率的だと思います。どれだけ効率的か評価できないですけどネ。

変換テーブル化した処理の提案と置換例は私の提案です.
パフォーマンスはあまり気にせずに「str_replaceに配列で渡した方が楽だよ?」
ということを伝えたいだけだったので,もう少し突っ込んで実装してみました.

http://elf.no-ip.org/php/examples/string/str_replace.php
#サーバーは他の処理をやっている場合があるので,手元のマシンで実行するか,数回リロードしてみてください(DoSしないでね!!

簡単にいうと変動しないなら1度array_keys(),array_values()すればさらに見やすくもなり,処理も早いです.

テーブル化することのメリットは前述のコードの簡潔さ,処理・メンテナンスの楽さにあわせ,
置換内容ないからロジックとデータの分離ができるので,設定ファイルなどにも格納できるというところです.
○1度array_keys(),array_values()する

△・「$mMode = $_POST['mMode'];」以下数行,存在チェック.
△・「$fp = fopen( FILE_PATH,'a');」エラーハンドリング
△・「$Strings = file( FILE_PATH);」ファイル存在チェック
△処理をボタンのnameで分ける方法に移行
△HTML-lint にて完全エラー無し!

?その他エスケープ絡みの問題
他にも問題がないか思考中。
かねさんご指摘の「ファイルに書き込む前にdehenkan()はおかしい」と言うのはごもっともです。完全に私のボケでした..。直しました。
現在の豆腐の現状…
○「$fp = fopen( FILE_PATH,'a');」エラーハンドリング
○「$Strings = file( FILE_PATH);」ファイル存在チェック
○ファイルロックが出来ていない

△「$mMode = $_POST['mMode'];」以下数行,存在チェック.
△処理をボタンのnameで分ける方法に移行
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。
△ページングが出来ていない

×HTML-lint にて完全エラー無し!
×クラスを利用していない
×コードとデザインが癒着状態
×スレッド表示がない
sourceforgeの方にHTML-lintで100点もらえるようにした(筈)のソースを置いておきました。

※ tabindex、accesskeyと言った軽度のエラーは出ます。

実際の使用ではまずありえないでしょうけれど
TOUFU_FILE_PATHが既存のディレクトリ名だった場合
エラーになるのではないでしょうか?
少々忙しく進んでおりませんでしたが、現状報告です。
○「$mMode = $_POST['mMode'];」以下数行,存在チェック.
○処理をボタンのnameで分ける方法に移行
○HTML-lint にて完全エラー無し!

次の予定
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。
△ページングが出来ていない
△スレッド表示がない

保留
×クラスを利用していない
×コードとデザインが癒着状態

visさん>
divをform直後に置き、form全体に掛ける事でlintを黙らせました〜
おかげさまで100点を取れる仕様になりました。
しばらく、所用で忙しく作成できない状態が続いておりましたが、そろそろ再開できそうです。今日は削除チェックコマンドを作りました。

今回書き加えたコードは、とっても冗長に見えますが気のせいです。
コマンド(カキコミ・カキコミチェック・削除チェック・削除・修正)ごとにファイルで分けてしまえばいいかも…と思い始めた為こんな感じになっております。
POSTもコマンド開始前に全て読み込んできていますし…実に問題は山積みです。

http://cal-b.sourceforge.jp/toufu/index.phps
こちらにソースを置きました。
明日、あさって辺りまでに削除コマンドを完成させ、その次はページング…。


次の予定
△削除が出来ない
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。
△ページングが出来ていない
△スレッド表示がない

保留
×クラスを利用していない
×コードとデザインが癒着状態
削除完成です。次はページング〜と、ソースの掃除を行います。

次の予定
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。
△ページングが出来ていない
△スレッド表示がない

保留
×クラスを利用していない
×コードとデザインが癒着状態
あー、帰ったらCVS更新しておきますね
お世話になります m(_ _)m
データーの保存ファイルが2つになり、dataディレクトリの中に入るようになっていたりと、微妙な修正も入っております。
現在、読み込み部分を関数化して将来のDB仕様に耐えられるように設計中です。
http://www.freespace.jp/~Pooh/Foolish/Foolish003.html
この辺りを見て考えてみると、fgetsをループで重ねるとパフォーマンスに大きな影響を与えるようです。
上記のページの内容を読み、考えるとfreadを利用するのがいいかも…とも思ったり。 (ならばデーターを固定長にすればいいのかも?)
でもfreadを使った関数って、後々意味不明になることが多いので避けたいですし…File関数のままでも問題が無いのかな〜と思ったりもします。

そもそも、メッセージのデーターに制限(500文字まで等)を加えるのがよいか、それともメッセージを別ファイルにして制限を加えない形にするべきか、 さらにそのメッセージを固定長のデーター形式にするべきか…
考察する必要が出てきました。

メンテナンス性を考えると前者の方(制限を加える方法)が圧倒的に優れているのですが、なんにせよ「制約」があるのはまずいかな〜とも思ったりします。

制約を取っ払うのはDBを使用するときだけに縛ればいいのかな?とりあえずの豆腐だし…とも思ったり思わなかったり。

うーむ^^;
いっつも用途別にDBとテキストを使い分けているのでこういった事を考える機会がないんですよねぇ…。
データが多くなることが予想される時点でDB使っちゃいますし、少なければテキストベースでfile()で読んじゃえばいいやって感じです。
でも、1行分読みたいとなるとfgets()やらfgetcsv()やらに頼る必要があるんですよねぇ…。
読み書きのスペックをそこまで考えるか、どこまでの規模で使うのかにもよるとは思います。
あんまり重くなったらSQLiteで(ぉ
カキコミは少し注意して行きます。
読み込みに関してはfile関数で片付けてしまっても問題ないかも…です。でも、諸兄方々のご意見だと、メモリ圧迫になるのでまずいという話もございましたね…うーむ…作って試してみる事にしますね…。

というわけで、fget版とfile版を混在させたスクリプト作成してみました。(サンプルですのでまだ作動させたわけではありません。)
あとはコレを呼び出すスクリプトを書いて、元の掲示板スクリプトでも使えるように調整して行きます。
http://cal-b.sourceforge.jp/toufu/get_ls_sample.phps

予定
△読み込みスクリプトの関数化(クラス化への一歩目)
△コマンドswitch毎にデザインファイルをrequire_onceしてコードとデザインを分離する
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。(?)
△ページングが出来ていない
△スレッド表示がない
読み込みスクリプトの関数化が大体出来ました。コレを元にページングを実装してみます。


○読み込みスクリプトの関数化

予定
△コマンドswitch毎にデザインファイルをrequire_onceしてコードとデザインを分離する
△書き込みファイルを全読み込みからメモリを圧迫しない仕様へ。(?)
△ページングが出来ていない
△スレッド表示
ソース
http://cal-b.sourceforge.jp/toufu/toufu-get_ls.phps
http://cal-b.sourceforge.jp/toufu/index.phps

実行ファイル
http://cal-b.sourceforge.jp/toufu/index.php

削除コマンドの一部が機能しなくなってしまっておりますが、それも修正中です。

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

phpMixiBBS 更新情報

phpMixiBBSのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング