My開発メモ

PDO::PARAM_INTの挙動について (PHP)

PDO::PARAM_INTの挙動について調べたので、その結果をメモしておく。

準備

mysql

テーブル
CREATE TABLE test (
  num INT
);
SQL実行ログを記録する
set global general_log_file = "/var/log/mysql/mysql.log";
set global general_log = 1;

PHP

PREPARESエミュレータ : false
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$sql = "INERT INTO test (num) VALUES (:num)";

$stm->bindValue(':num', $num, PDO::PARAM_INT);
実行結果
整数の場合

prepare INSERT INTO test (num) VAlUES ( ? );
execute INSERT INTO test (num) VALUES ( 23 );

小数点の場合

prepare INSERT INTO test (num) VAlUES ( ? );
execute INSERT INTO test (num) VALUES ( 3.45 );

文字列の場合

prepare INSERT INTO test (num) VAlUES ( ? );
execute INSERT INTO test (num) VALUES ( '23' );
PREPARESエミュレータ : true
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

$sql = "INERT INTO test (num) VALUES (:num)";

$stm->bindValue(':num', $num, PDO::PARAM_INT);
実行結果
整数の場合

Query INSERT INTO test (num) VALUES ( 23 );

小数点の場合

Query INSERT INTO test (num) VALUES ( 3 );

文字列の場合

Query INSERT INTO test (num) VALUES ( 23 );

結論

PREPARESエミュレータが false の場合、PDO::PARAM_INT は
与えられた値をそのまま MySQL に渡す。

PREPARESエミュレータが true の場合、PDO::PARAM_INT は
与えられた値を整数に変換して MySQL に渡す。

カテゴリー: memo, php

タグ: PARAM_INT, PDO::PARAM_INT, PREPARESエミュレータ, sql

カウント: 27