Ответ 1
PDOStatement->execute()
возвращает true при успешном завершении. Существует также PDOStatement->errorCode()
, который вы можете проверить на наличие ошибок.
Я использую PDO для вставки записи (mysql и php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Есть ли способ узнать, успешно ли он вставлен, например, если запись не была вставлена, потому что это был дубликат?
Изменить: конечно, я могу посмотреть на базу данных, но я имею в виду программную обратную связь.
PDOStatement->execute()
возвращает true при успешном завершении. Существует также 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, i.e. duplicate name
} else {
throw $e;
}
}
echo "Success!";
В приведенном выше коде мы проверяем, чтобы конкретная ошибка выполняла некоторые действия и повторно выбрасывала исключение для любой другой ошибки (например, такой таблицы нет), которая будет сообщена программисту.
В то время как снова - просто для того, чтобы сказать пользователю что-то вроде "Ваша вставка прошла успешно" Не требуется никакого условия.
Попробуйте найти возвращаемое значение execute
, которое TRUE
при успешном завершении и FALSE
при сбое.
Если запрос обновления выполняется со значениями, соответствующими текущей записи базы данных, тогда $stmt->rowCount()
вернет 0
, поскольку никакие строки не пострадали. Если у вас есть 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. (i.e. violation of constraints)
}
Использовать id как первичный ключ с автоматическим приращением
$stmt->execute();
$insertid = $conn->lastInsertId();
инкрементный id всегда больше нуля даже на первой записи, поэтому означает, что он всегда будет возвращать истинное значение id coz больше нуля, означает true в PHP
if ($insertid)
echo "record inserted successfully";
else
echo "record insertion failed";