Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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とかで事前に確認するといいかもしれない。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away