【问题标题】:Why affected_rows always returns -1?如何获得affected_rows MYSQLI准备好的语句,PHP
【发布时间】:2012-01-04 19:11:55
【问题描述】:

当我 INSERT 和 SELECT 时,我似乎遇到了受影响的行的问题,它只是出于某种原因返回 -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;
    }
}

【问题讨论】:

    标签: php mysqli prepared-statement rows-affected


    【解决方案1】:

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

    当您执行"INSERT IGNORE" 时,插入语句可能会给您隐藏错误,这可能导致$query->affected_rows() 中的-1。

    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" 语句成功的好方法。示例:在插入包含用户提供的数据的某些行时忽略重复键错误,前提是它们将匹配即使插入了行,指定的唯一约束也会导致mysqli->affected_rows 返回 -1 值。(在 MySQL 5.0.85 linux 和 php 5.2.9-2 windows 上检查)。但是,如果语句成功执行,mysqli->sqlstate 不会返回错误。 "

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多