【问题标题】:How to test if a MySQL query was successful in modifying database table data?如何测试 MySQL 查询是否成功修改数据库表数据?
【发布时间】:2010-10-12 01:52:54
【问题描述】:

我有以下简单的 php 代码 sn-p,它会在调用时从数据库中删除相关文章。结果被传递给一个 javascript 函数,该函数将通过 AJAX 更新页面。如果查询失败,我想返回字符串false,如下所示。

if($cmd=="deleterec"){
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    if ($delRecord = $con->prepare($deleteQuery)) {
        $delRecord->bind_param("s", $pk);
        $delRecord->execute();
        $delRecord->close();
        echo "true";
    } else {
        echo "false";
    }
}

我想知道我错过了什么以及检查查询是否成功的正确方法。

【问题讨论】:

  • 请详细说明为什么它目前显然不起作用,并显示 Javascript 代码。
  • 首先是愚蠢的问题——$con 是一个有效的连接,对吧?
  • 是的,确实如此。 Alnitak,javascript 代码已粘贴,但页面从不返回“false”,所以我认为这不是 javascript 问题。

标签: php mysql mysqli rows-affected


【解决方案1】:

您目前只检查 SQL 语句是否准备正确,而不是检查它是否真的删除了记录。

试试:

...
echo ($delRecord->affected_rows > 0) ? 'true' : 'false';
$delRecord->close();

这并不能说明您是否正确检查了 Javascript 代码中的结果字符串 - 如果这是一个问题,我们将需要更多信息。

【讨论】:

  • > 0 在这种情况下不是必需的;只需要一个真假检查。
  • @mickmackusa 可以说是一种不好的做法;许多编码标准会禁止将整数值隐式强制转换为布尔值。
  • 能否请您将我链接到此类文档化标准,以便我可以阅读它?
【解决方案2】:

您需要使用mysqli->affected_rows() 来检查查询是否成功(或者您可以使用mysqli_stmt->execute() 的结果值)。

以你的为例,除了上面的内容之外什么都没有修改:

if($cmd=="deleterec") {
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    
    if ($delRecord = $con->prepare($deleteQuery)) {
        $delRecord->bind_param("s", $pk);
        $delRecord->execute();
    
    
        if ($delRecord->affected_rows > 0) {
            echo "true";
        } else {
            echo "false";
        }

        $delRecord->close();
    }
}

【讨论】:

  • > 0 在这种情况下不是必需的;只需要一个真假检查。
【解决方案3】:

使用mysqli_stmt->execute()的返回值查看查询是否执行成功。

【讨论】:

  • ...当然这并不表示数据库表是否已更改。
【解决方案4】:
if($cmd=="deleterec"){
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    $delRecord = $con->prepare($deleteQuery);
    if ( $delRecord === false ) {
        echo "false";
    }

    $delRecord->bind_param("s", $pk);
    if ( $delRecord->execute() ) {
        echo "true";
    } else {
        echo "false";
    }
    $delRecord->close();
}

检查prepare() 可以省略,因为查询已修复并且应该可以正常工作(除非服务器端出现错误)。如果查询执行成功,execute() 返回 true。使用affected_rows() 可能会产生误导,因为可能没有要删除的项目,因此affected_rows() 应该返回0。尽管如此,查询还是成功执行了。

【讨论】:

    【解决方案5】:
    function run_query($query,$conn,$dbname){
       $conn->select_db($dbname);
       if($result = $conn->query($query)){
         return $result; 
       }
       else{
         echo 'error ';
         exit();
       }
    

    }

    run_query() 接受三个参数,查询、连接和数据库。查询不成功会报错,否则返回结果对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多