headers already sent …

WordPressカスタマイズのお仕事をしていて・・・。
他のURLへリダイレクトする必要がある処理が出てきた。リダイレクトの処理は当然header関数を使用するわけなのだが・・・。
なんとしたことか「modify header information – headers already sent by …」なんてミスをやってしまった。ちなみにこのプログラム、実際に出力処理はしているのだが、ファイルの最初でob_start関数を実行し、出力を抑制している。にもかかわらず、エラーが出る。なんで?。
どうしても理由がわからないので、ファイルの一番最初にheader関数をもってきた。しかしそれでもエラー。なんで?、なんで?。
実はプログラムは何も悪くなかった。原因はBOM。ファイルを保存する際に誤ってBOMつきUTF-8で保存してしまったことが原因だった。
こんなところでもBOMではまってしまった・・・。

WordPress2.0系のバグ

2007/11/05 | SNS/CMS/ブログ

最近知ったWordPressのバグ。
WordPressの関数でprevious_posts_linkというのがある。カテゴリ表示などする際ページングで使用するための関数だ。本来なら&でつないだ前ページへのリンクURLを作成してくれるはずなのだが、2ページ目表示時の1ページ目に戻るリンクでおかしくなる。「#038;」がURLにはいるのだ。これ、つまり「&」が抜けちゃってるのだ。少しだけ見てみたけれど、いまだ原因を突き止めるにいたっていない(ちょっと手を抜きすぎかも)。
少しGoogled調べてみると、場当たり的な解決策が示されていた。「これイけてねぇ〜」とか思ったけど、面倒なのでそのまま使用した。実際使用したのはprevious_posts_link()と記述するところを以下のように書いた。

<?php // fixes pagination bug
if ($paged>1) {
$link = str_replace(‘#038;’,’&amp;’, get_previous_posts_page_link());
echo ‘<a href=”‘.str_replace(‘&&’,’&’, $link).'”>次へ » </a>';
}
?>

まぁ、いいっていえばいいんだけど・・・。とりあえず関数にしてもいいんだけど、ちょっと場当たりすぎ。新しいバージョン(2.2系)ではおこらないみたいなんだけど・・・、見比べるのが面倒なのでいまだ放置したまま。
時間があれば、解決策を練ることにする。

PHPスクリプトの文字コードSJISはOK?・・・わかりやすい説明

2007/11/04 | マイPHPメモ

スクリプトの文字コード問題、MLで大変わかりやすい説明をしていただいた。

mbstring.internal_encoding
mb_convert_encoding()の第三引数のデフォルトとして使われるものであって、スクリプトの文字コードを指定するものではない。

mbstring.script_encoding
スクリプトの文字コードを指定するものではあるが、使用できるのはPHPが–enable-zend-multibyteでコンパイルされている場合のみ。だから–enable-zend-multibyteが指定されていない環境では、やっぱりスクリプトの文字コードにシフトJISは使っちゃいけない。

うんうん。すごくわかりやすい。説明ありがとうございました。
やっぱダメなんじゃん、SJIS。

結局Shift_JISでPHPのプログラムは書いてもいいのか

2007/11/03 | マイPHPメモ

PHPのMLを見て再燃。シフトJISでPHPのプログラムを書いてもいいのか。

自分としては以前の記憶で「–enable-zend-multibyteが有効でないときはNG」ということでスクリプトをシフトJISで書くことはなかった。しかしPHP-MLを見て疑問が再燃。「PHP-users 32796」で大丈夫との発言がある。そのメールに書かれたPHP-devのスレッドを読んでは見たのだが・・・一回見ただけでは理解できなかっった・・・。
http://ml.php.gr.jp/pipermail/php-dev/2003-May/thread.html#761

何をもって「使えるか」、というのも難しい議論だ。先のスレッドで「substr関数でマルチバイト文字はバイト数を意識しないと使えない」というのがあったが、それと「シフトJISのPHPスクリプト中で能や表なんて文字がNG」という議論とはちょっと違うような気がする。それとも雲の上の人たちが考えていることというのは、一般プログラマの思考回路とはレベルが違うのだろうか・・・。

ちなみに今、使っているサーバでPHP4.3.2な環境がある。CentOS4.2とかならこの環境の人もいるんじゃないか?。セキュリティアップデートかけているだけならPHPのバージョンはかわらないから。

上記の環境でhtaccessでinternal_encoding、script_encodingにSJISを設定して以下のスクリプトを実行した(スクリプトはSJISで保存)。
print(“表”);

結果はエラーだった。やっぱ使えないじゃん。結局やっぱり「zend multibyte」が有効なんじゃないとダメなんじゃないの〜?。「zend multibyte」が有効なレンタルサーバがどれほどあるっていうんだぁ?。

これ、誰か詳しく解説してほしい。
php.iniのマルチバイト関連の設定も含めて、どのバージョンからどのように設定したらSJISが使えるようになるのか。

まぁ、自分はUTF-8で書くけどね。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net