PDO mysql: как узнать, была ли вставка успешной
Я использую PDO для вставки записи (mysql и php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
есть ли способ узнать, если он вставлен успешно, например, если запись не была вставлена, потому что это был дубликат?
Edit: конечно, я могу посмотреть на базу данных, но я имею в виду программную обратную связь.
7 ответов:
PDOStatement->execute()возвращает true в случае успеха. Есть такжеPDOStatement->errorCode(), который вы можете проверить на наличие ошибок.
интересно, почему нет еще нет правильного ответа.
учитывая, что наиболее рекомендуемый режим ошибок для PDO является
ERRMODE_EXCEPTION,прямойexecute()проверка результата всегда будет работать. Поскольку выполнение кода даже не достигнет условия, предлагаемого в других ответах.Итак, существует три возможных сценария обработки результата операции вставки в PDO:
- для того чтобы сказать успех, никакая проверка не необходима. Просто продолжайте ваш поток программы.
- для обработки неожиданная ошибка сохранить с тем же - не требуется немедленная обработка кода. Исключение будет выдано в случае ошибки базы данных, и он будет пузыриться до обработчика ошибок всего сайта, что в конечном итоге приведет к общей странице ошибок 500.
- для обработки ожидаемой ошибки, такой как дубликат первичного ключа, и если у вас есть определенный сценарий для обработки этой самой ошибки - используйте
try..catchоператор.для обычного пользователя PHP это звучит немного чуждо - как это, не проверить прямой результат операции? - но это же как исключения работа-вы проверяете ошибку где-то еще. Раз и навсегда. Чрезвычайно удобный.
Итак, в обычном случае вам вообще не нужен код обработки. Просто держите свой код как есть:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); echo "Success!"; // whateverна успех он скажет вам так, на ошибку он покажет вам регулярную страницу ошибки, что ваш приложение показывает для такого случая.
только в случае, если у вас есть сценарий обработки кроме сообщения об ошибке, поместите оператор insert в
try..catchоператор, проверьте, была ли это ошибка, которую вы ожидали, и обработайте ее; или - если ошибка была другой -re-throw исключение, чтобы сделать его возможным для обработки обработчиком ошибок всего сайта обычным способом. Ниже приведен пример кода из моего статьи об обработке ошибок с ПДО: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!";в приведенном выше коде мы проверяем наличие конкретной ошибки, чтобы предпринять некоторые действия и повторно выбросить исключение для любой другой ошибки (например, без такой таблицы), которая будет сообщена программисту.
в то время как снова - просто сказать пользователю что-то вроде "ваша вставка была успешной" никакие условия никогда не нужны.
попробуйте посмотреть на возвращаемое значение
execute, которая составляетTRUEна успех, иFALSEна провал.
если запрос на обновление выполняется со значениями, которые соответствуют текущей записи базы данных, то
$stmt->rowCount()вернутся0для строк не были затронуты. Если у вас естьif( rowCount() == 1 )для проверки на успех вы будете думать, что обновление не удалось, когда он не потерпел неудачу, но значения уже были в базе данных, так что ничего не изменится.$stmt->execute(); if( $stmt ) return "success";это не сработало для меня, когда я попытался обновить запись с уникальным ключевым полем, которое было нарушено. Запрос вернул успех, но другой запрос возвращает старое значение поля.
вы можете проверить rowcount
$sqlStatement->execute( ...); if ($sqlStatement->rowCount() > 0) { return true; }
PDOStatement - >execute () может вызвать исключение
Итак, что вы можете сделать, это
try { PDOStatement->execute(); //record inserted } catch(Exception $e) { //Some error occured. (i.e. violation of constraints) }
использовать id в качестве первичного ключа с автоматическим приращением
$stmt->execute(); $insertid = $conn->lastInsertId();инкрементный идентификатор всегда больше нуля даже на первой записи, так что это означает, что он всегда будет возвращать истинное значение для id coz больше нуля означает true в PHP
if ($insertid) echo "record inserted successfully"; else echo "record insertion failed";
Comments