Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 18h56   #1
Invité régulier
 
christian zanca
Inscription : avril 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : christian zanca

Informations forums :
Inscription : avril 2010
Messages : 18
Points : 7
Points : 7
Par défaut Filtres SQL problème de requête

bonjour à tous,
j'ai une question sur une raquette SQL : je voudrai filtrer par département ET/OU par catégorie ET/OU par code postale. Quand je mets OU ça fonctionne mais quand je mets AND rien ne s'affiche. Quelqu'un peut m'aider ?
Voici le code sql :

Code :
1
2
3
4
5
6
<?php mysql_select_db($database_annuaire, $annuaire);
$query_rs_annonce = sprintf("SELECT * FROM an_annonce WHERE nomcat=%s AND dept=%s OR cp=%s", GetSQLValueString($colnomcat_rs_annonce, "text"),GetSQLValueString($coldept_rs_annonce, "text"),GetSQLValueString($colcp_rs_annonce, "int"));
$query_limit_rs_annonce = sprintf("%s LIMIT %d, %d", $query_rs_annonce, $startRow_rs_annonce, $maxRows_rs_annonce);
$rs_annonce = mysql_query($query_limit_rs_annonce, $annuaire) or die(mysql_error());
$row_rs_annonce = mysql_fetch_assoc($rs_annonce);
?>
cris84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2011, 18h47   #2
Invité régulier
 
christian zanca
Inscription : avril 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : christian zanca

Informations forums :
Inscription : avril 2010
Messages : 18
Points : 7
Points : 7
Personne n'a une idée ?
du coup de je suis obligé de mettre AND sinon ça ne fonctionne pas.
Je voudrai arriver à filtrer avec ET OU cad en remplissant un champ ET/OU 2 champs ET/OU trois champs. Merci d'avance.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$coldept_rs_annonce = "0";
if (isset($_GET['dept'])) {
  $coldept_rs_annonce = $_GET['dept'];
}
$colnomcat_rs_annonce = "0";
if (isset($_GET['cat'])) {
  $colnomcat_rs_annonce = $_GET['cat'];
}
$colcp_rs_annonce = "0";
if (isset($_GET['cp'])) {
  $colcp_rs_annonce = $_GET['cp'];
}
mysql_select_db($database_annuaire, $annuaire);
$query_rs_annonce = sprintf("SELECT * FROM an_annonce WHERE (dept=%s AND nomcat=%s AND cp=%s", GetSQLValueString($coldept_rs_annonce, "text"),GetSQLValueString($colnomcat_rs_annonce, "text"),GetSQLValueString($colcp_rs_annonce, "int"));
$query_limit_rs_annonce = sprintf("%s LIMIT %d, %d", $query_rs_annonce, $startRow_rs_annonce, $maxRows_rs_annonce);
$rs_annonce = mysql_query($query_limit_rs_annonce, $annuaire) or die(mysql_error());
$row_rs_annonce = mysql_fetch_assoc($rs_annonce);
cris84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 21h50   #3
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 302
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 302
Points : 4 480
Points : 4 480
les requêtes sql sont bornées et ce jouent par priorité. donc un "et / ou " n'existe pas tu doit générer autant de cas que tu le souhaites en réalisation séparé par des () pour limité cas.

(nomcat=%s AND dept=%s) OR (nomcat=%s and cp=%s) or ( etc ....) or ( ....)

je pense que tu auras plus d'aide dans la section SQL que DW puisque la question n'y est pas liée.
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 11h40   #4
Invité régulier
 
christian zanca
Inscription : avril 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : christian zanca

Informations forums :
Inscription : avril 2010
Messages : 18
Points : 7
Points : 7
Bonjour et merci pour cette réponse.
Effectivement ça fonctionne en filtrant sur 2 champs.
Mais impossible sur 3 champs
Si je fais (nomcat=%s AND dept=%s AND cp=%s) alors ça affiche le nombre total d'enregistrement

une petite idée ? c'est quand même spécifique à Dreamweaver si je pose la qestion dans SQL j'ai peur de ne pas avoir de réponse.*

Merci d'avance
cris84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 23h36   #5
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 302
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 302
Points : 4 480
Points : 4 480
affiche ta requête en clair pour vérifier qu'elle est correct. car en principe sauf si tout tes éléments choisi on un même nomcat, dept, cp tu ne devrais avoir que ceux disposant de ses infos.
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h49   #6
Invité régulier
 
christian zanca
Inscription : avril 2010
Messages : 18
Détails du profil
Informations personnelles :
Nom : christian zanca

Informations forums :
Inscription : avril 2010
Messages : 18
Points : 7
Points : 7
voici la requête :

Code :
1
2
3
SELECT *
FROM an_annonce
WHERE (dept=coldept OR cp=colcp OR nomcat=colnomcat)  OR (dept=coldept AND cp=colcp AND nomcat=colnomcat) OR (cp=colcp AND nomcat=colnomcat) OR (dept=coldept AND cp=colcp) OR (dept=coldept AND nomcat=colnomcat) OR (cp=colcp OR nomcat=colnomcat) AND (dept=coldept OR cp=colcp) AND (dept=coldept OR nomcat=colnomcat)
je l'affiche aussi sans code pour être plus lisible :

Citation:
SELECT *
FROM an_annonce
WHERE (dept=coldept OR cp=colcp OR nomcat=colnomcat) OR (dept=coldept AND cp=colcp AND nomcat=colnomcat) OR (cp=colcp AND nomcat=colnomcat) OR (dept=coldept AND cp=colcp) OR (dept=coldept AND nomcat=colnomcat) OR (cp=colcp OR nomcat=colnomcat) AND (dept=coldept OR cp=colcp) AND (dept=coldept OR nomcat=colnomcat)
cris84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 21h58   #7
Membre du Club
 
Inscription : décembre 2010
Messages : 46
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 46
Points : 55
Points : 55
Citation:
Envoyé par Vil'Coyote
je pense que tu auras plus d'aide dans la section SQL que DW puisque la question n'y est pas liée.
Citation:
Envoyé par cris84
c'est quand même spécifique à Dreamweaver si je pose la qestion dans SQL j'ai peur de ne pas avoir de réponse
Cela n'a rien à voir avec Dreamweaver, ce type de requête est trop complexe pour DW.

En mettant des OR partout il est normal que la requête renvoi tout.

C'est comme si tu demandais je veux les t-shirts (bleu OU xl) OU (bleu ET xl) = tu auras tous les (t-shirts bleu + tous les t-shirts xl) + (tous les t-shirts bleu ET xl).

Une solution est d'écrire dynamiquement la requête en fonction des éléments remplis.

Bonjour,

Pour Cris84, ci-dessous une variante adaptée à ton cas et à compléter

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$request = '"AND" = "AND"';
// début de la requête variable, ce "AND" = "AND" permet de construire un début valide, même si la suite des champs est vide.
 
if ( $_GET['dept'] != "*" ) {
  $request .= ' AND  dept = "'.$_GET['dept'].'"';
}
 
if ( $_GET['cat'] != "*" ) {
  $request .= ' AND  nomcat = "'.$_GET['cat'].'"';
}
 
...
 
SELECT *
FROM an_annonce
WHERE $request
Evidement il faut filtrer tout cela sinon gare aux injections SQL.
ysloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h01.


 
 
 
 
Partenaires

Hébergement Web