PHP MySQLi 转义语句中的转义参数可能存在问题?

标签 php mysql mysqli

这是我一直试图弄清楚的事情,它是最简单的查询,似乎不想为我工作(仅在 php mysqli 中,在控制台 sql 中工作)

首先,我使用准备好的语句,只是在专门的 id(来自另一个服务)上查找匹配项来更新关系,以使用我的主键以便于我端进行更轻松的搜索。

查询如下:

$query = "SELECT id 
          FROM {$this->config->dbprefix}{$table} 
          WHERE sf_id = ? 
          LIMIT 1";

我将其用作一行,为了更好的可读性,我将其分开

然后我检查准备语句是否有效(我在多个地方执行此操作,并且它在其他地方都有效。

if(!($ret = $this->dbo->prepare($query))){
  //handle error, this part is never called
}else{
  //everything is fine, code in here is below
}

到目前为止,一切似乎都很好。手动检查表和前缀表明它们正在工作并引用正确的表。

$ret->bind_param('s',$id);
$ret->execute();
$ret->bind_result($retId);
$ret->fetch();
$count = $ret->num_rows;

问题就在这里,查询总是返回 num_rows 0。手动检查查询并在控制台中尝试它会返回 1 个结果。到目前为止,这是一个如此简单的查询,我只是无法理解为什么它在其他地方可以工作,但在这里不行。我确信这是构建它的正确方法(我还有许多其他结构类似的查询)。

我可能遇到任何困惑吗?容易错过的东西可能会导致这样的查询不返回结果?

编辑: 我已尝试进一步的错误处理,并且尝试执行 if 测试不会触发错误,但我会尝试更多。

为了扩展,我有 $query 变量和 id 变量的原始输出。通过组合它们并在控制台中手动尝试查询,我得到了正确的结果。我的想法是,prepare 语句以某种方式转义,导致字符串变量 $id 无法正确匹配。虽然这只是猜测。

最佳答案

在尝试访问 num_rows 之前,您需要调用 store_result()。如果没有它,语句句柄不知道结果集中有多少行。

$ret->bind_param('s',$id);
$ret->execute();
$ret->bind_result($retId);
$ret->store_result();
$count = $ret->num_rows;
// perhaps add error handling based on number of rows here
$ret->fetch();

关于PHP MySQLi 转义语句中的转义参数可能存在问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952743/

相关文章:

mysql - 这些以前应该用 MySQL 编写的 SQL 语句现在是 MySQLi 的提示吗?

php - 如何按最接近的数字排序?

php - 仅在自定义验证器字段上需要 Symfony 表单

Mysql分组并获取与该组内最大字段值对应的行

php - 使用 php 更新 phpMyAdmin(XAMPP) 数据库时遇到问题

php - 如何使用下一个工作日更新 mysql 日期列字段。?

php - 如何使用循环连接 MySQL 日期类型和 PHP 日期类型

php - 模型数组的 Codeigniter 错误

php - 处理多个表单输入字段

php - 我只能下载表头,不能下载FPDF中MYSQL数据库的数据