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

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

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

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

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

Ответ 1

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

Ответ 2

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

Учитывая, что наиболее рекомендуемый режим ошибок для 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, проверьте, была ли эта ошибка ожидаемой и обрабатывать ее; или - если ошибка была какой-то другой - перебросить исключение, чтобы можно было обычным образом обрабатывать обработчик ошибок на всей территории. Ниже приведен пример кода из моей статьи об обработке ошибок с 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!";

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

В то время как снова - просто для того, чтобы сказать пользователю что-то вроде "Ваша вставка прошла успешно" Не требуется никакого условия.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Использовать id как первичный ключ с автоматическим приращением

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

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

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