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