PDO Prepared Statement返回0行,但查询工作正常

我有以下准备声明:

SELECT `e1`.`field_value` AS `county`,
       `e2`.`field_value` AS `venue_type`,
       `l`.`ID` AS `listing_id`,
       `l`.`ID` AS `id`,
       `l`.`user_ID` AS `user_id`,
       IF(`l`.`user_ID` > 1, 'b', 'a') AS `flag` ,
       COUNT(`img`.`ID`) AS `img_num`
FROM ( `listingsDBElements` `e1`,
       `listingsDBElements` `e2`,
       `listingsDB` `l` )
LEFT JOIN `listingsImages` `img` ON (`l`.`ID` = `img`.`listing_id`
                                     AND `l`.`user_ID` = `img`.`user_id`
                                     AND `img`.`active` = 'yes')
WHERE `e1`.`field_name` = 'county'
  AND `e1`.`field_value` = :county
  AND `l`.`ID` = `e1`.`listing_id`
  AND `l`.`user_ID` = `e1`.`user_id`
  AND `e2`.`field_name` = 'venue_type'
  AND `e2`.`field_value` = :venueType
  AND `l`.`ID` = `e2`.`listing_id`
  AND `l`.`user_ID` = `e2`.`user_id`
  AND `l`.`ID` = `e2`.`listing_id`
  AND `l`.`user_ID` = `e2`.`user_id`
  AND `l`.`active` = 'yes'
GROUP BY `l`.`ID`
ORDER BY `flag` DESC,
         `img_num` DESC LIMIT :limit,
                              :offset

通过绑定以下参数:

:county => 'Bedfordshire'
:venueType => 'Conference Centre'
:limit => 0
:offset => 12

然后,我使用PDO执行Prepared Statement,如下所示:

$vens = $db->prepare($sql);

if($paged)
{
    $limit = (int) (($page - 1) * $perPage);
    $perPage = (int) $perPage;

    $vens->bindParam(':offset', $perPage, PDO::PARAM_INT);
    $vens->bindParam(':limit', $limit, PDO::PARAM_INT);
}

foreach($bindings as $key => $value) { $vens->bindParam($key, $value, PDO::PARAM_STR); }
$vens->execute();

while($ven = $vens->fetchObject())
{
    $_tpl['venues'][] = new Venue($ven->id);
}

即使使用$db->rowCount() ,以上总是返回0结果,但如果手动运行查询并替换MySQL中的占位符,则会生成4条记录的预期结果。 奇怪的是,我有另一个(几乎相同的)查询运行并计算总行数,并按如下方式绑定相同的参数:

SELECT COUNT(DISTINCT(`l`.`ID`)) AS `total`
FROM ( `listingsDBElements` `e1`,
       `listingsDBElements` `e2`,
       `listingsDB` `l` )
WHERE `e1`.`field_name` = 'county'
  AND `e1`.`field_value` = :county
  AND `l`.`ID` = `e1`.`listing_id`
  AND `l`.`user_ID` = `e1`.`user_id`
  AND `e2`.`field_name` = 'venue_type'
  AND `e2`.`field_value` = :venueType
  AND `l`.`ID` = `e2`.`listing_id`
  AND `l`.`user_ID` = `e2`.`user_id`
  AND `l`.`ID` = `e2`.`listing_id`
  AND `l`.`user_ID` = `e2`.`user_id`
  AND `l`.`active` = 'yes'

以上是使用以下命令执行的:

$counter = $db->prepare($countSql);
$counter->execute($bindings);
$counts = $counter->fetchObject();

$counts->total正确返回4 。 任何人都可以建议为什么第一个Prepared Statement通过PDO返回0行,但手动进入MySQL时工作正常吗?

编辑:

根据Joachim的评论,还有其他的查询可以很好的运行,绑定参数的极限和偏移量,甚至删除它们返回相同的结果。 例如,以下查询正常工作:

SELECT `l`.`ID` AS `id`,
       IF(`l`.`user_ID` > 1, 'b', 'a') AS `flag`
FROM `listingsDB` `l`
INNER JOIN `listingsDBElements` `e` ON `l`.`ID` = `e`.`listing_id`
WHERE `e`.`field_name` = 'city'
  AND `e`.`field_value` = :town
  AND `l`.`active` = 'yes'
ORDER BY `flag` DESC LIMIT :limit,
                           :offset

基本上,你只能在准备好的声明中绑定某些类型的东西。

从MySQL手册:

这些标记仅在SQL语句中的某些地方合法。 例如,它们可以在INSERT语句的VALUES()列表中(用于指定行的列值)或与WHERE子句中的列进行比较以指定比较值。 但是,它们不允许用于标识符(例如表名或列名),或者指定二元运算符的两个操作数,例如=等号。 后一种限制是必要的,因为不可能确定参数类型。 通常,参数只在数据操纵语言(DML)语句中合法,而不在数据定义语言(DDL)语句中合法。

请注意,LIMIT和OFFSET不在允许的位置列表中。

链接地址: http://www.djcxy.com/p/66709.html

上一篇: PDO Prepared Statement returns 0 rows, but query works fine

下一篇: Custom where clauses in PHP prepared statement