PHP-синтаксическая ошибка MySQL в скрипте, но оператор работает при вводе непосредственно в MySQL [duplicate]

$('#content').html('whatever');
28
задан Luiggi Mendoza 9 February 2016 в 15:37
поделиться

8 ответов

Да, это возможно без использования расширения MySQLi.

Просто используйте CLIENT_MULTI_STATEMENTS в 5-м аргументе mysql_connect.

Для получения дополнительной информации см. комментарии ниже сообщение Husni .

32
ответ дан Community 20 August 2018 в 17:01
поделиться
  • 1
    Меня в основном беспокоит производительность, которая, по моему мнению, будет уменьшаться, если мы ударим по базе данных два раза. – Prashant 29 April 2009 в 15:06
  • 2
    Сделайте тест, если вы не уверены. Время, затрачиваемое на выполнение запроса SELECT FOUND_ROWS () и получение результата, является несущественным. У вас уже есть соединение, и набор результатов чрезвычайно мал (всего одно целое). – Emil H 29 April 2009 в 15:10
  • 3
    Кстати, если вы беспокоитесь об эффективности, вы должны тратить свое время, пытаясь избавиться от заявления LIKE «% prashant%». Возможно, это настоящая проблема с производительностью. Как правило: шея бутылки для большинства приложений php не находится в php вообще, а скорее в базе данных. Если вы хотите потратить время на оптимизацию своего приложения, потратите его на анализ своих показателей и EXPLAIN: ваши запросы. – Emil H 29 April 2009 в 15:11
  • 4
    Хорошо, спасибо @Emil :) – Prashant 29 April 2009 в 15:13
32
ответ дан Community 31 October 2018 в 12:54
поделиться

Как ответили другие, API-интерфейс mysqli может выполнять многозадачные запросы с помощью функции msyqli_multi_query ().

Для того, что стоит, PDO поддерживает по умолчанию несколько запросов, и вы можете выполнять итерацию по нескольким результирующие наборы ваших нескольких запросов:

$stmt = $dbh->prepare("
    select sql_calc_found_rows * from foo limit 1 ; 
    select found_rows()");
$stmt->execute();
do {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
} while ($stmt->nextRowset());

Однако многопроцессор довольно часто считается плохой идеей по соображениям безопасности. Если вы не будете осторожны в том, как вы строите строки запроса, вы можете получить точный тип уязвимости SQL-инъекции, показанной в классическом мультфильме XKCD «Маленькие Бобби-столы» . При использовании API, который ограничивает вас одним запросом, этого не может быть.

7
ответ дан Bill Karwin 20 August 2018 в 17:01
поделиться

Нравится это:

$result1 = mysql_query($query1);
$result2 = mysql_query($query2);

// do something with the 2 result sets...

if ($result1)
    mysql_free_result($result1);

if ($result2)
    mysql_free_result($result2);
3
ответ дан Jon Benedicto 20 August 2018 в 17:01
поделиться
  • 1
    Разве он не хотел избегать выполнения mysql_query дважды? – Elazar Leibovich 29 April 2009 в 14:55
  • 2
    Да, я хочу избежать запросов mysql дважды. И в ответ @Jon Benedicto он выполняет два запроса. :( – Prashant 29 April 2009 в 14:57
  • 3
    Я только что опубликовал еще один ответ, в котором показано, как выполнять оба запроса в одно время с помощью MySQLi. – Jon Benedicto 29 April 2009 в 15:10

На сайте PHP указано, что несколько запросов НЕ разрешены (EDIT: Это верно только для расширения mysql. mysqli и PDO позволяют несколько запросов). Поэтому вы не можете сделать это в PHP, НО, почему вы не можете просто выполнить этот запрос в другом вызове mysql_query (например, пример Джона)? Он должен по-прежнему давать правильный результат, если вы используете одно и то же соединение. Кроме того, mysql_num_rows также может помочь.

0
ответ дан Michael Pryor 20 August 2018 в 17:01
поделиться
  • 1
    Это верно только для расширения mysql. mysqli и PDO допускают несколько запросов. – Ionuț G. Stan 29 April 2009 в 15:05

С помощью SQL_CALC_FOUND_ROWS вы не можете.

Число строк, доступное через FOUND_ROWS (), является переходным и не предназначено для доступа к оператору после инструкции SELECT SQL_CALC_FOUND_ROWS.

Как заметил кто-то в вашем предыдущем вопросе, использование SQL_CALC_FOUND_ROWS часто медленнее, чем просто получение счета.

Возможно, вам лучше всего сделать это как подзапрос:

SELECT 
 (select count(*) from my_table WHERE Name LIKE '%prashant%') 
as total_rows,
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
3
ответ дан tpdi 20 August 2018 в 17:01
поделиться
  • 1
    SQL_CALC_FOUND_ROWS медленнее, но в dev.mysql.com/doc/refman/5.0/en/… ссылке я нашел & quot; Однако это быстрее, чем запуск запроса снова без LIMIT, потому что результат набор не нужно отправлять клиенту. & Quot; ?? – Prashant 29 April 2009 в 15:00
  • 2
    Но не в этом случае, так как запрос не может использовать индексы. SQL_CALC_FOUND_ROWS приведет к однократной проверке таблицы, в то время как ваш подзапрос приведет к двум, и, следовательно, будет намного медленнее. Кроме того, вы забыли запятую после total_rows. – Emil H 29 April 2009 в 15:00
  • 3
    Да, ну, вы не выполняете запрос снова без ограничения. Вы используете счетчик (*), который отправляет одну строку. Действительно, у Эмиля Х есть хорошая точка - это микро оптимизация сомнительной ценности. Либо запускайте два запроса, либо если вы абсолютно должны это сделать, сделайте это как подзапрос, как я объяснил. (Эмиль Х, спасибо, что указал на отсутствие запятой). – tpdi 29 April 2009 в 15:06

Вы должны использовать MySQLi, ниже код работает хорошо

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>
2
ответ дан user 20 August 2018 в 17:01
поделиться
3
ответ дан Jon Benedicto 31 October 2018 в 12:54
поделиться
Другие вопросы по тегам:

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