【问题标题】:record updated? when $stmt->execute() $stmt->affected_rows记录更新了吗?当 $stmt->execute() $stmt->affected_rows
【发布时间】:2011-07-05 05:38:36
【问题描述】:

考虑以下问题:

$success = false;
$err_msg = '';
$sql = 'UPDATE task SET title = ? WHERE task_id = ?';

$conn = connect('w'); // create database connection: r= read, w= write

$stmt = $conn->stmt_init(); // initialize a prepared statement
$stmt->prepare($sql);
$stmt->bind_param('si', $_POST['title'], $_POST['id']);
$stmt->execute();

如果我想检查插入或删除是否成功,我可以轻松检查受影响的行,如下所示:

if ($stmt->affected_rows > 0) {
   $success = true;
} else {
   $err_msg = $stmt->error;
}

如果$stmt->affected_rows等于-1,说明$stmt->execute()执行正确但没有插入记录或者没有成功删除记录。

但是,更新呢?处理更新的正确方法是什么?

我这样做的方法是检查返回值:

$isRecordUpdated = $stmt->execute();

if (!$isRecordUpdated) {
   // execute failed, therefore NO record updated!
} else {
   //execute success, record updated!
}

你们的做法对吗?

【问题讨论】:

    标签: php prepared-statement


    【解决方案1】:

    在我看来,确实有两种等效且正确的方法可以做到这一点:要么像你一样检查execute 的返回值,要么检查affected_rows 的值。 -1 表示查询出错; 0 表示它不影响(删除或更新)任何行,因为没有匹配查询。

    由于似乎没有“更好”的方法,您应该选择对您的代码最方便的方法。如果例如使用一种方法而不是另一种方法意味着您可以在所有类型的查询之间共享代码,您可能想要选择那个。

    【讨论】:

      【解决方案2】:

      当您调用execute() 时,为什么不将来自mysql-affected-rows 的值存储到该对象的属性中?

      http://php.net/manual/en/function.mysql-affected-rows.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        相关资源
        最近更新 更多