gpt4 book ai didi

php - 为什么 affected_rows 总是返回 -1?

转载 作者:可可西里 更新时间:2023-11-01 12:37:46 26 4
gpt4 key购买 nike

我在 INSERT 和 SELECT 时似乎无法获取 affected_rows,它出于某种原因只返回 -1?我正在使用一个数据库类,我一直将其用于我使用 MYSQL 的项目,我准备语句以避免 SQL 注入(inject)。

有谁知道为什么它一直返回-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;
}
}

最佳答案

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

当您执行 "INSERT IGNORE" 时,Insert-Statement 可能会给您抑制错误,这可能导致 $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 不会返回任何错误。”

关于php - 为什么 affected_rows 总是返回 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com