MySQLi multi_query() любопытство

#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 оператора, задавая строку. В этом случае вы используете несколько запросов. Сначала я этого не заметил.