Код ошибки PDO всегда 00000, даже если есть ошибка - PullRequest
3 голосов
/ 28 марта 2019

Я использую PHP 7.2.16

Не уверен при запуске, PDO errorCode () или errorInfo () [0] теперь всегда показывает 00000, даже если есть ошибка

$pdo = new \PDO('mysql:host=localhost;dbname=mydb', 'root', 'pwd');
$sth = $pdo->prepare('select now() and this is a bad SQL where a - b from c');
$sth->execute();
$row = $sth->fetchAll();
$err = $sth->errorInfo();
echo $sth->errorCode();
print_r($row);
print_r($err);

И вот результат:

00000Array
(
)
Array
(
    [0] => 00000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'a bad SQL where a - b from c' at line 1
)

Однако, я только что сделал новый тест, удалив $sth->fetchAll() или получив ошибку до этой строки, он показывает правильно:

Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'a bad SQL where a - b from c' at line 1
)

OK- решение состоит в том, что:

получить код ошибки сразу после execute() и перед любой выборкой

1 Ответ

2 голосов
/ 28 марта 2019

Я тестировал этот код с PHP 7.1.23:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$sth = $pdo->prepare('select now() and this is a bad SQL where a - b from c');
if ($sth === false) {
  echo "error on prepare()\n";
  print_r($pdo->errorInfo());
}
if ($sth->execute() === false) {
  echo "error on execute()\n";
  print_r($sth->errorInfo());
}

Вывод:

error on execute()
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a bad SQL where a - b from c' at line 1
)

Затем я тестировал тот же код, за исключением того, что отключил эмулированную подготовку:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Вывод:

error on prepare()
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a bad SQL where a - b from c' at line 1
)

Fatal error: Uncaught Error: Call to a member function execute() on boolean

Мораль истории:

  • При использовании эмулированных подготовленных утверждений prepare() является запретом, аошибка задерживается до execute().Я рекомендую отключить эмулированную подготовку, если только вы не используете базу данных, которая не поддерживает подготовленные операторы (я не знаю ни одной текущей версии какого-либо продукта СУБД, который не может выполнять реально подготовленные операторы).

  • При проверке на ошибку в prepare () используйте $pdo->errorInfo().

  • При проверке на ошибку выполнения () используйте $stmt->errorInfo().

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