Я использую PDO для вставки записи (mysql и php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Есть ли способ узнать, успешно ли он вставлен, например, если запись не была вставлена, потому что это была дубликат?
Изменить: конечно, я могу посмотреть базу данных, но я имею в виду программную обратную связь.
if ($stmt->execute()) { //true }
PDOStatement->execute()
иPDOStatement->errorCode()
полностью друг с другом? Есть ли обстоятельства, приPDOStatement->errorCode()
которых что-то есть, ноPDOStatement->execute()
возвращает true? Или когдаPDOStatement->execute()
возвращается false, ноPDOStatement->errorCode()
ничего не имеет?Учитывая, что наиболее рекомендуемый режим ошибок для PDO - это
ERRMODE_EXCEPTION
, никакая прямаяexecute()
проверка результатов никогда не будет работать . Поскольку выполнение кода даже не достигнет условия, предложенного в других ответах.Итак, есть три возможных сценария обработки результата выполнения запроса в PDO:
try..catch
оператор.Для обычного пользователя PHP это звучит немного чуждо - как же, чтобы не проверить прямой результат операции? - но именно так работают исключения - вы проверяете ошибку в другом месте. Раз и навсегда. Чрезвычайно удобно.
Итак, в двух словах: в обычном коде обработка ошибок не требуется. Просто сохраните свой код как есть:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); echo "Success!"; // whatever
В случае успеха он сообщит вам об этом, в случае ошибки он покажет вам обычную страницу с ошибкой, которую ваше приложение показывает для такого случая.
Только в случае, если у вас есть сценарий обработки, отличный от простого сообщения об ошибке, поместите оператор вставки в
try..catch
оператор, проверьте, была ли это ожидаемая вами ошибка, и обработайте ее; или - если ошибка была другой - повторно вызовите исключение, чтобы обработчик ошибок всего сайта мог обработать его обычным способом. Ниже приведен пример кода из моей статьи об обработке ошибок с помощью PDO :try { $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data); } catch (PDOException $e) { if ($e->getCode() == 1062) { // Take some action if there is a key constraint violation, i.e. duplicate name } else { throw $e; } } echo "Success!";
В приведенном выше коде мы проверяем конкретную ошибку, чтобы предпринять какие-либо действия, и повторно генерируем исключение для любой другой ошибки (например, такой таблицы нет), о которой будет сообщено программисту.
И опять же - просто сказать пользователю что-то вроде «Ваша вставка прошла успешно» никаких условий не требуется.
источник
query()
функции? Могу ли я использовать try-catchquery()
вместоprepared()->execute()
?Попробуйте посмотреть на возвращаемое значение
execute
, которое являетсяTRUE
успешным иFALSE
неудачным.источник
Если запрос на обновление выполняется со значениями, соответствующими текущей записи базы данных, он
$stmt->rowCount()
вернется, так0
как никакие строки не были затронуты. Если у вас естьif( rowCount() == 1 )
проверка на успех, вы подумаете, что обновление завершилось неудачно, если оно не прошло, но значения уже были в базе данных, поэтому ничего не изменится.$stmt->execute(); if( $stmt ) return "success";
Это не сработало для меня, когда я попытался обновить запись с уникальным ключевым полем, которое было нарушено. Запрос вернул успех, но другой запрос вернул старое значение поля.
источник
if($stmt->execute() && ($stmt->rowCount()>0))
Вы можете проверить количество строк
$sqlStatement->execute( ...); if ($sqlStatement->rowCount() > 0) { return true; }
источник
SELECT
запросов (и даже там в документации говорится о нескольких запросах). Он ничего не говорит о томDELETE
,INSERT
илиUPDATE
, которые , кажется , будет хорошо работать (речь шла оINSERT
запросе). Однако я новичок в PDO, и если я ошибаюсь и у кого-то есть другие ссылки, напишите их здесь. Мне интересно узнать, есть ли реальные недостатки у трех приведенных выше команд.Использовать идентификатор как первичный ключ с автоматическим приращением
инкрементный идентификатор всегда больше нуля даже в первой записи, это означает, что он всегда будет возвращать истинное значение для id coz больше нуля означает истину в PHP
if ($insertid) echo "record inserted successfully"; else echo "record insertion failed";
источник
PDOStatement-> execute () может вызвать исключение
так что ты можешь сделать это
try { PDOStatement->execute(); //record inserted } catch(Exception $e) { //Some error occured. (i.e. violation of constraints) }
источник