永遠のビギナーのブログ -91ページ目

PHP Hacks Hack#50

とりあえず、サンプル通りやると下の1行目が出力されない。

print "$userにメールを送信します。:\n$text\n\n";



mail_notification関数には$user,$textがきちんときていることを確認したので

変数を明示的に表示させるために下のように変更。

print $user."にメールを送信します。:\n".$text."\n\n";


基本的にutf-8で記述しているので、プロンプト上で日本語が文字化けする。

そこでプロンプトのタイトルバーでフォントをMSゴシックに変更してからプロンプトを再起動。


chcp 65001で文字コードをuft-8に変更。

(なぜかフォントはLucida Consoleに勝手に変わっている。)


こんどは日本語表示ができるが、いろいろおかしい。

具体的には

jack@oreilly.comにメールを送

You owe us some money. Pay up.


us some money. Pay up.

と表示される。期待しているのは

jack@oreilly.comにメールを送 信します。:

You owe us some money. Pay up.

となるはず。


1行目はコンソールを再描画するときちんと表示されるので、おそらくコンソールのバグと推定。

余分に表示されるのは再描画しても消えないので、実際にPHPが出力しているのだろう。


いろいろ試してみたがうまくいかないのでここで保留。

残念。


2009/7/20追記

VS2005のコマンドプロンプトはutf-8に対応していないらしい。

対応するようになったのはVistaから。従って文字化けは甘んじるしかない。

PHP Hacks―プロが教えるWebプログラミングテクニック/ジャック ヘリントン
¥3,780
Amazon.co.jp

PHP Hacks Hack#47

全然うまくいかなくて困った。

search.phpの$_FILESが空でちゃんと引きわたっていない。

そこでindex.phpを調べてみると、multipart/form-dataのiがなかった。


それでも、ちゃんと引きわたっていない。

いろいろ試行錯誤した結果、IEのキャッシュを消してみた。

これで何とかうまくいった。

キャッシュは便利だが、変更が反映されないのも考え物だ。


本日の教訓:

変更がうまくいっていないようなら、ソースを表示させてみて、キャッシュを消せ。

ただし全部消すと、いろいろうまくないことも起きるかもしれないから(通常のWebをみるのに使っていたりすれば)

フォームを消すぐらいにしておけ。


ちなみにIE7でフォームを消すのは

ツール→インターネットオプション→閲覧の履歴→削除→フォームデータの削除

でOK


PHP Hacks Hack#41

普通、テキストファイルを比較するとき空白は無視されて比較するソフトは多い。

大概のプログラムなんかは空白の数は無視したりするからだ。

(文字列の中なんかはのぞいて)

というわけで、schema.xmlを作成しても空白以外は同じとでたので、OKとおもった。

(私は自分好みの整形をよくするのでサンプルと変えることはよくある。

したがってこういうメッセージはでない方が少ない。)


でもって、gen.phpがうまく動かない。具体的にはXMLパーサーが呼ばれる回数と、

start_element関数が呼ばれる回数が違う。

いろいろ調べた結果、原因はschema.xmlにあった。

<schema>
<table name="book">
<field name="id"(このスペースがなかった)type="int" primary-key="true" />
<field name="title" type="text" />

...


不思議なことに一度XMLパーサーがこけると、次の行は正しく渡されても前回のエラーを引きずっているようだ。

たぶん、XMLパーサーが止まってしまうのだろう。

そのため、この行の解釈だけでなく、以降XMLパーサーの全ての処理がうまく動いていなかった。


そこでコードを次のように手直しした。

$parser = xml_parser_create();
xml_set_element_handler($parser, "start_element", "end_element");
$count_perser = 0;

while (!feof(STDIN)){
$text = fgets(STDIN);
if(xml_parse($parser, $text)){
$count_perser++;
}
else {
echo(xml_error_string(xml_get_error_code($parser))."\n");
}
}
xml_parser_free($parser);

echo("xml_perse=true:".$count_perser."\n");


これで、何行目まで正常に処理できて、どういうエラーが発生したかがわかる。

一度XMLパーサーがこけたら、以降xml_parse()がfalseを返し続けるからだ。


とりあえず今回の教訓:

☆エラーチェックは忘れずに。(当たり前だが)