У меня есть код ниже:
$sql3 = "update news set date='$time' where id='2'"; $sql3 = $connect->exec($sql3); if(!$sql3) { print_r($connect->errorInfo()); $error = $connect->errorInfo(); die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); }
Когда я запускаю скрипт, иногда я получаю номер ошибки «00000». Я имею в виду, что он входит в IF
. и все это случайным образом. вывод (иногда):
Array ( [0] => 00000 [1] => [2] => )
Что мне делать, чтобы исправить эту проблему?
PS: Сценарий выполняется правильно каждый раз.
Код ошибки PDO 00000
означает, что все работает нормально. Причина, по которой вы попадаете в код проверки ошибок, состоит в том, что $sql3
возвращает 0 (без каких-либо строк), а PHP оценивает это значение как false. Попробуйте явно проверить на return false;
if($sql3 === false)
Если exec не обновляет строку, она вернет 0., что делает if (! $ Sql3) равным false, вы должны сделать это вместо этого:
if($sql3 === false){ }
00000
означает, что он работает нормально. вы должны изменить его, если: $sql3 === false
.
Я только что получил аналогичную ситуацию в моем проекте php – выяснилось, что PDO Exception с кодом ошибки 00000 произошло, когда я попытался вставить строку с полем, установленным в NULL, тогда как столбец, определяющий поле в базе данных, имел тип ENUM('0', '1')
и ограничение NOT NULL . После того, как PHP-скрипт заменил «0» вместо NULL
, ошибка исчезла.
Дальнейшее кодирование принесло больше света в ситуацию – я выполнял несколько статусов PDO в рамках одной транзакции БД, но проверял ошибки (в блоке обработки исключений), основываясь только на первом заявлении PDO, выполненном, в то время как в третьем заявлении PDO произошла настоящая ошибка.
По моему опыту плохо сформированные запросы (синтаксические ошибки) и неудавшиеся запросы (например, INSERT, которые не вставляли ничего), также могут НЕПРАВИЛЬНО возвращать код ошибки 00000. Вы должны продолжить и попытаться выполнить полный запрос на своей консоли SQL и посмотреть почему это не удалось. Я действительно не знаю, почему правильное сообщение об ошибке не возвращается. Вот фрагмент кода, который мы используем.
$r = $pdo->prepare($sql); if (!$r->execute($input_parameters)) { # query failed if ($bLogFailures) { error_log('query failed: ERROR['.$pdo->errorCode().':'.print_r($pdo->errorInfo(), true).'] QUERY['.$sql.']'); } return false; }
У меня такая же проблема. Это также сильно пытало меня, но, в конце концов, выяснилось.
Предположим, у вас есть 7 столбцов в таблице.
Вы вставляете данные в 4 из них.
Если для остальных 3 столбцов значение по умолчанию не установлено (например, NULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc.
) NULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc.
возникает вышеуказанная проблема.
Если вы вставляете данные во все эти 7 столбцов или по крайней мере в те столбцы, для которых значение по умолчанию не установлено , вы не получите никаких ошибок, и данные будут вставлены.
Оператор PDO :: exec возвращает целое число, указывающее количество затронутых строк. Поэтому в вашем конкретном случае, как указывает SomeKittens, если были затронуты 0 строк, тогда будет выведен код ошибки.
Однако, если вас беспокоит вопрос о том, работал ли ваш запрос, вашим лучшим действием может быть использование PDO :: query (с точки зрения вашего кода ($ returnObj = $ connect-> query ($ sql3) вместо PDO :: exec.
Затем можно возвратить $ returnObj, чтобы проверить, была ли ошибка в выполнении SQL, и затем вы можете устранить ваш SQL-запрос, потому что он скажет вам, что такое ошибка и где она была расположена.
Лучше всего сделать это:
//set PDO to throw an error so you can wrap the query in a try / catch block. $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql3 = "update news set date='$time' where id='2'"; try { $returnObj = $connect->query($sql3); } catch (PDOException $e) { print_r($returnOjb->errorInfo()); $error = $returnObj->errorInfo(); die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); }