2012-09-25 60 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

完成,但它的查詢執行仍然忽略它 –