【问题标题】:How to check whether inserting fails?如何检查是否插入失败?
【发布时间】:2016-09-17 12:17:31
【问题描述】:

这是我的脚本:

try {

    $stmt = $db_con->prepare(" INSERT INTO mytable ( col ) VALUES ( ? ) ");
    $inserting = $stmt->execute( array('anything') );

    if ( $inserting ) {
        echo 'successful';

    } else {
        echo 'failed';
    }

} catch(PDOException $e){ 

    echo 'failed';
}

我的问题是什么:我想知道,elsecatch 在我的脚本中是否相同?也就是说else什么时候执行?

我认为else 永远不会执行,因为如果$inserting == false 然后它会跳转到catch 块,那么else 永远不会运行。我对吗?写else 没用?

【问题讨论】:

  • 你为什么想知道它?如果没有,你会怎么做?
  • @YourCommonSense 我想知道我应该写 else 还是从我的代码中删除它。
  • 你应该删除 else 和 catch

标签: php mysql pdo try-catch


【解决方案1】:

这取决于。

大多数时候,您不想知道特定插入是否失败。而是您的网站是否正常运行。所以一般来说你的代码应该只是

$stmt = $db_con->prepare(" INSERT INTO mytable ( col ) VALUES ( ? ) ");
$stmt->execute( array('anything') );
echo 'successful';

else 和 catch 都没用。

但是,有时您可能希望捕获某些错误。在这种情况下使用 catch。这是code from my article

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;
    }
}

在这里您可能会发现某个错误并进行处理。

【讨论】:

  • 好吧,我需要将插入代码写入try-catch 块中......!我的问题是关于 if-else 声明。
  • 您的第二个代码很好。仅供参考 (int) $e->getCode() === 23000 表示重复,而不是 1062。而且我还需要知道插入是否成功
  • 除非出现错误,否则您的插入始终是成功的。您不需要任何特殊代码来处理成功的插入。
  • 仅供参考,NULL 用于id 列?
  • 有一个东西叫HTTP。一个定义网站行为的标准,你知道的。
【解决方案2】:

首先我建议你使用

if($inserting->rowCount()==1){
    echo 'successful';
} else {
    echo 'failed';
}

看看它是否真的插入了。

else 语句并非没用。 如果您的查询由于 pdo 错误而未插入,则 catch 语句 将捕获该错误。但是如果它没有插入而没有任何 pdo 错误并且行数为 0,那么 else 语句将运行

【讨论】:

    【解决方案3】:

    尝试不同的输出

    如果您要确定正在执行哪个块,最简单的想法是根据您击中的块更改回显的内容。

    try {
        if (...) {
            ...
        } else {
            echo "Failed: Some Message";
        }
    } catch (Exception $e) {
        echo "Failed: Some Other Message";
    }
    

    或者,您可以放置​​一个记录器函数,或其他一些调试函数。

    【讨论】:

    • 这是评论,不是回答。
    • @YourCommonSense 不,他问如何判断else 何时执行。我的回答告诉他如何判断else 何时执行。
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2017-01-02
    • 2011-12-02
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多