2012-09-25 1 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(); 

En essayant une option de commande à partir des paramètres d'obtenir, quelqu'un peut-il m'aider?

mise à jour comme suggère par @Uchiha Madara, j'ai créé des chaînes de commande 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)); 
} 

mais même résultat, le choix de la commande est ignorée

dernière mise à jour!

$sort = 'val1'; 

$orderList = array(
    'val1', 
    'val2' 
); 

// then prepare query 
$statement = $db->prepare("SELECT * FROM myTable ORDER BY $sort"); 
$statement->execute(); 

merci @Madara Uchiha et @Ray!

+0

la requête s'exécute mais aucune commande n'est appliquée –

+0

Voulez-vous utiliser '$ order'? Ou '$ sort', car c'est la variable que vous créez ...? – andrewsi

+0

mal orthographié, son réellement trier –

Répondre

2

Peut-être parce que vous avez nommé vous variables $sort, mais vous essayez de bind $order? C'est parce que vous ne pouvez pas lier les noms de colonnes avec les instructions préparées. Ils sont uniquement destinés à être utilisés avec des valeurs. Au lieu de cela, ce que vous devriez faire, c'est d'avoir un ensemble d'options prédéfinies, et trier par ceux-ci. Vous ne devriez pas donner à l'utilisateur le choix de commander directement par un vrai nom de colonne.

+0

c'était un faux type, question mise à jour –

+0

@AdonisK .: réponse mise à jour. –

+0

Donc, quelque chose comme un interrupteur, non? –

3

Voir le document answer de Madra.

Vous ne pouvez pas lier une colonne. Utilisez un tableau de liste blanche des colonnes valides pour trier contre (pour comparer la valeur $ _GET) et remplacer simplement dans la requête:

$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

c'était un faux type, question mise à jour –

+0

@AdonisK. voir ma mise à jour – Ray

+0

fait, mais l'exécution de la requête l'ignore toujours –

Questions connexes