Объясните пожалуйста, что за ошибка в функции?

Объясните пожалуйста, что за ошибка:
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /db_fns.php on line 226?


вот код самой функции:
function get_products($ids, $start_pos, $perpage){
	global $connection;
	if($ids){
		$query = "SELECT * FROM sdvd_products WHERE parent IN($ids) LIMIT $start_pos, $perpage";
	} else {
		$query = "SELECT * FROM sdvd_products LIMIT $start_pos, $perpage";
	}
	$res = mysqli_query($connection, $query);
	$products = array();
	while($row = mysqli_fetch_assoc($res)){       /*    226 строка это   */
		$products[] = $row;
	}
	return $products;
}
  • Вопрос задан
  • 2512 просмотров
Решения вопроса 1
@warmbellycat
Покажите как вы формируете $ids перед вызовом функции.
Должна быть строка/число.
Поле parent в таблице какого типа? Если int(и его варианты), то строка, где искомые значения разделены запятыми без каких-либо ковычек. Если varchar/text - то строка, где искомые значения разделены запятыми и обрамлены в одинарные кавычки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@litvinoffsky
WHERE parent IN($ids)
Что это?
ids - это массив или строка?
Скорее всего именно там беда.
var_dump($query) - вам поможет.
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
function get_products($ids, $start_pos, $perpage) {
  global $connection;
  $products = array();
  $query = "SELECT * FROM sdvd_products LIMIT $start_pos, $perpage";
  
  if($ids) {
    $query = "SELECT * FROM sdvd_products WHERE parent IN($ids) LIMIT $start_pos, $perpage";
  }

  if ($res = mysqli_query($connection, $query)) {
    while ( $row = mysqli_fetch_assoc($res)) {
      $products[] = $row;
    }
  }	

  return $products;
}
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
При выполнении mysqli_query произошла ошибка. $res содержит не курсор на результат запроса а false.
Ответ написан
@red_led
mysqli_query() возвращает FALSE в случае неудачи. А mysqli_fetch_assoc() хочет объект mysqli_result, а не FALSE.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это означает, что ошибка была в запросе.
По умолчанию mysqli не сигнализирует об ошибках в mysqli_query(). Чтобы заставить её делать это, надо перед коннектом написать волшебное слово:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Это самый простой, но менее удобный способ, поскольку в сообщении об ошибке нам желательно сразу увидеть и запрос с ошибкой. Поэтому лушче проверять результат запроса, и порождать ошибку РНР с ошибкой mysql и запросом.

Ошибка в запросе может быть вызвана чем угодно. В частности - мусором, переданным в запрос. Именно поэтому данные для запроса должны форматироваться только перед непосредственным выполнением запроса, а не где-то ещё!

Поэтому вместо того, чтобы продолжать писать на mysqli ТОТ ЖЕ САМЫЙ УРОДЛИВЫЙ ГОВНОКОДО, что и на mysql, надо использовать более интеллектуальный подход, который будет обеспечивать как форматирование, так и обработку ошибок:
function get_products($db, $ids, $start_pos, $perpage){
    if($ids){
        $query = "SELECT * FROM sdvd_products WHERE parent IN($a) LIMIT ?i, ?i";
    } else {
        $query = "SELECT * FROM sdvd_products LIMIT ?i, ?i";
    }
    return $db->getAll($query, $ids, $start_pos, $perpage);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы