Подтвердить что ты не робот

Сообщение об ошибке PDO?

Вот фрагмент моего кода:

$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)

Как я могу получить лучшее описание ошибки, чтобы я мог отладить проблему?

4b9b3361

Ответ 1

Попробуйте это вместо:

print_r($sth->errorInfo());

EDIT:

Добавьте это перед подготовкой:

$this->pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

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

Ответ 2

Старый поток, но, может быть, мой ответ поможет кому-то. Сначала я решил выполнить запрос, а затем установить переменную ошибок, а затем проверить, пуст ли этот массив ошибок. см. упрощенный пример:

$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.
}

Ответ 3

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

 print_r($this->pdo->errorInfo());

Использовать функцию PHP implode():

 echo 'Error occurred:'.implode(":",$this->pdo->errorInfo());

Это должно печатать код ошибки, подробную информацию об ошибках и т.д., которые вы обычно получаете, если используете пользовательский интерфейс SQL.

Надеюсь, что это поможет

Ответ 4

Из руководства:

Если сервер базы данных успешно готовит выражение, 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());