PHP MySQLi可能与转义语句中的转义参数有关吗?

时间:2013-07-30 16:41:21

标签: php mysql mysqli

这是我一直试图弄清楚的一点,这是最简单的查询似乎不适合我(仅在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无法正确匹配。虽然这只是猜测。

1 个答案:

答案 0 :(得分:1)

在尝试访问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();