这是我一直在尝试解决的问题,它是最简单的查询,似乎不想为我工作(仅适用于php mysqli,适用于控制台sql)

首先,我使用准备好的语句,只是在(从另一个服务的)专用ID上查找匹配项,以更新关系以使用主键来简化搜索。

查询如下:

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


我将其用作一行,在这里我将其拆分以提高可读性

然后,我检查prepare语句是否有效(我在多个地方执行此操作,并且在其他地方都可以使用。

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不能正确匹配。虽然那只是猜测。

最佳答案

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

$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 - PHP MySQLi可能与转义语句中的转义参数有关?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17952743/

10-16 15:13