PDO - 查询没有结果

时间:2014-09-23 13:26:01

标签: php mysql pdo prepared-statement

这是我准备好的声明。

SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!=""  AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12;

这是我在bindParam中使用的数组。

Array
(
    [:ctid] => 1
    [:p1] => Apple
)

这是PHP代码:

$sql = 'SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!=""  AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12;';
$sql = $link->prepare( $sql );

$binders = array(
  ':ctid' => 1,
  ':p1' => 'Apple'
);

foreach( $binders as $key => $value ) {
    $sql->bindParam( $key, $value );
}

$sql->execute();
$sql->setFetchMode( PDO::FETCH_ASSOC );
$result = $sql->fetchAll();

这没有结果。

但是,如果我进行直接查询,我会从db获得结果。上述查询可能有什么问题。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这里的问题是您使用bindParam绑定参数,它使用引用绑定。在您的情况下,您应该使用bindValue代替:

foreach( $binders as $key => $value ) {
    $sql->bindValue( $key, $value );
}

或者您可以将数组直接传递给execute()方法:

$sql->execute( $binders );

如手册中所述:

the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

因此,当您的foreach循环结束时$value具有最后一个数组项Apple的值。因此,当execute运行时,:ctid:p1值都会变为等于Apple。当然,这不是你想要的)

答案 1 :(得分:1)

尝试使用bindvalue

$sql = 'SELECT `id`, `title`, `image`, `discount`, `price`, `new_price`, `img_url` FROM `deals` WHERE `active`="1" AND `category`=:ctid AND `img_url`!=""  AND `Brands`=:p1 ORDER BY `order`, `id` ASC LIMIT 0, 12;';
$link->prepare($sql);
$link->execute([
    ':ctid' => 1,
    ':p1' => 'Apple'
]);
$result = $link->fetchAll(PDO::FETCH_ASSOC);