カテゴリー機能は終了いたしました。まとめ作成時にはタグをご活用ください。

CakePHP+MySQLで、数値型カラムの結果を文字列ではなく数値で取得する

CakePHP+MySQLの環境で数値型カラムのデータを取得した戻り値も文字列になる。 これが問題となった事象のつぶやきに始まり、模索、原因究明、解決、ブログまとめ(http://t.co/u0EFeEKYFO)までの流れです。 ブログ記事の理解の助けにもなるのではないでしょうか。 なお、数値を文字列として返すDBIの仕様そのものは、問題ではなくむしろ安全であるとの見解が、タイムラインの最後の方にあります。
プログラミング PHP cakephp TIPS MySQL
0
まわたりなおと @mawatarin
CakePHPのRequestHandlerComponentでJsonViewを返す際、型の指定ってできないのかな?integerで受け取りたいんだけど、stringになってる。
まわたりなおと @mawatarin
フォーラムでも同じようなことがあがってるな。 cakephp と angularjs http://t.co/Ft1gHDPRtM
まわたりなおと @mawatarin
Cake側でやるんなら、ビューファイルを作って、レスポンスデータを加工するのが良いのかな?
まわたりなおと @mawatarin
へー、CakePhp-Backbone-Pluginなんてものがあるのか。コンポーネントがパッケージされてる。よくやるJSONの加工なんかが書かれてるみたい。 https://t.co/WaM7o6CHtM
まわたりなおと @mawatarin
ビューファイルを作って、intval()してみたんだけど、JSONは、stringのままだなー。うーん、どうすればいいんだろうか。
まわたりなおと @mawatarin
booleanがstringになるようなことはないから、何かやれば、できるんじゃないかと思うんだけどなー。
まわたりなおと @mawatarin
@mawatarin 訂正。ただの勘違い。できてた。
まわたりなおと @mawatarin
JSON云々じゃなくて、$this->model->find('all')の結果が、そもそもstringになっちゃってるな。
まわたりなおと @mawatarin
見つけた。これかなー? int型の列がDBから文字列として引き出されているのは、既知の問題なのか。チケットも上がってる。 int columns are pulled as string from DB in CakePHP http://t.co/MwWJ8uNsot
まわたりなおと @mawatarin
解決策が見つかるまで、afterFindコールバックで手動キャストするよう指南してある。CakePHP3.xで修正されるかもしれないってことらしい。(公式回答ではない)
まわたりなおと @mawatarin
今回は1カ所1回だけだから、JS側で処理するか、json/index.ctpで処理するかしよう。
まわたりなおと @mawatarin
tinyint(1)は、booleanにキャストするのにな。int(11)もintegerにしてくれれば良いのに。
cakephper @cakephper
@mawatarin PDOの問題かも。PHP5.3のMySQL NDってのを使えば解決するかも http://t.co/F0QWnQisFt
まわたりなおと @mawatarin
@cakephper なるほど。情報ありがとうございます。ちょっと調べてみます。
まわたりなおと @mawatarin
@cakephper 提供いただいた情報をもとに試してみましたが、状況変わらずでした。mysqlndに関しては、php5.4からはデフォルトで入ってるみたいです。 http://t.co/BvniAI54jz phpinfoでも有効になっているのを確認しましたが、ダメでした。
まわたりなおと @mawatarin
@cakephper 取り急ぎ、状況報告まで。もうちょっと掘り下げてみたり、別のやり方がないか探してみます。ありがとうございました。
cakephper @cakephper
@mawatarin ダメでしたか。。。こちらでも試してみますー
まわたりなおと @mawatarin
@cakephper 追伸です。 素のPHP(PDO, mysqli)でセレクトしてみても、int(11)はstringで出てきました。 フレームワーク側でうまいことやってくれたりしないかなと思いFuelPHP(PDO)でも試してみましたが、結果は同じでした。
まわたりなおと @mawatarin
@cakephper ここらで調査は、いったんクロージングします。アドバイスありがとうございました。
cakephper @cakephper
@mawatarin ありがとうございました。PDOでintで取得できる方法を探って試してみます
cakephper @cakephper
@mawatarin PDOのコンストラクタのフラグオプションで、PDO::ATTR_EMULATE_PREPARES => falseをセットするとintで返ってきました。
まわたりなおと @mawatarin
@cakephper おおお。こちらの環境でも確認できました!ありがとうございます。
cakephper @cakephper
@mawatarin Cakeの場合も出来るようになったので、後でブログにまとめますね
まわたりなおと @mawatarin
@cakephper おお。それは助かります。僕もCakePHPでRESTful APIを作ってBackbone.jsと連携させる方法をブログにまとめます。
まわたりなおと @mawatarin
先ほど知ったPDO::ATTR_EMULATE_PREPARESについて調べてみたんだけど、これは面白いな。セキュリティ面でも、このアトリビュートについて知っておかないといけないことがある。ググっても1万件弱しか情報が出てこないんだけど、もっと知られるべきだ。
残りを読む(12)

コメント

ズボラッカ @zuborawka 2013年8月23日
タイトルを更新しました。
ズボラッカ @zuborawka 2013年8月24日
まとめを更新しました。解説の追記、ツイートの追加、タイトルの修正。
ログインして広告を非表示にする
ログインして広告を非表示にする