はじめに
MySQLのwhere inに空のリスト()を入れると下記の文法エラーが出ます。
その場合の対処法をご紹介します。
mysql> select * from users where id in ();
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
where inで文法エラーを出さない方法
空のリストではなく、nullを入れることで文法エラーが解消されます。
OKパターン
mysql> select * from users where id in (null);
Empty set (0.00 sec)
NGパターン
mysql> select * from users where id in ();
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
フレームワークでwhere inを使う時は注意が必要
FuelPHPの場合
MySQLを使っている場合は文法エラーにすぐに気づくことができますが、
フレームワークを使っているとMySQLの文法エラーに気づかないことがあります。
例としてFuelPHPでuserを検索するための、コードで説明します。
$idsというリストで検索するときに、$idsが空()の場合、MySQLの文法エラーになります。
$where = array(
array('id', 'in', $ids)
);
$users = Model_User::find('all', compact("where"));
そこで空のリストになり可能性がある場合は、三項演算子などでnullを入れてハンドリングすると文法エラーが発生することを防ぐことができます。
$where = array(
array('id', 'in', ($ids ? $ids : array(null)))
);
$users = Model_User::find('all', compact("where"));
コメント