Php foreach pour construire une requête

Résolu
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 !

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

lolo479
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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
lolo479
 
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
Nico
 
$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
lolo479
 
Merci Nico pour ta réponse, mais non ça ne marche pas ! Tjrs le "AND" mal placé !
0
ric
 
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
lolo479
 
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   Statut Membre Dernière intervention   507
 
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
lolo479
 
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   Statut Membre Dernière intervention   507 > lolo479
 
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
lolo479
 
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