Php foreach pour construire une requête
Résolu
lolo479
-
lolo479 -
lolo479 -
Bonjour, j'essai de contruire dynamiquement une requête mais je n'arrive pas à ce que le "AND" ne s'écrive pas lors du premier passage dans la boucle !!!
Si qq'un à une idée je suis preuneur, çà fait 3 heures que je suis deçu et je n'arrive à rien !
Si qq'un à une idée je suis preuneur, çà fait 3 heures que je suis deçu et je n'arrive à rien !
<?php $query = "SELECT * FROM ".PREFIXE."membres WHERE "; $C = 0; $and = 'AND '; foreach($tablo1 as $champ=>$valeur) { $C++; if ($C == 18) { $and = ''; } if ($valeur != '') { $query .=$and .$champ.'=\''.$valeur.'\''; } } ?>
A voir également:
- Foreach sql php
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Logiciel sql - Télécharger - Bases de données
- Alert php ✓ - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
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"); ?>
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
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 }
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); ?>