Виновником является не сам комментарий.Это сочетание наличия разделителя операторов ;
, комментария и двух различных операторов.Вот более простой код для воспроизведения:
$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.