Как управлять пустым запросом IN sql?

$ids = array(1,2,3); $in = implode(',',$ids); $query = "SELECT * FROM user where user_id IN ($in) "; 

Запрос не работает. Но когда $ids – пустой массив $ids = array();

Я получил ошибку запроса sql правильно, потому что SELECT * FROM user where user_id IN () не является допустимым запросом.

Как я могу избежать такой ситуации без проверки пустого массива, т. Е. Выполнения запроса, несмотря ни на что?

Лучший способ справиться с этим:

 $in = implode("','",$ids); // generate like 1','2 $query = "SELECT * FROM user where user_id IN ('$in') "; // if has 1','2 surrond it with quote make it IN('1','2') and if empty than IN('') 

Это избавит вас от структуры if / else и всего остального

вы не должны запускать запрос, когда $ in пуст. Я думаю, что вам нужно что-то вроде этого

 $in = implode(',',$ids); if($in) { $query = "SELECT * FROM user where user_id IN ($in) "; } else { //alternate scenario here } 

редактировать

 $in = implode("','",$ids); // generate like 1','2 $query = "SELECT * FROM user where user_id IN ('$in') "; // if has 1','2 surrond it with quote make it IN('1','2') and if empty than IN('') 

вы можете добавить 0 перед строкой $ ids. В конце концов ни одна иди не начнет с 0 в любой базе данных.

Или вы можете так поступить ..

 $sql = "SELECT * FROM user where ".($ids != ''? "user_id IN ($ids)" : " 1=1"); 

Обычно я всегда добавляю «недопустимое» значение, поэтому список никогда не пуст:

 $in = implode(',', array_merge($ids, [-1])); // never empty! 

Никаких дополнительных условных утверждений не требуется, сохраняя код относительно чистым. Разумеется, значение «недопустимое» должно быть вне диапазона допустимых значений. (В приведенном выше примере предполагается, что допустимые $ids всегда положительны.)

 if((count($in)>0) { //execute sql query code } 

Я выполняю несколько различных типов проверки в разных ситуациях, чтобы убедиться, что инструкция sql действительна. В самом базовом типе проверки я убеждаюсь, что переменная не пустая или ложная

 $in = implode(',',$ids); if(!$ids) $in="0"; $query = "SELECT * FROM user WHERE user_id IN ($ids)"; 

Как правило, я использую целую серию функций db_* которые проверяют ввод, который я db_* в запросы, чтобы я мог обрабатывать более продвинутые способы использования, проверяя, где массив $ids поступает из

Вот несколько тестовых кодов, которые хорошо работают для меня в десятках ситуаций.

 function db_number_list($lst) { if(!$lst) return "0"; // if there are no passed in values , return a 0 if (!is_array($lst)) $lst = explode (",",$lst); //if a lst was passed in, create an array foreach ($lst as $k=>$val) { if(!is_numeric(trim($val))) unset($lst[$k]);//remove non-numeric values; } if(!count($lst)) return "0"; //if nothing is in the array after removing non-numeric values, return 0 return implode (",",$lst); } $ids=array(); $query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")"; echo "ids:'".print_r($ids,true)."'<br>$query<hr>"; $ids="1,2,45,6,"; $query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")"; echo "ids:'".print_r($ids,true)."'<br>$query<hr>"; $ids=array(3,6,1,"drop table x", 4); $query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")"; echo "ids:'".print_r($ids,true)."'<br>$query<hr>"; 

Вывод:

 ids:'Array ( ) ' SELECT * FROM user WHERE user_id IN (0) 

 ids:'1,2,45,6,' SELECT * FROM user WHERE user_id IN (1,2,45,6) 

 ids:'Array ( [0] => 3 [1] => 6 [2] => 1 [3] => drop table x [4] => 4 ) ' SELECT * FROM user WHERE user_id IN (3,6,1,4) 

Вы должны установить условную конкатенацию:

 if (count($ids) > 0) { $in = implode(',',$ids); $query = "SELECT * FROM user WHERE user_id IN ($in)"; // .... } 

EDIT: исправлено мое недоразумение.

для данного запроса вы не должны запускать его вообще.

 if ($ids) { // run your code } else { return false; //or whatever. } 

для других случаев это может быть условная конкатенация, как показано в других ответах