> Tous les forums > Forum des Webmasters
 Requete SQL avec champ nul
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
007good
  Posté le 03/03/2013 @ 21:54 
Aller en bas de la page 
Petit astucien

Bonjour,


Voila j'ai une requete SQL a effectué ce type.

$req = $bdd->prepare('SELECT * FROM produit, gamme, couleur, type, categorie WHERE produit.categorie = :categorie AND produit.type = :type AND produit.gamme = :gamme AND produit.couleur = :couleur AND produit.gamme = gamme.id_gamme AND produit.couleur = couleur.id_couleur AND produit.type=type.id_type AND produit.categorie=categorie.id_categorie');
$req->execute(array(
'categorie' => $categorie,
'gamme' => $gamme,
'type' => $type,
'couleur' => $couleur));

A savoir que malheuresement, $categorie , $gamme, ... peut etre vide par alternance, cela dépends de ce que choisis l'internaute pour faire sa recherche.

Si, je laisse la variable non défini, j'ai évidemment une erreur..

Si, j'initialise la variable a une valeur '0' par exemple, je n'ai aucun retour car aucun de mes produits n'a pour valeur '0' dans la base de données.

En gros, est-il possible de dire, SI la variable n'est pas défini, alors prendre toutes les gammes, catégorie, ou autre...

Pour l'instant la seul solution que j'ai trouvée c'est de faire 16requetes... pour les 4x4=16 type de requetes... Mais bon, je pense qu'il y a une autre solution ???

Merci d'avance

Publicité
Draleg
 Posté le 05/03/2013 à 18:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Pourquoi ne pas mettre dans ta base de donnée un "faux produit" avec le numéro idoine si non choisi ?

Ca peut-etre un moyen de contourner le problème en attendant.

Bonne journée.

007good
 Posté le 07/03/2013 à 19:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Je ne comprends pas ton idée Draleg :(

Draleg
 Posté le 10/03/2013 à 20:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour, je reprends ton problème (j'ai peut-être mal compris aussi...):

A savoir que malheuresement, $categorie , $gamme, ... peut etre vide par alternance, cela dépends de ce que choisis l'internaute pour faire sa recherche.

Si, je laisse la variable non défini, j'ai évidemment une erreur..

Si, j'initialise la variable a une valeur '0' par exemple, je n'ai aucun retour car aucun de mes produits n'a pour valeur '0' dans la base de données.

Donc pour la première partie:

Si, je laisse la variable non défini, j'ai évidemment une erreur..

Pour le résoudre met par exemple lorsque "vide" = 888

Si, j'initialise la variable a une valeur '0' par exemple, je n'ai aucun retour car aucun de mes produits n'a pour valeur '0' dans la base de données.

Et dans ta DB tu met un objet portant le nom "Vide" et comme valeur "888" .

Du coups tu sais initialiser ta variable et avoir un retour selon le code 888 et ignorer ainsi le paramètre de recherche si celui-ci est 888 ...

Maintenant je ne connais pas le but et l'intégralité de ton code mais tel que j'ai compris ton problème cela pourrait résoudre le problème du moins temporairement si aucune autre solution ne t'es soumise.

Bonne journée.

007good
 Posté le 12/03/2013 à 17:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Et non ;)
Je me re-explique.
J'ai 4 champs : categorie ; type ; couleur ; gamme .

L'utilisateur a 16possibilité de recherche au final, soit il choisis que la gamme, soit il choisis que la couleur, soit la gamme et la couleur, etc...

Donc ma page de traitement a 4 variables

$gamme , $categorie , $couleur , $type

Ma question est : comment faire 1 seule requete qui gererais tous les cas ?

Car si je fais une requete du type :

prepare(select * from produits WHERE gamme = *gamme, categorie = :categorie, etc...) avec l'association au variable derriere

Si l'utilisateur choisis les 4 tout se passe bien, mais si l'utilisateur ne selectionne que la categorie par exemple alors il veut tous les produits de cette catégorie.

MAIS SQL lui voit $categorie = x , $gamme='0', $type='0', etc.. et donc ne retourne rien ....
Je voudrais que SQL voit tout les produits dont la catégorie est x, et qu'il ne tienne pas compte des autre champs..

y.bli
 Posté le 14/03/2013 à 17:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Maître astucien
007good a écrit :

Et non ;)
Je me re-explique.
J'ai 4 champs : categorie ; type ; couleur ; gamme .

L'utilisateur a 16possibilité de recherche au final, soit il choisis que la gamme, soit il choisis que la couleur, soit la gamme et la couleur, etc...

Donc ma page de traitement a 4 variables

$gamme , $categorie , $couleur , $type

Ma question est : comment faire 1 seule requete qui gererais tous les cas ?

Car si je fais une requete du type :

prepare(select * from produits WHERE gamme = *gamme, categorie = :categorie, etc...) avec l'association au variable derriere

Si l'utilisateur choisis les 4 tout se passe bien, mais si l'utilisateur ne selectionne que la categorie par exemple alors il veut tous les produits de cette catégorie.

MAIS SQL lui voit $categorie = x , $gamme='0', $type='0', etc.. et donc ne retourne rien ....
Je voudrais que SQL voit tout les produits dont la catégorie est x, et qu'il ne tienne pas compte des autre champs..

Bonjour,

Avant d'aller plus loin, pour moi il y a 15 combinaisons (on exclut qu'il ne choisisse rien...)

La formule qui donne les combinaisons de p objets parmi n éléments est : C = (n !) / ((n-p) ! * p !), donc quand on fait :

- 1 choix -> C = 4
- 2 choix -> C = 6
- 3 choix -> C = 4
- 4 choix -> C = 1

=> 15 combinaisons

@+



Modifié par y.bli le 14/03/2013 20:38
y.bli
 Posté le 15/03/2013 à 10:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Maître astucien

pour commencer à réfléchir à une solution, as-tu une idée de l'ordre de grandeur du nombre de produits (dizaines, centaines, milliers....) ?

@+



Modifié par y.bli le 15/03/2013 13:17
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
11,45 €Microsoft bluetooth mouse à 11,45 €
Valable jusqu'au 27 Septembre

Amazon fait une promotion sur la souris Microsoft bluetooth mouse qui passe à 11,45 € au lieu de 25 €. La Microsoft Bluetooth Mouse est une souris qui vous suit partout, que ce soit en déplacement, au bureau ou à la maison, elle répond toujours présente. Intégrant un capteur optique de 1000 dpi, elle offre un suivi rapide sur la plupart des surfaces. Sans fil, elle se connecte à votre ordinateur via Bluetooth afin de vous permettre de travailler en toute liberté.


> Voir l'offre
24,99 €Clé HDMI Fire TV Stick 2021 (Prime Video, Netflix, Disney+, Molotov, MyCanal sur votre TV) à 24,99 €
Valable jusqu'au 27 Septembre

Amazon fait une promotion sur sa nouvelle clé HDMI Amazon Fire TV Stick qui passe à 24,99 € au lieu de 39,99 €. Cette clé HDMI à brancher sur votre TV possède un processeur quadricoeur, 1 Go de RAM et 8 Go d'espace de stockage, le WiFi et le bluetooth. Avec elle, vous allez pouvoir voir facilement Prime Video, Netflix, Disney+, YouTube, Molovov, MyCanal, Spotify sur votre TV Full HD. Cette nouvelle version 2021 est compatible Alexa. Une télécommande avec des boutons pour contrôler également la TV est fournie. Elle possède des boutons pour un accès direct à Netflix, Prime Video, Disney Plus et Amazon Music.

Notez qu'il est possible de coupler un casque bluetooth avec le Fire TV Stick afin de regarder tranquillement la TV sans déranger vos proches.


> Voir l'offre
32,90 €Disque dur Seagate BarraCuda 1 To à 32,90 €
Valable jusqu'au 27 Septembre

Cdiscount propose actuellement le disque dur Seagate BarraCuda - 1 To (ST1000DM010) à 32,90 €On le trouve ailleurs autour de 42 €. Ce disque dur 3.5 pouces SATA III tourne à 7200tr/min et possède 64Mo de cache. Notez que la version 2 To est également en promotion à 44,99 €.


> Voir l'offre

Sujets relatifs
Bogue avec champ de formulaire (IE)
Hébergement de site avec nom de domaine
Migration PHP 5.3 vers 5.5 ou 5.6 (avec WAMP)
background css disparait avec le responsive design
Requête SQL - PHP via PDO
Barre intempestive avec FF et pas avec IE
Problème avec free
défaut sur mon site avec FF et pas avec IE
créer mappage avec dreamweaver!
site avec virus que faire
Plus de sujets relatifs à Requete SQL avec champ nul
 > Tous les forums > Forum Forum des Webmasters