2010-11-28 14 views
0

Cela n'a pas de sens .. J'essaie de trier les messages en fonction de la valeur d'un paramètre d'URL, mais mon instruction elseif ne fonctionne pas.elseif ne fonctionne pas

Ceci est une fonction qui ajoute une autre clause WHERE à la requête. Il n'y a pas d'erreurs MYSQL J'ai juste des problèmes de déclaration.

function sort_where($where) 
{ 
    if (isset($_GET['sort'])) { 
     $sort = $_GET['sort']; 

     if ($sort = "up") { 
     $where .= " AND $sort > 1"; 
     } 
     elseif ($sort = "down") { 
     $where .= " AND $sort > 1"; 
     } 

    } 

    return $where; 
} 

La requête ressemble à terme comme celui-ci

$query = "SELECT * FROM posts WHERE something = $something AND $sort > 1"; 

if fonctionne déclaration, le elseif est ignoré. Je reçois des messages avec up > 1 indépendamment ou vice-versa si $sort = down dans l'instruction if.

Répondre

5

En fait, aucun des deux ifs internes fonctionnent correctement. Vous devez utiliser == et non =. Un signe égal signifie une affectation, et si vous affectez à une valeur véridique, elle est toujours vraie dans une condition if. C'est pourquoi votre elseif ne semble jamais arriver.

Vous devrez peut-être aussi corriger vos clauses WHERE, elles n'ont pas de sens pour moi (vous les triez mais vous les comparez à une colonne up et une colonne down?). Ou peut-être est comment vous avez conçu votre table ...


Sur la base de vos commentaires, essayez les clauses SQL WHERE suivantes et voir si vous obtenez les messages corrects:

if ($sort == "up") { 
    $where .= " AND up > down"; 
} 
elseif ($sort == "down") { 
    $where .= " AND down > up"; 
} 
+0

Merci! C'est toujours les choses les plus basiques qui me troublent lol. Oui de haut en bas sont des colonnes dans ma table. Im trier les postes avec des votes UP et DOWN – Noob

+0

Ah je vois. Etes-vous en train d'essayer de filtrer uniquement les posts mis à jour ou les posts downvoted, ou de les trier en fonction de leurs scores? – BoltClock

+0

par leurs scores. J'essaie en fait de faire «up» down et vice-versa (pas sûr si possible). Je viens d'utiliser "1" dans l'exemple. – Noob

0
if ($sort = "up") 
elseif ($sort = "down") 

devrait être

if ($sort == "up") 
elseif ($sort == "down") 
0

Deux problèmes:

if ($sort = "up") { 

= est l'opérateur d'affectation. Vous devez utiliser == ici si vous voulez tester l'égalité.

En outre, le corps des deux conditionals:

if ($sort = "up") { 
    $where .= " AND $sort > 1"; 
    } 
    elseif ($sort = "down") { 
    $where .= " AND $sort > 1"; 
    } 

sont identiques. Je ne pense pas que vous voulez ajouter la même chaîne de base à la requête, n'est-ce pas? (Accordé $sort sera différent dans les deux cas, mais pourquoi ne pas simplement coder en dur les chaînes si c'est ce que vous voulez dire de toute façon.Cela est vraiment déroutant, et il est difficile de dire exactement quelle est votre intention.)

+0

Merci pour la réponse! :) En réalité, je ne compare pas le tri $ à la même valeur. – Noob

1

Variable 1 = variable 2

double == signifie comparer

aussi, si vous allez utiliser ce code assurez-vous mettre mysql_real_escape_string() autour de vos _GET $ déclarations ou tout ce qui a des entrées utilisateur ou les gens seront en mesure utiliser l'injection sql.

E.g.mysql_real_escape_string ($ _ GET [ 'type']) et si vous utilisez plusieurs fois fait que vous utilisez une variable

Voici le code corrigé;)

function sort_where($where) 
{ 
    if (isset($_GET['sort'])) { 
     $sort = $_GET['sort']; 

     if ($sort == "up") { 
     $where .= " AND $sort > 1"; 
     } 
     elseif ($sort == "down") { 
     $where .= " AND $sort > 1"; 
     } 

    } 

    return $where; 
} 
+0

Je veux dire, faire un 'if (isset ($ _ GET ['sort']))', alors si c'est le cas, 'mysql_real_escape_string ($ _ GET ['sort'])'. – BoltClock