Rechercher : dans
Par :

Php foreach pour construire une requête

Dernière réponse le 1 mai 2005 à 04:51:11 lolo479, le 29 avr 2005 à 19:49:58 
 Signaler ce message aux modérateurs

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.'\''; } 
	}
?> 

Meilleures réponses pour « Php foreach pour construire une requête » dans :
PHP - Connexion à un annuaire LDAP VoirIntroduction à LDAP PHP permet la connexion et l'envoi de requêtes sur un annuaire LDAP, c'est-à-dire un serveur permettant de stocker des informations de manière hiérarchique. Un serveur LDAP est conçu pour être capable de gérer les opérations...

1

kilian, le 29 avr 2005 à 20:03:40

Si tu ne veux pas le "AND" dans le premier passage de la boucle, tu devrais plutôt faire:
if ($C == 0) { $and = ''; }
$C++;

Répondre à kilian

2

lolo479, le 29 avr 2005 à 20:10:51

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.'\''; } 
	} 

Répondre à lolo479

3

Nico, le 29 avr 2005 à 22:15:52

$query = "SELECT * FROM ".PREFIXE."membres WHERE ";
$and = 'AND ';
$C = 0;
foreach($tablo1 as $champ=>$valeur) {
if ($valeur != '' && $C != 0) { $query .=$and .$champ.'=\''.$valeur.'\'';
$C++;
}
}

Répondre à Nico

4

lolo479, le 30 avr 2005 à 03:02:33

Merci Nico pour ta réponse, mais non ça ne marche pas ! Tjrs le "AND" mal placé !

Répondre à lolo479

5

ric, le 30 avr 2005 à 12:37:28

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 . "' ";
}

Répondre à ric

7

lolo479, le 30 avr 2005 à 17:23:23

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

Répondre à lolo479

6

crabs, le 30 avr 2005 à 13:24:59

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
  }
..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

8

lolo479, le 30 avr 2005 à 17:28:43

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

Répondre à lolo479

10

crabs, le 30 avr 2005 à 17:50:17

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
     }
  }
..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

9

lolo479, le 30 avr 2005 à 17:33:06

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

Répondre à lolo479

11

 lolo479, le 1 mai 2005 à 04:51:11

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

Répondre à lolo479