@lemonlimelike

Правильное написание sql запроса?

Вот запрос
SELECT v.* FROM video_category INNER JOIN video_category vc ON vc.category_id = video_category.category_id INNER JOIN videos v ON v.id = vc.video_id WHERE video_category.video_id = " .(int)$_GET['id']." ORDER BY vc.video_id DESC LIMIT 9

Выдает ошибку Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in
Не знаю почему, прошу объяснить.
Вот полностью php запрос
$res = mysqli_query($connection, "SELECT v.* FROM video_category INNER JOIN video_category vc ON vc.category_id = video_category.category_id INNER JOIN videos v ON v.id = vc.video_id WHERE video_category.video_id = " .(int)$_GET['id']." ORDER BY vc.video_id DESC LIMIT 9");

$block_list = array();
while($row = mysqli_fetch_array($res)){
	$block_list[] = $row;
}
  • Вопрос задан
  • 300 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Мда, тостер уже не торт.
Сначала хотел пожурить автора вопроса, но потом увидел, ответы на его предыдущий вопрос...
Он ведь спрашивал, как защищаться от инъекций. Но в ответ получил только глубокомысленные рассуждения о том, что SQL инъекция без XSS невозможна(!!!).

В общем используй prepared statements и будет тебе счастье.
Ответ написан
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
не хватает хотя бы такого:
if($res) {
... //что вы там делаете
} else {
die(mysql_error());
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Astrohas
@Astrohas
Python/Django Developer
Откуда берётся ошибка

Эта ошибка возникает, если запрос не может быть выполнен. Функции, которые могут к ней привести:

mysql_fetch_array/mysqli_fetch_array()
mysql_fetch_assoc()/mysqli_fetch_assoc()
mysql_num_rows()/mysqli_num_rows()
Если с запросом всё в порядке, и просто результат его выполнения пустой, то ошибка не возникает. К ошибке приводит только неверный синтаксис SQL.

Как найти источник ошибки

Убедитесь, что на сервере, на котором вы ведёте разработку, включено отображение всех ошибок. Вы можете включить его из PHP, выполнив error_reporting(-1); (можно разместить этот код в конфигурационном файле вашего сайта, например). Если при попытке выполнения запроса будут обнаружены ошибки в синтаксисе, то они будут отображены.
Используйте mysql_error(). Эта функция вернёт строку с текстом ошибки, если таковая возникла при выполнении последнего запроса.

Например:
mysql_connect($host, $username, $password) or die("Ошибка подключения");
mysql_select_db($db_name) or die("Ошибка выбора БД");

$sql = "SELECT * FROM table_name";
$result = mysql_query($sql);

if ($result === false) {
echo mysql_error();
}
Выполните ваш запрос в командной строке MySQL или из инструмента вроде phpMyAdmin. Если в запросе есть синтаксическая ошибка, то она будет отображена.
Убедитесь, что в запросе верно расставлены кавычки. Это частая причина синтаксических ошибок.
Убедитесь, что вы экранируете ваши значения. Если в строке присутствует кавычка, это может привести к ошибке (а также сделать ваш код уязвимым к SQL-инъекциям). Используйте для этого mysql_real_escape_string().
Убедитесь, что вы не используете одновременно функции mysqli_* и mysql_*. Их использование нельзя смешивать. (Если вы не знаете, что выбрать, отдайте предпочтение mysqli_*.)
Советы

Не используйте функции mysql_* в новом коде. Разработчики PHP больше не поддерживают и не развивают их, они отмечены как устаревшие, и в будущих версиях будут удалены. Ознакомьтесь с понятием prepared statement и переходите на использование PDO (PHP Data Objects) или MySQLi (MySQL improved). Это избавит вас от проблем с экранированием значений и убережёт от SQL-инъекций.

И MySQLi, и PDO поддерживают режим, в котором при ошибках выбрасываются исключения. В новом коде следует использовать этот подход, потому что он помогает обрабатывать ошибки в одном месте, а не размазывать проверки по всему коду, и позволяет обработке ошибок не зависеть от внешних условий (от конфигурации).

Если вкратце, то PDO — это общий слой над базами данных, который позволяет относительно легко переключать СУБД; а MySQLi даёт доступ к некоторым дополнительным возможностям СУБД MySQL..
Источник
Ответ написан
Ваш ответ на вопрос

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

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