Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

case-sensitiveには気をつけようね

( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \

だいぶ初歩的なところで┣¨┣¨┣¨はまりして死にたくなった。ハマるよりもハメたい。

僕、思い込んでたんだ。ほら、WindowsのMysqlってさ、大文字小文字区別しないじゃない。ホントはその段階で気づけって話なんだけどさ。で、自分のmysqlの「lower case table names」の変数を見たんだ。「1」だった。区別しないってことだ。Windowsのデフォルト通り。

が・・・。なぜかcakephpで区別するような挙動に出くわした・・・。ordernumはOKでORDERNUMではダメだった。カラムが無いと判断されsaveの戻り値はtrueだけどINSERTできていないわけ・・・。このsaveでtrue返すのやめて欲しいんだけど・・・。成功ならINSERTできたオブジェクト、しくじったらfalseにして欲しい。なんでtrueを戻すんだろう。判断に狂うから辞めてほしい。

ここでよーーーJavaだったらさーーーーNoSuchColumnErrorとかさーーーExceptionとか吐いてくれるからすぐにわかるわけーー。カラムがマッチしない・・・もしかして?みたいな感じ。でもゆるふわ言語のPHPの場合はフレームワークが優しくしてくれないとさーこういう類のエラーって返してくれないわけヨ。特にcakephpはコード見ないと最終的な正解が得られないこと多いから、ハマるとかなり大変な場合がある。

cakephpだけかもしれないけど、エラーが厳格じゃないつくりのものはデバッグしにくいんだよね・・・。その点Javaはナイス。めんどいけど。

cakephp1.3.3のmodelは「$data[モデル名][カラム名」」と「テーブルのカラム名」がcase-sensitiveなのがデフォルトみたいだよ・・・。こっちはWindowsのmysqlcase-sensitiveじゃないって思ってるから全然そこ意識してなかった。$data[model]['ordernum']って入れて実際のカラム名はORDERNUMって感じで。

だけど、modelCakePHPがcase-sensitiveに対応すべく大文字小文字の区別をしているようで、modelで取得したスキーマ情報と実際のカラム名が、DBMScase-sensitiveであるかは関係ないんだってさー。知らなかったよー。

これだから連想配列地獄のcakeピッチピチは困るorz

教訓

はじめからcase-sensitiveなコード書こうね。

よく考えたら

PHPは文字列の大文字と小文字を判別するせいだし、大文字と小文字がテーブルのカラムで統一されていないせいっぽいので死にたい。