如何获得affected_rows MYSQLI准备语句,PHP

Joh*_*ohn 8 php mysqli prepared-statement rows-affected

当我INSERT和SELECT时,我似乎遇到了遇到affected_rows的问题,它只是因某种原因返回-1?我使用的数据库类,我一直用于我的项目,使用MYSQLI准备语句,以避免sql注入.

有谁知道它为什么一直返回-1?根据我的阅读,它应该能够在INSERT和SELECT上返回受影响的行.

数据库类

$class database {
protected $_mysqli;
protected $_debug;

public function __construct($host, $username, $password, $database, $debug) {
    $this->_mysqli = new mysqli($host, $username, $password, $database);
    $this->_debug = (bool) $debug;
    if (mysqli_connect_errno()) {
        if ($this->_debug) {
            echo mysqli_connect_error();
            debug_print_backtrace();
        }
        return false;
    }
    return true;
}

public function q($query) {
    if ($query = $this->_mysqli->prepare($query)) {
        if (func_num_args() > 1) {
            $x = func_get_args();
            $args = array_merge(array(func_get_arg(1)),
                array_slice($x, 2));
            $args_ref = array();
            foreach($args as $k => &$arg) {
                $args_ref[$k] = &$arg; 
            }
            call_user_func_array(array($query, 'bind_param'), $args_ref);
        }
        $query->execute();

        if ($query->errno) {
          if ($this->_debug) {
            echo mysqli_error($this->_mysqli);
            debug_print_backtrace();
          }
          return false;
        }

        if ($query->affected_rows > -1) {
            return $query->affected_rows;
        }
        $params = array();
        $meta = $query->result_metadata();
        while ($field = $meta->fetch_field()) {
            $params[] = &$row[$field->name];
        }
        call_user_func_array(array($query, 'bind_result'), $params);

        $result = array();
        while ($query->fetch()) {
            $r = array();
            foreach ($row as $key => $val) {
                $r[$key] = $val;
            }
            $result[] = $r;
        }
        $query->close(); 
        return $result;
    } else {
        if ($this->_debug) {
            echo $this->_mysqli->error;
            debug_print_backtrace();
        }
        return false;
    }
}

public function handle() {
    return $this->_mysqli;
}

public function last_insert_id()
{
    return $this->_mysqli->insert_id;
}

public function found_rowss()
{
    return $this->_mysqli->affected_rows;
}
Run Code Online (Sandbox Code Playgroud)

}

zul*_*loo 5

对于使用 prepare 创建的选择语句,您应该使用$query->num_rows()mysqli_stmt_num_rows($query)

当您执行 a 时,插入语句可能会给您抑制错误,"INSERT IGNORE"这可能导致$query->affected_rows().

php.net 上的评论(第二个链接)建议您使用$query->sqlstate=="00000"来检查错误。


参见php.net (manual/en/mysqli-stmt.affected-rows)

“此函数仅适用于更新表的查询。为了从 SELECT 查询中获取行数,请mysqli_stmt_num_rows()改用。”

php.net (manual/en/mysqli.affected-rows)

“检查 mysqli->affected_rows 是否等于 -1 不是确定"INSERT IGNORE"语句成功的好方法。示例:插入一些包含用户提供的数据的行时忽略重复的键错误,只有当它们匹配指定的唯一约束时才会导致返回-1 值,mysqli->affected_rows即使插入行。(在 MySQL 5.0.85 linux 和 php 5.2.9-2 windows 上检查)。但是,mysqli->sqlstate 如果语句成功执行,则不会返回错误。”