PHPへの悪口

2019年1月11日

朝一から少しハマりましたのでその事についてちょいと

これは、ローカル環境と本番環境の設定の違いもあると思うので設定合わせろと言われればそれまでなのだけども

どんな悪口?

DBからの取得した数値の型が違う

厳密にはローカルではintやdoubleで返ってくるのに対して
本番環境ではstring型で返ってきてしまう

php.iniの設定なのか、はたまたMariDBとMysqlの違いなのか
調べてもまともな答えが無かった

いや、全く無かったわけではなく
下記サイトで原因は判明
なんでPHPはMySQLからのリザルトがint型のはずなのにstring型になってしまうん?

ATTR_EMULATE_PREPARESが原因?

ふむふむ、PDOの仕様だと
ATTR_EMULATE_PREPARESをfalseにすれば大丈夫!って書いてある

ローカル環境では「PDO::ATTR_EMULATE_PREPARES => false」がしっかり働いているのに
本番環境では働いていない様子・・・

何が問題?

そのせいでローカルで組んだ比較演算子の「=== 数値」が全滅
かといって「== 数値」にすると思わぬ動きをする可能性がある・・・
「=== ‘数値’」にするとローカルで正しく動かなくなる・・・

じゃあDBから取得した値でint型にしたいのは全部int型に変換してやれ!ってことで
intval(取得値)ってしたときには、取得値がNULLの時に0として扱われる

詰んだ・・・

ちなみに今はフレームワークのLaravelを使っていて、もしかしたら
「PDO::ATTR_EMULATE_PREPARES => false」 が使われてないのかもしれないと考えた
※ローカル環境での動きの説明がつかなくなるけども

結果としては下記ファイルにしっかり記載されていた
プロジェクト名\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php

表示も変わってしまう

ちなみにdouble型が文字列で返ってくる問題としては、
0 = ‘0.0″にならないことだ
echoで表示するときにも、数値の0.0は0で表示されるが、文字列の0.0は0.0になる

PHPの良いところは、文字列の数値も計算式に入れると数値として扱ってくれる
それが故に型違いに気づきにくいという悪い面も持ち合わせているって感じだ・・・

どうしよう

「xserver ATTR_EMULATE_PREPARES」で検索しても特に結果が出ない
ちなみにこの問題はLaravelを使う前に直でシステムを組んでいる時から気になってはいたが無視してた
その時は今みたいにハマる程ではなく、「あ~文字列になっちゃうか」くらいの認識だったから

ちょっとわかるようになってから、「なんじゃこりゃ!ふざけんなよボケが!」くらいになってしまった。。。
てか、なんで他の人ハマってへんねん!おかしいやろが!
ってくらいに朝から荒れてます

原因は?

ローカル環境とxserverでの本番環境の違いを探してみました
そしたら原因っぽいのがありました!

mysqlndの違い

xamppのシェルを起動して、php -mでモジュールを調べてみたところ
mysqlndがありましたが、xserverにはない
恐らくこれが原因かもしれない

左がxampp
右がxserver

これはもうダメかもわからんね
とりあえずローカルのmysqlndを無効化するしてタイトルとローカルを合わせるしか無いな

とりあえずサポート窓口にメールをぶん投げて、xamppのmysqlndを無効化する方法を探そう

ハマった時間→4時間・・・