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



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



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


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



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

949   7  

7 ответов:

PDOStatement->execute() возвращает true в случае успеха. Есть также 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 оператор, проверьте, была ли это ошибка, которую вы ожидали, и обработайте ее; или - если ошибка была другой -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

    Ничего не найдено.