$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. }
для других случаев это может быть условная конкатенация, как показано в других ответах