2012-09-25 31 views
2
// 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斑作为建议,我创造了一些predifed顺序串

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宇智波和@Ray!

+0

查询执行但没有应用排序 –

+0

您的意思是使用'$ order'?或'$ sort',因为这是你正在创建的变量...? – andrewsi

+0

错字,其实排序 –

回答

2

也许是因为你被点名了你的变量$sort,但你想绑定$order

这是因为您无法将列名与预准备语句绑定。它们只能用于值。

相反,你应该做的是有一组预定义的选项,并按这些选项排序。您不应该给用户一个直接按实际列名称排序的选择。

+0

这是一个错误的,更新的问题 –

+0

@AdonisK .:更新的答案。 –

+0

因此,像开关柜一样,对吧? –

3

参见Madra's 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"); 
+0

这是一个错误的,更新的问题 –

+0

@AdonisK。看到我的更新 – Ray

+0

完成,但它的查询执行仍然忽略它 –