MySQL несколько запросов - переменная set выдает логическую ошибку / как это пропустить?
-
22-07-2019 - |
Вопрос
Получил следующий простой запрос, который прекрасно работает через phpmyadmin, но когда я добавляю его на свой php-сайт, результаты не возвращаются и сообщений об ошибках и предупреждениях тоже нет. Если я удалю " SET @ N = -1; " тогда все работает нормально.
<?php
$db_connect = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, true);
mysql_select_db(DB_NAME, $db_connect);
$test_query = mysql_query("SET @N=-1;SELECT `id`, (@N:=@N+1) AS `mycount` FROM `mydb`;");
for ($i = 0; $i <= mysql_num_rows($test_query)-1; $i++) {
echo mysql_result($db_directorymap, $i, 0) . " " . mysql_result($db_directorymap, $i, 1) . "<br />";
}
?>
ОБНОВЛЕНИЕ: я только что перешел на mysqli, но, конечно, у меня все еще есть проблема с оператором mysql и mysqli_multi_query. Кажется, что при выполнении первой части запроса возвращаемые результаты пусты, поэтому выдается логическая ошибка. Я думаю, мне нужно пропустить первый набор результатов, но я не знаю, как это сделать?
Решение
Это потому, что функция mysql_query
будет принимать только один запрос, но вы дали ему два, разделенных точкой с запятой. Попробуйте либо:
Выполнение каждого запроса отдельно (не знаю, будет ли это работать):
mysql_query( "SET @N=-1" );
mysql_query( "SELECT `id`, (@N:=@N+1) AS `mycount` FROM `mydb`" );
Использование mysqli с функция multi_query (или эквивалент PDO , если он есть).
Чтобы ответить на ваш обновленный вопрос: проверьте страницу руководства PHP для multi_query. Я думаю, вы захотите использовать mysqli :: next_result
. Примерно так, используя процедурный стиль:
mysqli_multi_query($link, $query);
mysqli_next_result($link);
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
Другие советы
Многократные запросы через mysql_query не поддерживаются, поэтому я предполагаю, что это только выполнение команды SET, а не последующей команды SELECT.