Php - foreach pour construire une requête multicritères

[Résolu]
Signaler
Messages postés
4
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
1 mai 2005
-
Messages postés
4
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
1 mai 2005
-
Bonjour, j'essai de contruire dynamiquement une requête mais je n'arrive pas à ce que le "AND" s'écrive au bon endroit !!!
Si qq'un à une idée je suis preuneur, çà fait 3 heures que je suis dessus et je n'arrive à rien !

<?php

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

?>

5 réponses

Messages postés
4
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
1 mai 2005

4.48 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");
?>
Messages postés
4
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
1 mai 2005

Un code un peu plus propre, désolé (mon 1er post ici)

<?php

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

?>
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
Hello,

tes 2 conditions sont identiques.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
Salut,



<?php

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

{

$query .=$champ.'=\''.$valeur.'\'';

}
else

{

$query .=$and .$champ.'=\''.$valeur.'\'';

}
$C++;
}

?>


a +
<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Messages postés
4
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
1 mai 2005

Bonjour etmerci pour vos réponses mais ça ne marche pas non plus !
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 22 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. Le gros soucis et donc la gestion du "AND"
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 et les listes déroulantes qui retournent rien si elles ne sont pas choisi (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'],'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)
$tablo2
= array(
'age1'=>$_POST['age1'
],
'age2'=>$_POST['age2'
]);
// Construction de la requête
// On parcourt tablo1 et on gére l'opérateur AND
$query = "SELECT * FROM ".PREFIXE."membres WHERE "
;
$C = 0
;
$and = 'AND '
;
foreach($tablo1 as $champ=>$valeur
)
{
$C
++; if ($C 18) { $and ''
; }
if ($valeur != ''
)
{ $query .= $champ.'=\''.$valeur.'\' '.$and
; }
}
// 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 IS NOT NULL'
; }
// On exécute la requête
echo"$query"
;
$requete = mysql_query($query) or die ("Requête invalide"
);
?>