J'essaie de créer une logique de recherche qui utilise plusieurs champs de formulaire et ajuste la recherche MySQL en conséquence. Mon principal problème est le traitement de plusieurs cases à cocher. Le ci-dessous me rapproche mais j'obtiens plusieurs "OU" à la fin pour une raison quelconque. Le dessous me donne (nema = '1' OR OR nema = '12' OR OR nema = '4' OR OR ) par exemple. D'autres OR sont ajoutés pour chaque case à cocher. Qu'est-ce que je manque ou que je ne fais pas correctement?

$rating = mysqli_real_escape_string($db, implode(',', $_POST['rating']));

$q = "SELECT * FROM lekker WHERE height BETWEEN 20 AND 30 ";

if (!empty($rating)) {
    
        $var = explode(',',$rating);
        $rating_count = count($var);

        if($rating_count > 1) {   
            $q .= "AND (";
           foreach($var as $test) {
                $q .= "nema = '$test'";
                for($i=0;$i<$rating_count;$i++) {
                    if($i!=$rating_count-1) {
                        $q .= " OR ";
                    }
                }
            }
            $q .= " )";

        } else {
                $q .= "nema = '$rating'";
        }

}

$q .= " ORDER BY `part` ASC";

Voici la sélection que j'essaie d'atteindre:

SELECT * FROM lekker WHERE height BETWEEN 20 AND 22 AND (nema = '1' OR nema = '12') ORDER BY part ASC
-1
RonnieT 18 sept. 2020 à 03:02

2 réponses

Meilleure réponse

J'ai supprimé la deuxième boucle et j'ajoute toujours OU, puis vous pouvez supprimer la dernière à la fin

$rating = mysqli_real_escape_string($db, implode(',', $_POST['rating']));

$q = "SELECT * FROM lekker WHERE height BETWEEN 20 AND 30 ";

if (!empty($rating)) {
    
        $var = explode(',',$rating);
        $rating_count = count($var);

        if($rating_count > 1) {   
            $q .= "AND (";
           foreach($var as $test) {
                $q .= "nema = '$test' OR ";
                
            }
            $q=substr($q, 0,-4);
            $q .= " )";

        } else {
                $q .= "nema = '$rating'";
        }

}

$q .= " ORDER BY `part` ASC";
1
Erry215 18 sept. 2020 à 00:38

Au lieu de vous soucier de savoir si vous devez ou non ajouter un OU, ajoutez-le simplement à chaque fois via votre foreach, puis coupez le OU de fin une fois que vous avez terminé avec le foreach.

if ($rating_count > 1) {
   $q .= "AND (";
   foreach($var as $test) {
        $q .= "nema = '$test' OR ";
   }
   $q .= rtrim($q,' OR ') . ' )';
} else {
        $q .= "nema = '$rating'";
}
1
Dave 18 sept. 2020 à 00:37