Php foreach pour construire une requête
Résolu/Fermé
A voir également:
- Foreach sql php
- Easy php - Télécharger - Divers Web & Internet
- Sql server recovery - Télécharger - Gestion de données
- Get_magic_quotes_gpc php 8 ✓ - Forum PHP
- Logiciel sql - Télécharger - Bases de données
- Requête sql date supérieure à ✓ - Forum Programmation
6 réponses
4.38 du matin j'ai trouvé ! Plus d'une semaine sur ce truc !
Bon pour ceux que ça interresse voilà comment je m'en suis tiré, pas sur que ça soit rigoureux ou optimal mais ça marche !
L'astuce est de ce souvenir que "1=1" renvoi tjrs "TRUE", je m'en suis servit pour la clause "WHERE" puis géré le "AND" dans le "foreach".
Bon pour ceux que ça interresse voilà comment je m'en suis tiré, pas sur que ça soit rigoureux ou optimal mais ça marche !
L'astuce est de ce souvenir que "1=1" renvoi tjrs "TRUE", je m'en suis servit pour la clause "WHERE" puis géré le "AND" dans le "foreach".
<?php // déclaration des tableaux en fonction du type de champ récupéré // Les checkbox et les listes déroulantes qui retournent rien si elles ne sont pas choisi (18) $tablo1 = array( 'certif'=>$_POST['certif'],'blacklist'=>$_POST['blacklist'],'chrc'=>$_POST['chrc'],'chrcfbi'=>$_POST['chrcfbi'],'chrchbi'=>$_POST['chrchbi'],'chrcles2bi'=>$_POST['chrcles2bi'],'chrf'=>$_POST['chrf'],'chrfbi'=>$_POST['chrfbi'],'chrfh'=>$_POST['chrfh'],'chrh'=>$_POST['chrh'],'chrhbi'=>$_POST['chrhbi'],'chrhh'=>$_POST['chrhh'],'chrtrans'=>$_POST['chrtrans'],'sexe'=>$_POST['sexe'],'pays'=>$_POST['pays'],'region'=>$_POST['region'],'location'=>$_POST['location'],'mobilite'=>$_POST['mobilite']); // Les listes déroulantes pour les tranches d'âge (2) ( 0->Tous, 1->18-25ans, 2->25-30ans ...) (2) $tablo2 = array( 'age1'=>$_POST['age1'], 'age2'=>$_POST['age2']); // Construction de la requête // On initalise la requête et on valide le "WHERE" avec 1=1 qui renvoi tjrs "TRUE" $query = "SELECT * FROM ".PREFIXE."membres WHERE 1=1 "; $and = ' AND '; // On parcourt le tableau foreach($tablo1 as $champ=>$valeur) { if ( $valeur != '' ) { $query .=$and .$champ.'=\''.$valeur.'\''; } // Cas particulier des tranches d'âge foreach($tablo2 as $champ=>$valeur) { if ($valeur != '') { if ($valeur == 1){$query .= ' AND '.$champ.' BETWEEN 18 AND 25'; } if ($valeur == 2){$query .= ' AND '.$champ.' BETWEEN 25 AND 30'; } if ($valeur == 3){$query .= ' AND '.$champ.' BETWEEN 30 AND 40'; } if ($valeur == 4){$query .= ' AND '.$champ.' BETWEEN 40 AND 50'; } if ($valeur == 5){$query .= ' AND '.$champ.' >50'; } } } // Cas particulier du pseudo %LIKE% if ($_POST['pseudo'] != '') { $query .= ' AND pseudo LIKE \'%'.$_POST['pseudo'].'%\''; } // Cas particulier de la photo (si la case est cochée le champ doit avoir un enregistrement) if ($_POST['photo1'] != '') { $query .= ' AND photo1 !=\'\''; } // On exécute la requête $requete = mysql_query($query) or die ("Requête invalide"); ?>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
29 avril 2005 à 20:03
29 avril 2005 à 20:03
Si tu ne veux pas le "AND" dans le premier passage de la boucle, tu devrais plutôt faire:
if ($C == 0) { $and = ''; }
$C++;
if ($C == 0) { $and = ''; }
$C++;
$query = "SELECT * FROM ".PREFIXE."membres WHERE ";
$and = 'AND ';
$C = 0;
foreach($tablo1 as $champ=>$valeur) {
if ($valeur != '' && $C != 0) { $query .=$and .$champ.'=\''.$valeur.'\'';
$C++;
}
}
$and = 'AND ';
$C = 0;
foreach($tablo1 as $champ=>$valeur) {
if ($valeur != '' && $C != 0) { $query .=$and .$champ.'=\''.$valeur.'\'';
$C++;
}
}
Et comme ça :
$query = "SELECT * FROM ".PREFIXE."membres WHERE "; $and = "AND "; $C = 0; foreach( $tablo1 as $champ=>$valeur ) { if ( $C != 0 ) { $query .=$and ; $C++; } $query .= $champ . "='" . $valeur . "' "; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
30 avril 2005 à 13:24
30 avril 2005 à 13:24
Salut,
Une petite idée :
Une petite idée :
$query = "SELECT * FROM ".PREFIXE."membres"; $and = ' WHERE '; // y a un espace avant et après le WHERE foreach($tablo1 as $champ=>$valeur) { if ( $valeur != '' ) $query .=$and .$champ."='$valeur.'"; $and = ' AND ' ; // y a un espace avant et après le AND }
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
>
lolo479
30 avril 2005 à 17:50
30 avril 2005 à 17:50
Salut,
Un petit oubli de { et }
Un petit oubli de { et }
$query = "SELECT * FROM ".PREFIXE."membres"; $and = ' WHERE '; // y a un espace avant et après le WHERE foreach($tablo1 as $champ=>$valeur) { if ( $valeur != '' ) { $query .=$and .$champ."='$valeur.'"; $and = ' AND ' ; // y a un espace avant et après le AND } }
Je précise un peu monproblème.
J'ai un formulaire de recherche avec 22 champs composés de : checkbox, liste déroulante et zone de saisie de texte.
Ce formulaire sert à "interroger" une table avec tout mes champs, là ou ça coince, vous l'aurez compris, c'est la construction dynamique de la requete !
(j'ai bien pensé la construire avec de "if" mais avec 21 champs l'idée n'est pas bonne : trop de possibilité !)
L'utilisateur doit pouvoir, en effet, cocher ou choisir la ou les conditions et avoir un résultat de sa recherche.
J'ai commencé avec ça, en pensant "découper" la requête puis la concaténer ... Mais je bloque !
J'ai un formulaire de recherche avec 22 champs composés de : checkbox, liste déroulante et zone de saisie de texte.
Ce formulaire sert à "interroger" une table avec tout mes champs, là ou ça coince, vous l'aurez compris, c'est la construction dynamique de la requete !
(j'ai bien pensé la construire avec de "if" mais avec 21 champs l'idée n'est pas bonne : trop de possibilité !)
L'utilisateur doit pouvoir, en effet, cocher ou choisir la ou les conditions et avoir un résultat de sa recherche.
J'ai commencé avec ça, en pensant "découper" la requête puis la concaténer ... Mais je bloque !
<?php // déclaration des tableaux en fonction du type de champ récupéré // Les checkbox qui retournent rien si elles ne sont pas cochées (13) $tablo1 = array( 'certif'=>$_POST['certif'], 'blacklist'=>$_POST['blacklist'], 'chrc'=>$_POST['chrc'], 'chrcfbi'=>$_POST['chrcfbi'], 'chrchbi'=>$_POST['chrchbi'], 'chrcles2bi'=>$_POST['chrcles2bi'], 'chrf'=>$_POST['chrf'], 'chrfbi'=>$_POST['chrfbi'], 'chrfh'=>$_POST['chrfh'], 'chrh'=>$_POST['chrh'], 'chrhbi'=>$_POST['chrhbi'], 'chrhh'=>$_POST['chrhh'], 'chrtrans'=>$_POST['chrtrans'], 'photo1'=>$_POST['photo1'], 'sexe'=>$_POST['sexe'], 'pays'=>$_POST['pays'], 'region'=>$_POST['region'], 'location'=>$_POST['location'], 'mobilite'=>$_POST['mobilite']); // Les listes déroulantes pour les tranches d'âge (2) ( 0->Tous, 1->18-25ans, 2->25-30ans ...) (2) $tablo2 = array( 'age1'=>$_POST['age1'], 'age2'=>$_POST['age2']); // Construction de la requête $query = "SELECT * FROM TABLE membres WHERE "; $C = 0; $and = 'AND '; foreach($tablo1 as $champ=>$valeur) { $C++; if ($C == 19) { $and = ''; } if ($valeur != '') { $query .= $champ.'=\''.$valeur.'\' '.$and; } } foreach($tablo2 as $champ=>$valeur) { if ($valeur == 0) { $query .= ' AND '.$champ.'=\'Tous\''; } elseif ($valeur == 1) { $query .= ' AND '.$champ.' BETWEEN 18 AND 25'; } } if ($_POST['pseudo'] != '') { $query .= ' AND pseudo LIKE \'%'.$_POST['pseudo'].'%\''; } // On exécute la requête $requete = mysql_query($query); ?>