无法在php pdo中通过ASC运行命名占位符

时间:2016-07-20 10:23:00

标签: php mysql pdo

我是 PHP PDO 的新手,并尝试在ORDER BY ASC 的位置使用命名占位符。有时在简单的查询页面中,这次运行非常成功,但无法在以下查询中运行:

PHP代码:

$price_sort = "ASC";
$keyword = "samsung glaxy";
$limit = 0;
    $query = $db->prepare("SELECT *, MATCH(title) against (:keyword) as 'relevence'
                FROM view_store_items_grid 
                WHERE MATCH(title) against(:keyword) 
                ORDER BY relevence DESC, price :order
                LIMIT :limit,25");
    $query->bindValue(":keyword",$keyword);
    $query->bindValue(":order",$price_sort);
    $query->bindValue(":limit", $limit, PDO::PARAM_INT);
    $query->execute();

当我使用:order删除占位符ASC并运行结果但是当我使用此占位符时,我得到空结果。

对于获取数据或显示已提取的结果我正在使用

while ($row = $query->fetch(PDO::FETCH_ASSOC)) :
       extract($row);
       echo "$name";
endwhile;

我做错了什么以及如何在不同地方的查询中使用多个命名占位符

2 个答案:

答案 0 :(得分:2)

您不应在准备好的声明中绑定ASC / DESC。参数自动引用,不应引用ASC / DESC。这与表和列名称不能是参数的原因相同。

相反,你可以这样做

$sql_query = "SELECT *, MATCH(title) against (:keyword) as 'relevence'
                FROM view_store_items_grid 
                WHERE MATCH(title) against(:keyword) 
                ORDER BY relevence DESC, price "
if($price_order == 'ASC'){
    $sql_query .= " ASC "
}else{
    $sql_query .= " DESC  "
}
$sql_query .= " LIMIT :limit,25  "
$query = $db->prepare($sql_query);

参考How bindValue in LIMIT

参考pdo binding asc/desc order dynamically

另外,不要尝试在单个SQL语句中使用相同的命名参数两次,例如

<?php 
$sql = 'SELECT * FROM some_table WHERE  some_value > :value OR some_value < :value'; 
$stmt = $dbh->prepare($sql); 
$stmt->execute( array( ':value' => 3 ) ); 
?> 

...这将不返回任何行且没有错误 - 您必须使用每个参数一次且仅使用一次。显然这是预期的行为(根据此错误报告:http://bugs.php.net/bug.php?id=33886),因为可移植性问题。

答案 1 :(得分:0)

此问题通过将price_sort变量值替换为price ASC并删除price之前的:order来解决了这个问题

为:

$price_sort = "price ASC";

,查询如下:

$query = $db->prepare("SELECT *, MATCH(title) against (:keyword) as 'relevence'
                FROM view_store_items_grid 
                WHERE MATCH(title) against(:keyword) 
                ORDER BY relevence DESC, :order
                LIMIT :limit,25");

这在@tamil

的回答的帮助下解决了我的问题

谢谢