Мой запрос не работает, если последний запрос имеет комментарий к нему. - PullRequest
0 голосов
/ 13 ноября 2018

мы боролись с некоторыми ситуациями в PHP, где некоторые запросы не работают.Мы обнаружили, что нерабочие запросы возникают только в том случае, если в последнем выполненном запросе есть комментарий.

В php у нас есть что-то вроде этого:

$getUsersQuery = "SELECT * from `users` where active = 1; ##DEVELOPER: JOE";
$getUsersStmt = $con->prepare($getUsersQuery);
$getUsersStmt->execute();
$users = $getUsersStmt->fetchAll();

$getProductsQuery = "SELECT * from `products` where active = 1; ##DEVELOPER: JOE";
$getProductsStmt = $con->prepare($getProductsQuery);
$getProductsStmt->execute();
$products = $getProductsStmt->fetchAll();

Для переменной $users она содержит точные данные, но в переменной $products она ничего не содержит.После нескольких минут настройки у нас появилась теория, что последний выполненный запрос имеет комментарий ##DEVELOPER: JOE.Мы удалили комментарий первого запроса, и второй запрос сработал.Мы проверили это, и теория доказана.Кстати, мы используем MySql и PHP 5.

Теперь мы знаем причину, как это происходит.Но наш вопрос в том, , почему это происходит?

Если у вас есть идеи, пожалуйста, закомментируйте их.Это будет большая помощь для нас.Благодаря.

1 Ответ

0 голосов
/ 13 ноября 2018

Виновником является не сам комментарий.Это сочетание наличия разделителя операторов ;, комментария и двух различных операторов.Вот более простой код для воспроизведения:

$stmt = $con->prepare('SELECT CURRENT_DATE; #');
$stmt->execute();
var_dump($stmt->fetchAll());

$stmt2 = $con->prepare('SELECT CURRENT_TIME');
$stmt2->execute();
var_dump($stmt2->fetchAll());
array(1) {
  [0]=>
  array(2) {
    ["CURRENT_DATE"]=>
    string(10) "2018-11-13"
    [0]=>
    string(10) "2018-11-13"
  }
}
array(0) {
}

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

Если вы вызываете PDOStatement::nextRowset(), все работает снова:

$stmt = $con->prepare('SELECT CURRENT_DATE; #');
$stmt->execute();
var_dump($stmt->fetchAll());
$stmt->nextRowset(); // <--- Retrieve the "phantom" result-set

$stmt2 = $con->prepare('SELECT CURRENT_TIME');
$stmt2->execute();
var_dump($stmt2->fetchAll());

В качестве альтернативы вы можете установить PDO::ATTR_EMULATE_PREPARES => false, чтобы PDO не анализировал SQL и не передавал задание на сервер MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...