// url: http://localhost/asdf/?sort=credits
if(isset($_GET['sort'])){
$sort = $_GET['sort'];
}
$statement = $db->prepare("SELECT * FROM myTable ORDER BY :sort");
$statement->bindParam(':sort', $sort, PDO::PARAM_STR, 8);
var_dump($statement);
//object(PDOStatement)[2] public 'queryString' => string 'SELECT * FROM table1 ORDER BY :sort' (length=36)
$statement->execute();
我尝试从get参数中获取订购选项,任何人都可以帮助我吗?
更新 根据@Uchiha Madara的建议,我创建了一些预定的排序字符串
if(isset($_GET['sort'])){
switch ($_GET['sort']){
case 'val1':
$sortName = 'val1';
break;
case 'val2':
$sortName = 'val2';
break;
default:
$sortName = false;
break;
}
}
if($sortname != false){
// then prepare query
$statement = $db->prepare("SELECT * FROM table1 ORDER BY ?");
$statement->execute(array($sortName));
}
但结果仍然相同,订单选择被忽略
上次更新!
$sort = 'val1';
$orderList = array(
'val1',
'val2'
);
// then prepare query
$statement = $db->prepare("SELECT * FROM myTable ORDER BY $sort");
$statement->execute();
感谢@Madara Uchiha和@Ray!
答案 0 :(得分:3)
参见Madra的answer。
您无法绑定列。使用有效列的白名单数组进行排序(将$ _GET值与之比较),然后将其替换为查询:
$valid_cols = array('name', 'age');
$sort = 'default_sort_field';
if(isset($_GET['sort']) && in_array($_GET['sort'], $valid_cols)){
$sort = $_GET['sort'];
}
$statement = $db->prepare("SELECT * FROM myTable ORDER BY $sort");
答案 1 :(得分:2)
也许是因为你将变量 $sort
命名为,但是你正试图绑定$order
?
那是因为您无法使用预准备语句绑定列名。它们只是用于价值观。
相反,您应该做的是拥有一组预定义的选项,并按这些选项排序。您不应该让用户选择按实际列名直接排序。