WordpressでTwitterのtweetのIDを登録するとDB上で値が「2147483647」になる時の対処法


Wordpressで作ってるサイトにTwitterに投稿したtweetのIDをDBに登録するという処理を作ったところ、登録したデータが必ず「2147483647」になる状況に遭遇。
すんごい初歩的なミスですが一応メモ。

原因

  1. $wpdb->insertの第3引数(プレースホルダー)を設定してない。または、IDのプレースホルダーを整数型(%d)にしてる。
  2. 32bitシステム上でPHPを動かしてる
  3. 登録先のカラムのデータ型がbigintじゃなくてint

Twitter APIからの返り値は文字列なのですが、プレースホルダー無しでinsertを実行すると整数型に変換してSQLを実行されるっぽい。(原因1)(元のソースまで見に行ってない)
更に32bitシステムにおいて運用されているPHPの整数の最高値が「2147483647」だそうで。(原因2)(参考:php.net)
自分の環境では原因1と2によって登録される値が必ず「2147483647」になりました。

原因3は設計ミスなのですが、考えられる可能性として一応記載。

対処法

  1. $wpdb->insertの第3引数にプレースホルダーを設定する。プレースホルダーは文字列型(%s)にする。
  2. 登録先のカラムのデータ型がintだったらbigintにする。

教訓

面倒くさがらずプレースホルダーはキチンと設定しておく。

蛇足

文字列型で指定するのがセキュリティ面で怖い時はis_numericとかで事前に確認するといいかもしれない。