这是我一直在尝试解决的问题,它是最简单的查询,似乎不想为我工作(仅适用于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/