PDOのPDOStatement::bindParamの型指定

PDOのPDOStatement::bindParamは型を自動的に判別してくれないとのこと。
というわけで型判別してバインドする何か。

$stmt = $pdo->prepare($sql);
foreach($binds as $key => $bind){
	$type = PDO::PARAM_STR;
	switch(true){
		case is_bool($bind) :
			$type = PDO::PARAM_BOOL;
			break;
		case is_null($bind) :
			$type = PDO::PARAM_NULL;
			break;
		case is_int($bind) :
			$type = PDO::PARAM_INT;
			break;
		case is_float($bind) :
		case is_numeric($bind) :
		case is_string($bind) :
		default:
			$type = PDO::PARAM_STR;
			break;
	}
	$stmt->bindParam($key, $binds[$key], $type);
}

参考

全てにおいて、じゃないかもしれないが、postgresqlのint型はPHPのint型になってくれない。

三番目の引数に型情報を設定する機能があるけれど、それを設定しなくても自動で判別してくれるものだと思ってたら違ったみたい。

普通に配列として取得するようにfetch()すると型情報は自動判別されるのに、bindParam()でfetch()するとpostgresqlのinteger型は文字列として扱われていた。

PDOのPDOStatement->bindParam()では自動的に型が判別されない - ログ日記

パラメータに対して PDO::PARAM_* 定数を使った明示的なデータ型を指定します。 デフォルトは PDO::PARAM_STR です。

PHP: PDOStatement::bindParam - Manual
PDO::PARAM_BOOL (integer)
ブールデータ型を表します。
PDO::PARAM_NULL (integer)
SQL NULL データ型を表します。
PDO::PARAM_INT (integer)
SQL INTEGER データ型を表します。
PDO::PARAM_STR (integer)
SQL CHAR, VARCHAR, または他の文字列データ型を表します。
PDO::PARAM_LOB (integer)
SQL ラージオブジェクト型を表します。
PHP: 定義済み定数 - Manual