Php foreach pour construire une requête

Résolu/Fermé
lolo479 - 29 avril 2005 à 19:49
 lolo479 - 1 mai 2005 à 04:51
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 !

<?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:

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".

<?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"); 
?> 
1
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
Si tu ne veux pas le "AND" dans le premier passage de la boucle, tu devrais plutôt faire:
if ($C == 0) { $and = ''; }
$C++;
0
Non ça ne change rien ! il y a tjrs un "AND" au début !

$query = "SELECT * FROM ".PREFIXE."membres WHERE "; 
$and = 'AND '; 
foreach($tablo1 as $champ=>$valeur) 
	{ 
	if ($C == 0) { $and = ''; } 
	$C++; 	
	if ($valeur != '') 
		{ $query .=$and .$champ.'=\''.$valeur.'\''; } 
	} 
0
$query = "SELECT * FROM ".PREFIXE."membres WHERE ";
$and = 'AND ';
$C = 0;
foreach($tablo1 as $champ=>$valeur) {
if ($valeur != '' && $C != 0) { $query .=$and .$champ.'=\''.$valeur.'\'';
$C++;
}
}
0
Merci Nico pour ta réponse, mais non ça ne marche pas ! Tjrs le "AND" mal placé !
0
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 . "' ";
}
0
Bonjour ric,
non ça ne larche pas non plus !

SELECT * FROM fk_membres WHERE certif='1' blacklist='' chrc='' chrcfbi='' chrchbi='' chrcles2bi='' chrf='' chrfbi='' chrfh='' chrh='' chrhbi='' chrhh='' chrtrans='' sexe='' pays='' region='' location='' mobilite='' Requête invalide
0

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
Salut,
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
  }
0
Bonjour crabs,
Merci pour cette idée c'est déjà mieux mais ça ne marche que si le premiers élément de mon "array" est obligatoirement choisit !
Sinon ça donne :

SELECT * FROM fk_membres AND chrf='1.' AND sexe='13.' AND region='5.'   ------> Requête invalide
0
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
Salut,
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
     }
  }
0
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 !


<?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); 
?>  

0