$ stmt-> execute (): Как узнать, была ли вставка в БД успешной? - PullRequest
37 голосов
/ 03 апреля 2012

Со следующим фрагментом кода, как мне узнать, что что-то было вставлено в БД?

if ($stmt = $connection->prepare("insert into table (blah) values (?)")) {
$stmt->bind_param("s", $blah);  
$stmt->execute();           
$stmt->close();                                 
}

Я думал, что добавление следующей строки сработало бы, но, видимо, нет.

if($stmt->affected_rows==-1){$updateAdded="N"; echo "failed";}  

А затем используйте $ updatedAdded = "N", чтобы затем пропустить другие фрагменты кода далее вниз по странице, которые зависят от успешности вставки выше.

Есть идеи?

Ответы [ 6 ]

72 голосов
/ 03 апреля 2012

Метод execute() возвращает boolean ... так что просто сделайте это:

if ($stmt->execute()) { 
   // it worked
} else {
   // it didn't
}
23 голосов
/ 03 апреля 2012

Проверьте возвращаемое значение $ stmt-> execute ()

if(!$stmt->execute()) echo $stmt->error;

Обратите внимание, что строка кода выполняет команду execute (), поэтому используйте ее вместо текущей $ stmt-> execute (), а не после нее.

6 голосов
/ 03 апреля 2012

Просто отметьте справочные страницы какой бы функции вы не использовали:

prepare () - возвращает объект оператора или FALSE, если произошла ошибка .
bind_param () - возвращает TRUE при успехе или FALSE при ошибке .
execute () - возвращает TRUE при успехе или FALSE при ошибке .
close () - возвращает TRUE при успехе или FALSE при ошибке .

На практике это раздражает и может привести к ошибкам. лучше сконфигурировать mysqli для выдачи исключений по ошибке и избавиться от всей конкретной обработки ошибок, за исключением нескольких случаев, когда ожидается ошибка (например, предварительная вставка, которая может нарушать ограничение уникальности):

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
5 голосов
/ 03 апреля 2012

, если вы хотите знать количество затронутых строк, которые вы можете использовать rowCount в операторе pdo

$stmt->rowCount();

после выполнения;

если вымы говорим об обработке ошибок. Я думаю, что лучший вариант - установить errmode для создания исключений и обернуть все в блок try / catch

try
{
    //----
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
2 голосов
/ 24 марта 2019

Вы можете проверить возвращаемое значение после выполнения:

if ($stmt->execute()) { 
    // ok :-)
    $count = $stmt->rowCount();
    echo count . ' rows updated properly!';
} else {
    // KO :-(
    print_r($stmt->errorInfo());
}
0 голосов
/ 20 августа 2017

Другой способ:

if ($stmt->error){
        echo "Error";
    }
    else{
        echo "Ok";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...