Я использую 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:
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";