【问题标题】:php mysqli affected rows returns wrong result after delete statementphp mysqli 受影响的行在删除语句后返回错误的结果
【发布时间】:2014-08-05 15:07:39
【问题描述】:

我有一个函数可以从我的表中删除一行,如果该行之前存在,我想返回 true。我使用以下函数实现:

$mysqli = $this->mysqli;

$stmt = $mysqli->prepare("DELETE FROM active_clients WHERE token LIKE ?");
$stmt->bind_param('s', $token);
$stmt->execute();
if($stmt->affected_rows < 1){
    $stmt->close();
    return false;
}
$stmt->close();
return true;

它也在我的本地主机上正常工作,但是当我移动到实时服务器时,它没有返回正确的结果。受影响的行总是返回 0,但该行被删除,因为它应该是。怎么会这样? php版本有问题吗?我在本地运行 5.4 并在实时服务器 5.3 上运行...或者它是否也可能与数据库或服务器配置有关?

【问题讨论】:

  • 为什么不使用WHERE token = ? 在这里使用 LIKE 可能不是您想要的,因为它可能会产生不需要/意​​外的结果。
  • 检查以确保受影响的行首先返回正确的数字:printf("Affected rows: %d\n", $stmt-&gt;affected_rows);
  • 我只是请求令牌的第一个字符串,使用“blablabla%”作为要测试的字符串。这就是我使用 LIKE 语句的原因。 $stmt->affected_rows 正好返回 0
  • @abimelex 回顾我的回答和您的问题,我发现我们错过了prepare() 上的$this-&gt;mysqli,比较也应该是if($stmt-&gt;affected_rows &lt; 0),因为if($stmt-&gt;affected_rows &lt; 1) 表示少于一排受影响

标签: php mysql mysqli


【解决方案1】:

试试这个:

$mysqli = $this->mysqli;

$stmt = $this->mysqli->prepare("DELETE FROM active_clients WHERE token LIKE ?");
if(!$stmt){
    die('prepare() failed: ' . $mysqli->error);
}else{
    $stmt->bind_param('s', $token);

    if($stmt->execute()){
       $stmt->store_result();
        if($stmt->affected_rows < 0){
            $stmt->close();
            return false;
        }else{
            $stmt->close();
            return true;    
        }
    }else{
        die('execute() failed: ' . $mysqli->error);
    }


}

【讨论】:

  • 这并不能解决问题,是否需要将其放在连接对象上?因为在本地它确实有效......
  • @abimelex 你试过打印吗printf("Affected rows (DELETE): %d\n", $stmt-&gt;affected_rows);
  • 在 php.net 示例中,它也在 $stmt 上:php.net/manual/en/mysqli-stmt.affected-rows.php
  • @abimelex 好的,我扩展了我的答案,请检查。如果 prepare 曾经返回 false 那么它不会工作
  • @abimelex 我发现有人遇到了你的问题forums.phpfreaks.com/topic/… 你的代币值有百分号吗
【解决方案2】:

如果最后一个查询是没有 WHERE 子句的 DELETE 查询,则所有记录都将从表中删除,但对于 4.1.2 之前的 MySQL 版本,此函数将返回零。

检查你的 Mysql 版本。

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

【讨论】:

  • OP 使用的是mysqli_* 而不是mysql_* 函数。
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多