#php #mysql #sql #mysqli
#php #mysql #sql #mysqli
Вопрос:
Может кто-нибудь объяснить мне, для чего используется mysqli multi_query()
? Я не понимаю, поддерживает ли простой запрос MySQLi несколько операторов или я вынужден использовать multi_query()
для выполнения такого запроса:
SET @row:=0;
SELECT * FROM (
select id,
@row:=@row 1 AS `rank` FROM `users` WHERE `points` <= 63 ORDER BY `points` DESC
) AS number
WHERE id = 1
Я спрашиваю об этом, потому что запуск $mysqli->query(ABOVE_STATEMENT)
возвращает мне синтаксическую ошибку .. несмотря на то, что выполняется тот же оператор в phpMyAdmin (устанавливается с использованием расширения mysqli), он успешно возвращает необходимые данные.
Комментарии:
1. phpmyadmin анализирует SQL перед отправкой его на сервер IIRC. поскольку это два запроса (разделенных точкой с запятой
;
), это phpmyadmin выполняет для вас два запроса (с одним и тем же подключением). Вы можете легко попробовать это и самостоятельно с помощью клиента командной строки mysql — если вам интересно изучить это немного самостоятельно.2. О, я понял ! Спасибо за разъяснение
Ответ №1:
Вам не нужно использовать multi_query для этого. @row
Переменная сохраняет свое значение в течение всего сеанса (т.Е. До тех пор, пока вы не отключитесь от MySQL).
Вы можете отправить SET
оператор и SELECT
оператор как отдельные запросы.
$mysqli->query("SET @row:=0");
$mysqli->query("SELECT * ... ");
Нет веских причин использовать мультизапрос. Есть веские причины не использовать мультизапрос.
Если кто-то скажет вам, что более эффективно использовать несколько запросов, потому что «одна поездка туда и обратно быстрее, чем две», скажите им, чтобы они показали вам тест, который это доказывает. Затем скажите им, что вы не планируете запускать тысячу запросов в одном запросе PHP, потому что это то, что потребуется, чтобы разница в производительности оказала какое-либо существенное влияние.
Комментарии:
1. Определенно не согласен, но я думаю, что суть вопроса в том, что OP, скорее всего, пытается выдать это как одну команду, а не две. Так что, может быть, просто уточните, что потребуется выдача двух команд.
2. технически, вы делаете. в этом примере запроса есть 2 оператора (
set
иselect
). базовый драйвер php mysql не допускает несколько операторов в одном вызове query () в качестве базового грубого механизма защиты от инъекций. множественный запрос выполняет некоторый базовый синтаксический анализ на стороне клиента, чтобы отделить отдельные операторы и запустить их как отдельные операторы.3. @MarcB, mysqli имеет функцию mysqli_multi_query() , которая активирует свойство множественных запросов и отправляет строку запросов, разделенных точкой с запятой, в базовый вызов C API mysql_real_query() .
4. @BillKarwin — это не
exec()
метод только для PDO? Я немного посмотрел, если это для MySQLi, и нет никакогоexec
метода, кромеexecuted
5. @edduvs, да, ты прав. Мой плохой. Я отредактировал выше, чтобы исправить это. Объект-оператор MySQLi имеет метод execute() .
Ответ №2:
mysqli_query
действительно, невозможно выполнить заданные вами запросы.
Если вы хотите использовать mysqli_multi_query
, то вы можете сделать следующее
$mysqli->multi_query(ABOVE_STATEMENT);
$mysqli->next_result(); # skip the first query result
$rs = $mysqli->store_result();
while ($row = $rs->fetch_row()) {
...
}
Ответ №3:
multi_query — это если вы делаете что-то вроде:
select * from somewhere;
select id from somewhere;
select names from somewhere;
Проверьте http://www.w3schools.com/php/func_mysqli_multi_query.asp
Обратите внимание, что вы должны сохранить первый результат, затем вызвать mysqli_next_result() для получения следующих результатов. Он выбрасывает их все в 1 пакет и возвращает их обратно вам.
РЕДАКТИРОВАТЬ: Марк B верен в комментарии, где вы технически используете 2 оператора, задавая строку. В этом случае вы используете несколько запросов. Сначала я этого не заметил.