#author("2023-10-10T05:28:30+00:00","","")
PHPは仕様がよく変わったりするので、ハマってしまうことが多々あります。

*POSTされた文字列が行方不明になる [#kc93b4fc]

htmlspecialcharsを使っていると起こります。
htmlspecialcharsを使っていると起こります。~
PHP5.4.0からデフォルトのエンコーディングが変更になったため、内部コードにEUC-JPやShift_JISを使用していると起こります。~
第3引数にエンコーディングを指定しましょう。

× $string = htmlspecialchars($string);
&color(red){×}; $string = htmlspecialchars($string);

○ $string = htmlspecialchars($string, NULL, 'EUC-JP');
&color(blue){○}; $string = htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'EUC-JP');

*現在のシーケンス値を取得しようとするとエラーになる [#r3c18d0b]

× $seq = $mdb2->currID('seq');
原因がPHPなのかPEARなのかPostgreSQLなのか不明です。~
いつの間にか取得できないようになってしまっていました。~
SQL文を直接指定してやれば動作します。

○ $seq = $mdb2->queryOne("SELECT currval('seq')");
&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すると誤差が出てしまいハマりました。

 echo floor((0.1 + 0.7) * 10);
 // 7

え、どうして8じゃないの?~
一度文字列に変換すると期待した値になります。
 
 echo floor(strval((0.1 + 0.7) * 10));
 // 8

正攻法はBC Math 関数を使用するらしいですが、面倒です。

詳しい説明はマニュアルにあります。~
https://secure.php.net/manual/ja/language.types.float.php

JavaScriptでも同じことになりました。

 console.log(Math.floor((0.1 + 0.7) * 10));
 // 7

 console.log(Math.floor(((0.1 + 0.7) * 10).toFixed(1)));
 // 8


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS