mysqli->query 在更新时返回 true,但不影响行

Posted

技术标签:

【中文标题】mysqli->query 在更新时返回 true,但不影响行【英文标题】:mysqli->query returns true on update, but no rows affected 【发布时间】:2017-07-29 09:59:06 【问题描述】:

我在尝试更新 mysql 中的行时遇到了一些问题。

我尝试打印查询并在我的 sql 客户端中运行它,它会按预期更新行。

这一行:

$this->mysqli->query($query);

按预期返回 bool (true),根据 php 文档 (http://php.net/manual/en/mysqli.query.php) 是正确的。

失败时返回 FALSE。对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,mysqli_query() 将返回一个 mysqli_result 对象。对于其他成功的查询,mysqli_query() 将返回 TRUE。

public function query($query, $parameters = array()) 
    if ((is_array($parameters) && count($parameters) > 0) || (is_string($parameters) && !empty($parameters))) 
        $this->lastPrepared = true;

        if ($this->prepare($query) === false)
            return false;

        $this->bind((is_array($parameters) ? $parameters : array($parameters)));
        if ($this->execute() === false)
            return false;
     else 
        $this->lastPrepared = false;

        if (!$this->stmt = $this->mysqli->query($query)) 
            debug('Query failed: (' . $this->mysqli->errno . ') ' . $this->mysqli->error);
            return false;
        
    

    return $this->stmt;

我四处搜索,发现与我的问题相似的问题,但没有一个答案能帮助我找到解决方案。

编辑:好的,所以我现在可以看到 $this->mysqli->affected_rows;返回 -1,表示有错误。但是mysqli->errno和mysqli->error都是空的。

我尝试运行的查询是:

UPDATE payment_scheduled SET active = 0 WHERE id=1 OR id=2

列:

id - type: int - length: 10 - extra: unsigned, pk

活动 - 类型:tinyint - 长度:1 - 额外:无符号

【问题讨论】:

我没有看到查询 .. 可能是您的查询工作正常但不匹配行.. 但是如果我输入 var_dump($query);在查询函数中复制该查询并将其粘贴到我的 sql 客户端中,它工作得很好。那么问题的根源一定在上面的函数之内? 显示查询..更好.. 所有列类型都是数字? 表格是否由某些 IDE 操作查看? .. 尝试退出 IDE 并重新打开 【参考方案1】:

好的,所以我发现了问题。

我在一个方法中开始一个事务,但我从来没有提交过。

很抱歉浪费您的时间,您无法通过查看我提供的代码找出问题所在。我确定问题出在该查询方法中(但我错了)。

我会投票赞成你们每个试图提供帮助的人。

【讨论】:

谢谢,正是这条评论帮助了我……【参考方案2】:

更新 0 行不算失败,它只是意味着根据选择标准没有要更新的行。在许多情况下,这将是预期的行为,因此返回 true。

【讨论】:

我正在尝试更新 2 行,当我复制查询时,它在我的 sql 客户端中运行良好。受影响的行给了我 -1 而不是 0。 $this 不是你的 mysqli 对象吗?所以不是 $this->mysqli->errno 和类似的只是做 $this->errno? 以上 $this->query 不,$this 是我的类(在我的例子中是 DBWrapper),它有一个名为 $mysqli 的私有变量。在类的构造函数中,我实例化了一个 mysqli 对象。像这样: $this->mysqli = new mysqli(..... if (!$this->stmt = $this->mysqli->query($query)) 你有一个=。你确定这是在做你想做的事吗?

以上是关于mysqli->query 在更新时返回 true,但不影响行的主要内容,如果未能解决你的问题,请参考以下文章

未找到记录时,mysqli_query 不返回 false [重复]

MySQLi multi_query不会返回超过1个结果

Mysqli_query 返回 false 并且 Mysqli_error 返回 NULL? [复制]

我收到一个错误“命令不同步;当我使用mysqli_multi_query时,你现在无法运行此命令

mysqli更新不起作用

mysqli返回受影响行数