掲示板を新しくしました(PHPでXMLを使う)
ってなわけで。
メインページの掲示板を新しくしました。
見た目もさることながら、
今回作りも大幅に変えてみたんです。
実は、今までの掲示板。
データはCSV形式で持ってたんですよ。
カンマ区切りってやつですね。
で、致命的な不具合に気づきまして。
「本文中にカンマがあるとちゃんと表示できない」
本文のカンマと区切り文字のカンマの区別が
つけられないわけですね。
なので、本文のカンマ以降の続きの本文は
次のデータ項目と認識されてしまうわけです。
CSV却下。
そんなわけで。新しい掲示板。
データをどう持とうかとあれこれ考えました。
データベースにするか。ファイルにするか。
データベースの場合の案1
馬のデータはMySQLというデータベースに入っています。
なので、掲示板のデータもあわせてMySQLへ。
データベースの場合の案2
PHPバージョン5以降でデフォルトでついてくる
SQLiteという簡易データベースを使用する
まあ掲示板のデータはWebから以外触ることないし、
PHPからすんなり動くならこれもありかと。
データベースの場合の案3
新し物好きなので、最近うわさの「Firebird」を使う。
今後、MySQLのデータも順次Firebirdへ移行。
でもね。
案1:馬のデータとあわせる必要あるの?あんまり負荷もかけたくないし。
案2:文字コードがISO8859-1しか使えない?
案3:なんかそんな元気ないなぁ。
そもそも
たかだか掲示板でデータベース使う必要あるの?
そんな書き込み多いわけじゃないんだし。
データベース案ALL却下。
ファイルか。
ってことで。PHPのマニュアルを読んでいて、こんな記述。
「PHPにはPOSIX拡張正規表現もしくはPerl正規表現から
XML文書の解析に至るまで 非常に便利なテキスト処理の機能があります。
XML文書の解析や操作のために SAXとDOMをサポートしています。
XML文書の変換にはXSLT拡張モジュールを使用することが出来ます。」
XMLか。
PHPマニュアルのXMLパーサ関数の項を見ていたら、
かなり使えそうでしたので、ちょろっと作ってみました。
XMLファイルをPHPの配列へ変換します。
XMLの構造は
<bbsdata>
<ma>おやID(新しいスレッドで増える)</ma>
<mi>こID(返信のときに増える)</mi>
<w_date>書き込み日付</w_date>
<w_mail>メールアドレス</w_mail>
<w_web>Webアドレス</w_web>
<w_title>タイトル</w_title>
<w_name>名前</w_name>
<w_detail>本文</w_detail>
</bbsdata>
な感じで。
//データをべたで変数に読み出して、
$data = implode("",file("XMLファイル名"));
//XMLパーサを作成します。
$p = xml_parser_create();
//大文字への変換はOFF
//(デフォルトだとXMLタグが全部大文字に変換されちゃいます)
xml_parser_set_option($p,XML_OPTION_CASE_FOLDING,0);
//これは何かわかんないけど、ないと動かない
xml_parser_set_option($p,XML_OPTION_SKIP_WHITE,1);
//で、読み出したXMLデータを配列へ
xml_parse_into_struct($p,$data,$vals,$index);
//XMLパーサは以上
xml_parser_free($p);
この時点で、
$vals[$index["ma"][n]]["value"]=(n+1)件目のデータのおやID
$vals[$index["mi"][n]]["value"]=(n+1)件目のデータのこID
ってな感じで。
あとはループとか多用しながら
使い勝手のいいように配列を整理していけば。
$bbsdata[おやID][こID]["w_date"]=日付
$bbsdata[おやID][こID]["w_title"]=タイトル
$bbsdata[おやID][こID]["w_detail"]=本文
みたいにね。
こうなれば、ページの構成は単純で
おやIDの0から最大までループ
|
| こID=0の(新規で書き込まれた)書き込み表示
|
| こIDの1から最大までループ
| (最大が0(返信がない)なら通らない)
| |
| | こID>0の(返信された)書き込みを表示
| |
| |
|
書き込むときは単純に
同じ構造でXMLファイルのケツに追記すればいいだけ。
XMLにしとけば、PHP以外でも何かと使えそうだし。
万が一jspとかservletとか使うようになってもすんなり移行できそうだしね。
なかなか使い勝手がいいので、
今後いろんなページで多用していこうかと思ってます。
リンク集とか。
そうだ。書き忘れ。
PHPのXMLパーサ関数は使える文字コードが限られてます。
(UTF-8とISO-8859-1とUS-ASCII)
けど、うまいことmb_convert_encoding(マルチバイトエンコーディング)関数とか使えば
SHIFT-JISでもEUCでもいけます。
うちは基本的にEUCですが、掲示板データはUTF-8で持ってます。
読み込むときに
$after=mb_convert_encoding($before,"EUC-JP","UTF-8");
書き込むときに
$after=mb_convert_encoding($before,"UTF-8","EUC-JP");
とすればいいだけなので、あまり問題ではないでしょう。
PHPマニュアル(日本語版)メインページの掲示板を新しくしました。
見た目もさることながら、
今回作りも大幅に変えてみたんです。
実は、今までの掲示板。
データはCSV形式で持ってたんですよ。
カンマ区切りってやつですね。
で、致命的な不具合に気づきまして。
「本文中にカンマがあるとちゃんと表示できない」
本文のカンマと区切り文字のカンマの区別が
つけられないわけですね。
なので、本文のカンマ以降の続きの本文は
次のデータ項目と認識されてしまうわけです。
CSV却下。
そんなわけで。新しい掲示板。
データをどう持とうかとあれこれ考えました。
データベースにするか。ファイルにするか。
データベースの場合の案1
馬のデータはMySQLというデータベースに入っています。
なので、掲示板のデータもあわせてMySQLへ。
データベースの場合の案2
PHPバージョン5以降でデフォルトでついてくる
SQLiteという簡易データベースを使用する
まあ掲示板のデータはWebから以外触ることないし、
PHPからすんなり動くならこれもありかと。
データベースの場合の案3
新し物好きなので、最近うわさの「Firebird」を使う。
今後、MySQLのデータも順次Firebirdへ移行。
でもね。
案1:馬のデータとあわせる必要あるの?あんまり負荷もかけたくないし。
案2:文字コードがISO8859-1しか使えない?
案3:なんかそんな元気ないなぁ。
そもそも
たかだか掲示板でデータベース使う必要あるの?
そんな書き込み多いわけじゃないんだし。
データベース案ALL却下。
ファイルか。
ってことで。PHPのマニュアルを読んでいて、こんな記述。
「PHPにはPOSIX拡張正規表現もしくはPerl正規表現から
XML文書の解析に至るまで 非常に便利なテキスト処理の機能があります。
XML文書の解析や操作のために SAXとDOMをサポートしています。
XML文書の変換にはXSLT拡張モジュールを使用することが出来ます。」
XMLか。
PHPマニュアルのXMLパーサ関数の項を見ていたら、
かなり使えそうでしたので、ちょろっと作ってみました。
XMLファイルをPHPの配列へ変換します。
XMLの構造は
<bbsdata>
<ma>おやID(新しいスレッドで増える)</ma>
<mi>こID(返信のときに増える)</mi>
<w_date>書き込み日付</w_date>
<w_mail>メールアドレス</w_mail>
<w_web>Webアドレス</w_web>
<w_title>タイトル</w_title>
<w_name>名前</w_name>
<w_detail>本文</w_detail>
</bbsdata>
な感じで。
//データをべたで変数に読み出して、
$data = implode("",file("XMLファイル名"));
//XMLパーサを作成します。
$p = xml_parser_create();
//大文字への変換はOFF
//(デフォルトだとXMLタグが全部大文字に変換されちゃいます)
xml_parser_set_option($p,XML_OPTION_CASE_FOLDING,0);
//これは何かわかんないけど、ないと動かない
xml_parser_set_option($p,XML_OPTION_SKIP_WHITE,1);
//で、読み出したXMLデータを配列へ
xml_parse_into_struct($p,$data,$vals,$index);
//XMLパーサは以上
xml_parser_free($p);
この時点で、
$vals[$index["ma"][n]]["value"]=(n+1)件目のデータのおやID
$vals[$index["mi"][n]]["value"]=(n+1)件目のデータのこID
ってな感じで。
あとはループとか多用しながら
使い勝手のいいように配列を整理していけば。
$bbsdata[おやID][こID]["w_date"]=日付
$bbsdata[おやID][こID]["w_title"]=タイトル
$bbsdata[おやID][こID]["w_detail"]=本文
みたいにね。
こうなれば、ページの構成は単純で
おやIDの0から最大までループ
|
| こID=0の(新規で書き込まれた)書き込み表示
|
| こIDの1から最大までループ
| (最大が0(返信がない)なら通らない)
| |
| | こID>0の(返信された)書き込みを表示
| |
| |
|
書き込むときは単純に
同じ構造でXMLファイルのケツに追記すればいいだけ。
XMLにしとけば、PHP以外でも何かと使えそうだし。
万が一jspとかservletとか使うようになってもすんなり移行できそうだしね。
なかなか使い勝手がいいので、
今後いろんなページで多用していこうかと思ってます。
リンク集とか。
そうだ。書き忘れ。
PHPのXMLパーサ関数は使える文字コードが限られてます。
(UTF-8とISO-8859-1とUS-ASCII)
けど、うまいことmb_convert_encoding(マルチバイトエンコーディング)関数とか使えば
SHIFT-JISでもEUCでもいけます。
うちは基本的にEUCですが、掲示板データはUTF-8で持ってます。
読み込むときに
$after=mb_convert_encoding($before,"EUC-JP","UTF-8");
書き込むときに
$after=mb_convert_encoding($before,"UTF-8","EUC-JP");
とすればいいだけなので、あまり問題ではないでしょう。
このネタへのコメント:
コメントはありません。