PDO mysql: как узнать, была ли вставка успешной - PullRequest
82 голосов
/ 02 ноября 2009

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

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

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

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

Ответы [ 7 ]

116 голосов
/ 02 ноября 2009

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

23 голосов
/ 09 июня 2016

Учитывая, что наиболее рекомендуемый режим ошибок для 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

В случае успеха сообщит вам об этом, при ошибке отобразит обычную страницу с ошибкой, которую ваше приложение показывает по такому случаю.

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

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

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

9 голосов
/ 02 ноября 2009

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

8 голосов
/ 14 февраля 2014

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

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

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

3 голосов
/ 18 октября 2017

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

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }
0 голосов
/ 16 октября 2016

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

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

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

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";
0 голосов
/ 06 сентября 2016

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

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

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...