$ stmt-> execute():如何知道db insert是否成功?

cos*_*ari 38 php oop mysqli

使用下面的代码,我怎么知道有什么东西被插入到db中?

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

我原以为添加以下行会起作用,但显然不行.

if($stmt->affected_rows==-1){$updateAdded="N"; echo "failed";}  
Run Code Online (Sandbox Code Playgroud)

然后使用$ updatedAdded ="N"然后跳过页面下方的其他代码段,这些代码段依赖于上面的插入成功.

有任何想法吗?

Man*_*eUK 72

execute()方法返回一个boolean......所以这样做:

if ($stmt->execute()) { 
   // it worked
} else {
   // it didn't
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不能确保插件发生!只是没有错误. (3认同)
  • 我拿了一张使用这种方法的传单。我用谷歌搜索来确定,这让我找到了这个答案。已投票,以便更多的人会在他们的脚本中使用它。 (2认同)

Mat*_*ttP 23

检查$ stmt-> execute()的返回值

if(!$stmt->execute()) echo $stmt->error;
Run Code Online (Sandbox Code Playgroud)

请注意,代码行确实执行了execute()命令,因此请使用它来代替当前的$ stmt-> execute().


Álv*_*lez 7

只需查看您正在使用的任何功能的手册页:

prepare() - 返回一个语句对象或FALSE发生错误.
bind_param() - TRUE成功或FALSE失败时返回.
execute() - TRUE成功或FALSE失败时返回.
close() - TRUE成功或FALSE失败时返回.

但实际上,这很烦人,而且容易出错.最好配置mysqli以在错误上抛出异常并除去所有特定的错误处理,除了少数会出现错误的情况(例如,可能违反唯一约束的暂定插入):

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以在执行后检查返回值:

if ($stmt->execute()) { 
    // ok :-)
    $count = $stmt->rowCount();
    echo count . ' rows updated properly!';
} else {
    // KO :-(
    print_r($stmt->errorInfo());
}
Run Code Online (Sandbox Code Playgroud)


mis*_*shu 5

如果您想知道受影响的行数,可以在pdo语句上使用rowCount

$stmt->rowCount();
Run Code Online (Sandbox Code Playgroud)

执行后

如果您正在谈论错误处理,我认为最好的选择是将errmode设置为抛出异常并将所有内容包装在try / catch块中

try
{
    //----
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)