如何使用PDO知道DELETE查询是否真的删除了一行

时间:2016-10-14 09:31:01

标签: php mysql pdo

我使用DELETE语句将PDO查询传递给mysql。我想知道,查询是否真的删除了一行?我尝试使用$stmt->execute()

的返回值
function delete(){
    $stmt = $this->db->prepare("DELETE FROM users WHERE id= :id");
    $stmt->bindValue(':id',$_POST[id]);

    var_dump($stmt->execute());
}

但是这总是true,即使没有删除行也是如此。即使我没有发布任何值,甚至一次又一次地发布相同的值,这也是真的。可能是因为查询成功并删除了0行,因此$stmt->execute()的返回值无效。

那么PDO中有没有其他方法可以知道是否真的删除了任何行,更具体地说,我想确保只删除了一行。

所以我想要这样的东西

function delete(){
    $stmt = $this->db->prepare("DELETE FROM users WHERE id= :id");
    $stmt->bindValue(':id',$_POST[id]);
    $stmt->execute();
    if($rowdeleted == 1){ echo "success";}
    else{echo "failure";}
}

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

说明

为了知道在select和Delete期间最后一次操作影响了多少行,你必须在执行代码后GET THE ROW COUNT

<强>条件:

  • 如果计数大于0 - 这意味着代码已经影响了某些操作。
  • 如果计数没有返回大于0 - 这意味着在WHERE子句中没有匹配的记录。

实施例

PDOStatement::rowCount - 返回受上一个SQL语句影响的行数

PDOStatement::rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。

如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。

示例代码:

<?php
/* Delete all rows from the FRUIT table */
$del = $dbh->prepare('DELETE FROM fruit');
$del->execute();

/* Return number of rows that were deleted */
print("Return number of rows that were deleted:\n");
$count = $del->rowCount();
print("Deleted $count rows.\n");
?>

示例输出:

Return number of rows that were deleted:
Deleted 9 rows.

快乐编码:)

答案 1 :(得分:4)

如果您使用PDO,则需要rowCount方法。 如果是mysqli,您需要affected rows

答案 2 :(得分:1)

一个简单的技巧是检查受影响的行数

netInterface
            .postRequest(requestData)
            .repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
                @Override
                public Observable<?> call(Observable<? extends Void> observable) {

                    requestData.setFreeMemory(x);
                    return observable.just(reqeustData).delay(5, TimeUnit.SECONDS);
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .subscribe(this.requestSubscriber);

还有另一个答案,更详细地说明了这一点:What does a successful MySQL DELETE return? How to check if DELETE was successful?

答案 3 :(得分:0)

你可以试试这样的事情:

if($stmt[0]->rowCount() > 0)
{ 
echo "success";
}
else{
echo "failure";
}