2010-11-28 5 views
0

Ceci est pour un script de tri. Je veux commander mes messages par votes. J'utilise une instruction if dans une fonction pour vérifier quel ordre a été sélectionné et afficher les messages en fonction de cela.variables passage dans la fonction

La fonction suivante insère des données dans ma requête.

function vote_orderby($orderby) 
{ 
    global $vote_sort; 

    if($vote_sort == "most_voted") { 
    // order by most votes 
    return "votes DESC"; //inserts into query 
    } 

    // return default order by if no votes 
    return $orderby; 
} 

HTML

$vote_sort = "most_voted"; //should be picked up by function 

..function 
..loop 

Je veux générer,

$query = "SELECT * FROM posts ORDER BY votes DESC"; 

Mais les messages sont classés par date. Cela fonctionne cependant sans l'instruction if, cela garantit que je n'ai pas d'erreurs MYSQL.

Comment est-il possible de passer la valeur $vote_sort dans la fonction?

Note: Je suis conscient du risque d'injection SQL, je vais filtrer tout bientôt.

Répondre

0

Pour répondre à votre commentaire et développer la solution de Michael ci-dessus, voici ce que vous pouvez faire ...

function vote_orderby($orderby) { 
    switch($orderby) { 
     // Sort by most votes 
     case 'most_voted': $sort = 'votes DESC'; break; 
     // Sort by least votes 
     case 'least_voted': $sort = 'votes ASC'; break; 
     // Default to most votes if does not match any other option 
     default: $sort = 'votes DESC'; break; 
    } 
    return $sort; // Return query statement 
} 

Ensuite, votre déclaration de requête serait telle que ...

$sortby = $_GET['sort']; // However you want to get the way to sort 
// If $sortby is empty, it will default to most_voted via function 
$order = vote_orderby($sortby); 
$query = "SELECT * FROM posts ORDER BY ".$order; 

Il s'agit d'une façon plus permanente de coder le système et d'empêcher les gens d'injecter votre requête MYSQL et des erreurs mineures ne se produiront pas dans le futur.

J'ai codé de nombreux systèmes similaires dans le passé et c'est l'une des meilleures façons de s'y prendre.

+0

merci pour le code ça a l'air bien! Toutefois, pour une raison quelconque, il utilise toujours le commutateur par défaut. Je ne pense pas que cela ramasse la variable '$ sortby'. J'ai même essayé '$ sortby =" least_voted "' et il utilise toujours la valeur par défaut. Quelque chose semble éteint. – Noob

+0

Avez-vous essayé d'écho les résultats de la variable $ order pour voir ce que la fonction retourne réellement? De cette façon, vous pouvez savoir si le commutateur est correct avec la fonction et la base de données peut être désactivée. Essayez de faire cela et laissez-moi savoir les résultats :) –

0

Vous voulez probablement quelque chose comme ceci:

function vote_orderby($orderby='most_voted') { 
    if($orderby == "most_voted") {  
     // order by most votes 
     return "votes DESC"; //inserts into query 
    } 

    // return default order by if no votes 
return $orderby; 
} 

Dans votre requête, vous voulez quelque chose simular à ce

// this will give you the default; 
$orderby = vote_orderby(); 
$query = 'SELECT * FROM posts ORDER BY ' . $orderby; 

Ou

// this will give you the name; 
$orderby = vote_orderby('NAME DESC'); 
$query = 'SELECT * FROM posts ORDER BY ' . $orderby; 

Mais vous pourriez vouloir définir une variable à la méthode de tri et passez cela dans votre requête. Faire cela dans une fonction est un peu excessif ou vous pouvez juste ajouter toute la requête et retourner la bonne.

+0

Merci pour la réponse! En utilisant votre code, la variable '$ order_by' retourne' votes DESC'. J'ai besoin de 'most_voted' et cette valeur peut aussi changer en' least_voted'. J'aurais dû aussi mentionner que la fonction fait partie d'un filtre WordPress pour interroger les messages. Le $ orderby est pour modifier le MYSQL seulement. J'ai besoin d'une variable de séparation pour gérer le tri. – Noob

Questions connexes