PHPよくある落とし穴
の編集
https://yassu.jp/pukiwiki/index.php?PHP%A4%E8%A4%AF%A4%A2%A4%EB%CD%EE%A4%C8%A4%B7%B7%EA
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
PHPは仕様がよく変わったりするので、ハマってしまうことが多々あります。 *POSTされた文字列が行方不明になる [#kc93b4fc] htmlspecialcharsを使っていると起こります。~ PHP5.4.0からデフォルトのエンコーディングが変更になったため、内部コードにEUC-JPやShift_JISを使用していると起こります。~ 第3引数にエンコーディングを指定しましょう。 &color(red){×}; $string = htmlspecialchars($string); &color(blue){○}; $string = htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'EUC-JP'); *現在のシーケンス値を取得しようとするとエラーになる [#r3c18d0b] 原因がPHPなのかPEARなのかPostgreSQLなのか不明です。~ いつの間にか取得できないようになってしまっていました。~ SQL文を直接指定してやれば動作します。 &color(red){×}; $seq = $mdb2->currID('seq'); &color(blue){○}; $seq = $mdb2->queryOne("SELECT currval('seq')"); *mbstring周りが同じなのに文字化け [#n55a9043] 異なるサーバで、mbstring周りの設定は同じで、プログラムも同じなのになぜか文字化けすることがあります。~ その場合は、output_buffering や output_handler も同じか確認してみましょう。 *floorすると誤差が出る [#q266a471] 計算結果をround, ceil, floorするのはよくあると思いますが、floorすると誤差が出てしまいハマりました。 // 7 echo floor((0.1 + 0.7) * 10); え、どうして8じゃないの?~ 一度文字列に変換すると期待した値になります。 // 8 echo floor(strval((0.1 + 0.7) * 10)); 正攻法はBC Math 関数を使用するらしいですが、面倒です。 詳しい説明はマニュアルにあります。~ https://secure.php.net/manual/ja/language.types.float.php
タイムスタンプを変更しない
PHPは仕様がよく変わったりするので、ハマってしまうことが多々あります。 *POSTされた文字列が行方不明になる [#kc93b4fc] htmlspecialcharsを使っていると起こります。~ PHP5.4.0からデフォルトのエンコーディングが変更になったため、内部コードにEUC-JPやShift_JISを使用していると起こります。~ 第3引数にエンコーディングを指定しましょう。 &color(red){×}; $string = htmlspecialchars($string); &color(blue){○}; $string = htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'EUC-JP'); *現在のシーケンス値を取得しようとするとエラーになる [#r3c18d0b] 原因がPHPなのかPEARなのかPostgreSQLなのか不明です。~ いつの間にか取得できないようになってしまっていました。~ SQL文を直接指定してやれば動作します。 &color(red){×}; $seq = $mdb2->currID('seq'); &color(blue){○}; $seq = $mdb2->queryOne("SELECT currval('seq')"); *mbstring周りが同じなのに文字化け [#n55a9043] 異なるサーバで、mbstring周りの設定は同じで、プログラムも同じなのになぜか文字化けすることがあります。~ その場合は、output_buffering や output_handler も同じか確認してみましょう。 *floorすると誤差が出る [#q266a471] 計算結果をround, ceil, floorするのはよくあると思いますが、floorすると誤差が出てしまいハマりました。 // 7 echo floor((0.1 + 0.7) * 10); え、どうして8じゃないの?~ 一度文字列に変換すると期待した値になります。 // 8 echo floor(strval((0.1 + 0.7) * 10)); 正攻法はBC Math 関数を使用するらしいですが、面倒です。 詳しい説明はマニュアルにあります。~ https://secure.php.net/manual/ja/language.types.float.php
テキスト整形のルールを表示する