PDO mysql: как узнать, была ли вставка успешной

Я использую PDO для вставки записи (mysql и php)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); 

Есть ли способ узнать, вставлена ​​ли она успешно, например, если запись не была вставлена, потому что это был дубликат?

Редактирование: конечно, я могу посмотреть на базу данных, но я имею в виду программную обратную связь.

PDOStatement->execute() возвращает true при успешном PDOStatement->execute() . Существует также PDOStatement->errorCode() который вы можете проверить на наличие ошибок.

Интересно, почему до сих пор нет правильного ответа.

Учитывая, что наиболее рекомендуемый режим ошибок для PDO – ERRMODE_EXCEPTION , никакая проверка результата прямого execute() никогда не будет работать . Так как выполнение кода даже не достигнет условия, предлагаемого в других ответах.

Таким образом, существует три возможных сценария обработки результата операции вставки в PDO:

  1. Чтобы сказать об успехе, проверка не требуется. Просто следите за потоком вашей программы.
  2. Чтобы справиться с непредвиденной ошибкой, сохраните то же самое – немедленный код обработки не требуется. Исключение будет выведено в случае ошибки базы данных, и оно будет всплывать до обработчика ошибок на сайте, что в конечном итоге приведет к общей странице ошибок 500.
  3. Чтобы обрабатывать ожидаемую ошибку, например, дублирующий первичный ключ, и если у вас есть определенный сценарий для обработки этой самой ошибки – тогда используйте оператор 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 , проверьте, была ли эта ошибка ожидаемой и обрабатывать ее; или – если ошибка была какой-то другой – перебросьте исключение, чтобы можно было обычным образом обрабатывать обработчик ошибок на сайте. Ниже приведен пример кода из моей статьи об обработке ошибок с 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, ie duplicate name } else { throw $e; } } echo "Success!"; 

В приведенном выше коде мы проверяем, чтобы конкретная ошибка выполняла некоторые действия и повторно выбрасывала исключение для любой другой ошибки (например, нет такой таблицы), о которой сообщается программисту.

В то время как снова – просто чтобы сказать пользователю что-то вроде «Ваша вставка прошла успешно», никаких условий не требуется.

Попробуйте просмотреть возвращаемое значение execute , которое имеет значение TRUE при успешном завершении, и FALSE при ошибке.

Если запрос обновления выполняется со значениями, совпадающими с текущей записью базы данных, тогда $stmt->rowCount() вернет 0 поскольку никакие строки не пострадали. Если у вас есть if( rowCount() == 1 ) чтобы проверить успех, вы считаете, что обновление if( rowCount() == 1 ) неудачно, когда оно не сработало, но значения уже были в базе данных, поэтому ничего не изменилось.

 $stmt->execute(); if( $stmt ) return "success"; 

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

Вы можете проверить количество строк

  $sqlStatement->execute( ...); if ($sqlStatement->rowCount() > 0) { return true; } 

PDOStatement-> execute () может вызывать исключение

так что вы можете сделать

 try { PDOStatement->execute(); //record inserted } catch(Exception $e) { //Some error occured. (ie violation of constraints) } 

Использовать идентификатор в качестве первичного ключа с автоматическим приращением

 $stmt->execute(); $insertid = $conn->lastInsertId(); 

инкрементный id всегда больше нуля даже на первой записи, поэтому означает, что он всегда будет возвращать истинное значение id coz больше нуля, означает true в PHP

 if ($insertid) echo "record inserted successfully"; else echo "record insertion failed";