我是新的PHP 5 mysqli的新手,但我用老式的方式做了很多工作。
所以这是我的代码
$query = "SELECT `id`, `catn`, `name`, `name_en`, `image`, `price`, `old_price`, `cat` FROM `products` WHERE `show` = 'Yes'";
if (!empty($order)) {
$params[0] = $params[0] . "s";
$query = $query . " ORDER BY ? ".$way;
$params[] = $order;
}
$stmt = $this->db->prepare($query);
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($params as $key => $value)
$refs[$key] = &$params[$key];
}
if ($stmt) {
call_user_func_array(array($stmt, 'bind_param'), $refs);
$stmt->execute();
... more code below
$way
var总是ASC
或DESC
。但是查询给出了按id排序的结果(就像没有ORDER BY
语句一样)。所以查询是在bind_param
之前写的,所以我猜params没有正确绑定?你能告诉我错误可能在哪里
答案 0 :(得分:0)
我不认为您正在使用bind_param
,因为您要排除必须先出现的$types
参数。但是,这些用于参数(例如show = ?
的值)。您不会将参数用于查询结构的某些部分,例如关键字。您必须将字符串连接到查询本身。如果您担心安全性,请明确地进行连接,例如
if ($way == 'ASC') {
$query .= "ASC";
}
else {
$query .= "DESC";
}
bind_param
会在参数周围添加引号,使查询无效(ORDER BY 'ASC'
)
答案 1 :(得分:0)
如果您使用参数撰写ORDER BY
子句,则您将搜索固定的文字字符串,例如你会得到这个:
ORDER BY 'price' DESC
......而不是这个:
ORDER BY price DESC