hnwの日記

第70回PHP勉強会で浮動小数点数の話をしました

7月22日に開催された第70回PHP勉強会で発表してきました。以下が発表資料です。



浮動小数点数周りのトピックを3点紹介する内容でしたが、思ったより反応が良かったように思います。


ただ、面白おかしく話そうとして、聞いている方々に無駄に恐怖を与えてしまったかもしれません。冷静に読み返していただければ、怖いように見える内容もレアケースの話題が多いことがわかるかと思います。


また、PDOの挙動については誤解を与えてしまったかと思いますので、プレゼン資料の25ページ目を大幅に差し替えてアップロードしました。


この点についてもう少し説明します。PDOでプリペアードクエリを利用する際、プレースホルダに値を埋め込むのにPDOStatement::bindValueメソッドを利用することができます。この際、bindValueメソッドの第3引数で利用でPDO::PARAM_INT定数を指定しても、第2引数の変数型がstring型であれば、指定した値はSQL中では文字列リテラルとして展開されます。


下記URLでも同じ議論がされています。


プレゼン全体の結論はそれほど変わらないのですが、聞いている方を混乱させてしまったようでごめんなさい。改めてまとめると、PDOでプレースホルダの値を数値リテラルとして展開する方法は次のようになります。

  • bindValueメソッド(またはbindParamメソッド)の第3引数にPDO::PARAM_INTを指定する
  • bindValueメソッド(またはbindParamメソッド)の第2引数をint型、float型、またはbool型にする
    • bool型の場合は1または0になる


補足ですが、PDOStatement::executeメソッドの第1引数でパラメータ値を指定したような場合は、パラメータ型のデフォルト値がPDO::PARAM_STRINGであるため、常に文字列リテラルとして展開されますので注意してください。


最後に、このところ連続で会場提供いただいているEngine Yardさん、また運営の@yandoさん、ありがとうございました。