Вот фрагмент моего кода:
$qry = ' INSERT INTO non-existant-table (id, score) SELECT id, 40 FROM another-non-existant-table WHERE description LIKE "%:search_string%" AND available = "yes" ON DUPLICATE KEY UPDATE score = score + 40 '; $sth = $this->pdo->prepare($qry); $sth->execute($data); print_r($this->pdo->errorInfo());
Это должно дать мне ошибку, потому что таблицы даже не существуют. Однако все, что я получаю, это:
Массив ([0] => 00000)
Как я могу получить лучшее описание ошибки, чтобы я мог отладить проблему?
Попробуйте это вместо этого:
print_r($sth->errorInfo());
РЕДАКТИРОВАТЬ:
Добавьте это перед подготовкой:
$this->pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
Это изменит тип сообщения об ошибках PDO и вызовет его предупреждение при возникновении ошибки PDO. Это должно помочь вам отследить его, хотя в вашей учетной записи errorInfo должна быть установлена ставка.
Старая нить, но, может быть, мой ответ поможет кому-то. Сначала я решил выполнить запрос, а затем установить переменную ошибок, а затем проверить, пуст ли этот массив ошибок. см. упрощенный пример:
$field1 = 'foo'; $field2 = 'bar'; $insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)"); $insert_QUERY->bindParam(':field1', $field1); $insert_QUERY->bindParam(':field2', $field2); $insert_QUERY->execute(); $databaseErrors = $insert_QUERY->errorInfo(); if( !empty($databaseErrors) ){ $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc... /* $errorLogMsg will return something like: error info: 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 'table bogus(field1, field2) VALUES ('bar', NULL)' at line 1 ) */ } else { # no SQL errors. }
Возможно, этот пост слишком стар, но это может помочь в качестве предложения для кого-то, кто обдумывает это: вместо использования:
print_r($this->pdo->errorInfo());
Используйте функцию PHP implode ():
echo 'Error occurred:'.implode(":",$this->pdo->errorInfo());
Это должно печатать код ошибки, подробную информацию об ошибках и т. Д., Которые вы обычно получаете, если используете пользовательский интерфейс SQL.
Надеюсь, поможет
Из руководства:
Если сервер базы данных успешно подготовит оператор, PDO :: prepare () возвращает объект PDOStatement. Если сервер базы данных не может успешно подготовить оператор, PDO :: prepare () возвращает FALSE или испускает PDOException (в зависимости от обработки ошибок).
Оператор подготовки, вероятно, вызвал ошибку, потому что db не смог подготовить отчет. Попробуйте протестировать ошибку сразу после подготовки вашего запроса и перед его выполнением.
$qry = ' INSERT INTO non-existant-table (id, score) SELECT id, 40 FROM another-non-existant-table WHERE description LIKE "%:search_string%" AND available = "yes" ON DUPLICATE KEY UPDATE score = score + 40 '; $sth = $this->pdo->prepare($qry); print_r($this->pdo->errorInfo());