where et and = "tous" ?

where et and = "tous" ? - PHP - Programmation

Marsh Posté le 10-03-2011 à 17:50:35    

Bonjour,  
 
J'ai une question toute conne, mais j'arrive pas à trouver la solution  :fou: .
 
Je vous expose mon casse tête, en faite j'ai deux balises select qui renvoient 2 résultats (par exemple) et j'aimerais pouvoir sélectionner un résultat qui renvoie toutes les valeurs possibles, quand on ne sélectionne pas une valeur précise.  
 
Bon un exemple sera peut être plus explicite :
 
Donc on a en php :
 
SELECT val1, val2
FROM table
WHERE val1 = ? AND val2 = ?;
 
Si on prend deux choix précis :
 
<select name="choix1">
<option value="choixval1 0"></option>
<option value="choixval1 1">1</option>
<option value="choixval1 2">2</option>
</select>
 
<select name="choix2">
<option value="choixval2 0"></option>
<option value="choixval2 1">a</option>
<option value="choixval2 2">b</option>
</select>
 
SELECT val1, val2
FROM table
WHERE val1 = "choixval1 1" AND val2 = "choixval2 1";
 
Mais si on ne prend qu'un seul choix précis pour le choix 1, je mets quoi dans la deuxième possibilité pour afficher toutes les valeurs de 2 ? Donc dans value="choixval2 0" à la place de choixval2 0 ?
 
SELECT val1, val2
FROM table
WHERE val1 = "choixval1 1" AND val2 = "?????";


Message édité par jamaica ska le 10-03-2011 à 21:02:28
Reply

Marsh Posté le 10-03-2011 à 17:50:35   

Reply

Marsh Posté le 10-03-2011 à 20:16:58    

tu peux construire ta requête en PHP en fonction de ce que tu as en variables POST aussi

Reply

Marsh Posté le 10-03-2011 à 21:02:05    

Ouai mais en fait je voudrais que ça me sorte (si je précise pas la variable deux et que la variable 1 est choixval1 1) :
 
- La variable choisie est 1 (choixval1 1) et a (choixval2 1).
 
- La variable choisie est 1 (choixval1 1) et b (choixval2 2).
 
Donc en gros tous les couples possibles avec les variables.

Reply

Marsh Posté le 10-03-2011 à 23:15:35    

Le mieux, c'est de construire la clause "WHERE" de ta requête en plusieurs fois, chaque menu ajoutant ou non un critère de sélection :
where="WHERE 1"
if ($choix1 <> "choixval1 0" ) where .= ' AND (val1="' . $choix2 . '" )'
if ($choix2 <> "choixval2 0" ) where .= ' AND (val2="' . $choix2 . '" )'
 
Qui te donne au final :
WHERE 1 AND (val1="$choix1" ) AND (val2="$choix2" )
 
Le "1" au début permet de ne pas se poser de question sur le fait de mettre ou non le "AND"  :)


Message édité par mrbebert le 10-03-2011 à 23:16:38

---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 11-03-2011 à 11:53:05    

Le mieux c'est aussi d'utiliser un bind de variables SQL aussi... :o
 
Non parce que vive les bugs à construire les requêtes comme ça quoi... :'(


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 11-03-2011 à 14:55:59    

MEI a écrit :

Le mieux c'est aussi d'utiliser un bind de variables SQL aussi... :o
 
Non parce que vive les bugs à construire les requêtes comme ça quoi... :'(


 
Mais +1 quoi ... C'est horrible cette épidémie de gens nostalgiques des années 90 qui écrivent toutes leurs requêtes sans passer par PDO&co :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 11-03-2011 à 15:04:21    

esox_ch a écrit :


 
Mais +1 quoi ... C'est horrible cette épidémie de gens nostalgiques des années 90 qui écrivent toutes leurs requêtes sans passer par PDO&co :heink:


Sans même faire du PDO où utiliser un ORM, écrire une requête spécifique MySQL ou Oracle avec du SQL pas normé, soit.
 Mais au moins utilisé les bonnes pratiques et bindéer/échapper tout ça pour éviter que la première variable contenant un ' ou un " fasse péter l'application. :o
 
D'autant qu'autant mysqli que oci8 supportent ça...
 
C'est comme ceux qui veulent faire de l'UTF-8 mais qui ne lissent pas la doc. et font une requête SQL "set names ..." au lieu d'utiliser la fonction mysqli::set_charset... :spamafote:


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 11-03-2011 à 16:48:17    

Eh oh, on se calme :o  
Je sais bien qu'il serait judicieux d'avoir vérifier les données au préalable mais le but n'était pas non plus de refaire la page entière, juste de montrer une façon différente de voir les choses [:cerveau manust]  
 
Ceci dit, ça m'intéresserait d'avoir un exemple de requête préparée pour ce type de cas où on ne sait pas exactement le nombre de critères qui seront utilisés [:figti]


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 11-03-2011 à 16:57:47    

En gros :

Code :
  1. $params = array();
  2. $sql = "... where 1=1";
  3. if ($toto) {
  4.     $sql . = " and toto = ?";
  5.     $params[] = $toto;
  6. }
  7. if ($tata) {
  8.     $sql . = " and tata = ?";
  9.     $params[] = $tata;
  10. }
  11. $stmt = mysqli_prepare($link, $sql);
  12. foreach ($params as $param) {
  13.     mysqli_stmt_bind_param($stmt, 's', $param);
  14. }



---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 11-03-2011 à 22:33:37    


si  j'ai bien compris alor tu fais comme ce si:

Code :
  1. if ($choi==1){
  2. $choi= 'val1 = '."choixval1 1";
  3. }
  4. else{
  5. $choi='val1 ='. "choixval1 1".' AND val2 ='."blabla";
  6. }
  7. SELECT val1, val2
  8. FROM table
  9. WHERE $choi


Message édité par keusty78 le 12-03-2011 à 14:14:38
Reply

Marsh Posté le 11-03-2011 à 22:33:37   

Reply

Marsh Posté le 12-03-2011 à 13:27:21    

MEI a écrit :

En gros :

Code :
  1. $params = array();
  2. $sql = "... where 1=1";
  3. if ($toto) {
  4.     $sql . = " and toto = ?";
  5.     $params[] = $toto;
  6. }
  7. if ($tata) {
  8.     $sql . = " and tata = ?";
  9.     $params[] = $tata;
  10. }
  11. $stmt = mysqli_prepare($link, $sql);
  12. foreach ($params as $param) {
  13.     mysqli_stmt_bind_param($stmt, 's', $param);
  14. }



Utiliser une requête préparée pour éviter les injections SQL, ça, d'accord [:cosmoschtroumpf]  
Je pensais qu'il existait une astuce pour ce type de situation mais en fait, c'est le même principe de construction de la requête, au fur et à mesure du traitement des paramètres, que ce que j'indiquais.


---------------
Doucement le matin, pas trop vite le soir.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed