我是 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;
我做错了什么以及如何在不同地方的查询中使用多个命名占位符?
答案 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);
参考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
的回答的帮助下解决了我的问题谢谢