こんなとき、あなたならどうする?
プレースホルダにバインドされる値が 文字列 、 NULL の2通りあって、どちらにも対応してSQLを発行しなければならないとき。
これらのケースは動作します。
SELECT * FROM test WHERE hoge = 'yeah'
SELECT * FROM test WHERE hoge IS NULL
ところがこれらは動作しません。
SELECT * FROM test WHERE hoge IS 'yeah'
SELECT * FROM test WHERE hoge = NULL
さてどうしましょう?
解決策1
プリペアドステートメントの生成時点で場合分けすればOK。
$array = array('yeah', null);
$value = $array[array_rand($array)];
$holder = $value === null ? 'IS NULL' : '= ?';
$stmt = $pdo->prepare("SELECT * FROM test WHERE hoge {$holder}");
$value === null ? $stmt->execute() : $stmt->execute(array($value));
解決策2
spaceship (宇宙船) っていうカッコイイ名前の演算子があるようです。
MySQLマニュアル を見てみると・・・
NULL-Safe だって!これはもう使うしかない!
$array = array('yeah', null);
$value = $array[array_rand($array)];
$stmt = $pdo->prepare("SELECT * FROM test WHERE hoge <=> ?");
$stmt->bindValue(1, $value, $value === null ? PDO::PARAM_NULL : PDO::PARAM_STR);
$stmt->execute();
これいいですね・・・!