Requête SQL

Résolu/Fermé
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 - 6 févr. 2009 à 14:30
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 - 10 févr. 2009 à 10:23
Bonjour,


J'ai un formulaire avec 3 champs à remplir et un bouton submit.
Derrière, j'appel une autre page de mon site pour faire la requête et afficher les résultats.

Difficile à expliquer, j'avoue ...

En gros ma requête dit aujourd'hui :

SELECT * FROM table_test
WHERE champ_1 = STR_TO_DATE('".addslashes($monentree1surformulaire)."', '%d/%m/%Y')
AND champ_2 = ('".$monentree2surformulaire."')
AND champ_3 = ('".$monentree3surformulaire."')
ORDER BY champ_1

Hors dans le cas présent, si je ne renseigne qu'un champ sur les 3, je n'ai aucun résultat.
Il faut que je renseigne les 3 si je veux au moins 1 résultat !

Savez-vous comment monter ma requête pour que je puisse (par ex:) avoir 130 résultats si $monentree1surformulaire est le seul renseigné puis plus que 122 si $monentree2surformulaire est aussi renseigné et que 8 des 130 premiers résultats ne sont pas = à $monentree2surformulaire, etc etc pour $monentree3surformulaire .

Merci d'avance à vous.
A bientôt.

Boueep

16 réponses

freto Messages postés 1542 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 161
6 févr. 2009 à 16:18
Salut.
Je vois bien une solution en php, qui se déroulerait comme ceci:
<?php
$requete="SELECT * FROM table_test";
if ( isset($monentree1surformulaire) && $monentree1surformulaire != ""){
    $requete=$requete."WHERE champ_1 = STR_TO_DATE('".addslashes($monentree1surformulaire)."', '%d/%m/%Y')";
    if (isset($monentree2surformulaire) && $monentree2surformulaire != ""){
        $requete=$requete."AND champ_2 = ('".$monentree2surformulaire."')";
        if (issetisset($monentree3surformulaire) && $monentree3surformulaire != ""){
            $requete=$requete."AND champ_3 = ('".$monentree3surformulaire."')";
        }
    }
}
$requete=$requete."ORDER BY champ_1";
//la suite des évennements
?>


Bon, cela suppose que si $monentree1surformulaire n'est pas renseignée, les autres ne le sont pas non plus.
Si ce n'est pas le cas, il faut adapter cette structure en ajoutant des conditions.
0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
8 févr. 2009 à 22:13
Bonjour et merci :)

Dans ma démarche, n'importe quel champ peut être vide si au moins un autre est renseigné ...
La requête ci-dessus s'inscrit dans cette optique ?

D'après ce qui est précisé à la fin ... non ...
Enfin si j'ai bien comprit :D

Merci en tout cas !
0
seminoque Messages postés 12 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 10 mai 2009
8 févr. 2009 à 22:23
Je ne sais pas quel langage SQL tu utilises, mais si la fonction ISNULL existe je te propose l'astuce suivante :

SELECT * FROM table_test
WHERE champ_1 = ISNULL(STR_TO_DATE('".addslashes($monentree1surformulaire)."', '%d/%m/%Y'),champ_1)
AND champ_2 = ISNULL(('".$monentree2surformulaire."') ,champ_2)
AND champ_3 = ISNULL(('".$monentree3surformulaire."') ,champ_3)
ORDER BY champ_1
0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
8 févr. 2009 à 22:27
Merci je vais essayer ça de suite et te tiens informé !
Je croise les doigts !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
8 févr. 2009 à 22:31
Il me retourne l'erreur suivante :

"Incorrect parameter count in the call to native function 'ISNULL'"

:(
0
seminoque Messages postés 12 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 10 mai 2009
8 févr. 2009 à 22:56
Quel SGBD utilises-tu ? Oracle ? MS SQL Server ? MySQL ?

D'après le message, il n'y a pas le bon nombre de paramètre dans la fonction ISNULL. L'exemple que je t'ai donné est en MS SQL Server et il y a bien les deux paramètres attendus.
0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
8 févr. 2009 à 23:12
Je suis en MySQL
J'ai effectué des recherches .... en MySQL l'équivalent de ISNULL serait IFNULL.

J'ai donc essayé avec IFNULL.

Plus d'erreur SQL, mais pas de résultat lors de l'execution de ma requête :(
0
974_Vin's_974 Messages postés 547 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 19 février 2009 102
9 févr. 2009 à 06:09
essaye IS NULL ... Séparé ..

0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
9 févr. 2009 à 09:23
ça ne marche pas ...
a priori c'est à choix "unique" IS NULL non ?
0
974_Vin's_974 Messages postés 547 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 19 février 2009 102
9 févr. 2009 à 10:53
Moi jte conseil de faire 3 requete diférentes comme ca :

SELECT * FROM table_test
WHERE champ_1 = ISNULL(STR_TO_DATE('".addslashes($monentree1surformulaire)."', '%d/%m/%Y'),champ_1)


SELECT * FROM table_test
WHEREchamp_2 = ISNULL(('".$monentree2surformulaire."') ,champ_2)


SELECT * FROM table_test
WHEREchamp_3 = ISNULL(('".$monentree3surformulaire."') ,champ_3)


Et ensuite, chak résultat tu les mets dans une variable, puis tu fé ta condition if ......

tu vérifie sy ya un ki é nul ou pas ...

0
WHEREchamp_2 = ISNULL(('".$monentree2surformulaire."') ,champ_2)
encore désolé, mais encore du vraiment n'importe quoi
Je suis sûr que tu es de bonne foi, mais je suis aussi sûr de ta totale incompétence pour répondre à ce genre de question
0
974_Vin's_974 Messages postés 547 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 19 février 2009 102
9 févr. 2009 à 11:33
Pff té ferme ta gueule occupe toi d'tes affaires dont, je dis c'qui me plait et si t'as rien d'autre à faire , ben ché pas moi, va chercher une occupation !!

0
Je comprends très bien que ma remarque ne te plaise pas. N'empêche qu'elle est est vraie.
Tu as le droit de dire ce qui te plaît, mais quand ce sont des erreurs, je me sens le devoir de le signaler à ceux qui posent des questions pour éviter qu'ils perdent leur temps en essais inutiles.
Et en matière d'erreur, ces derniers temps, tu es un multi récidiviste.
0
$requete='';
if (!empty($monentree1surformulaire))
$requete.= "champ1=STR_TO_DATE('$monentree1surformulaire', '%d/%m/%Y')";

if (!empty($monentree2surformulaire))
$requete.= (strlen($requete)>0 ? " AND ":"")."champ2='".mysql_real_escape_string($monentree2surformulaire)."'";

if (!empty($monentree3surformulaire))
$requete.= (strlen($requete)>0 ? " AND ":"")."champ3='".mysql_real_escape_string($monentree3surformulaire)."'";

if (!empty($requete)) $requete = "SELECT * FROM table_test $requete ORDER BY champ_1";
0
974_Vin's_974 Messages postés 547 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 19 février 2009 102
9 févr. 2009 à 11:43
$nb=mysql_numrows($rep)


C pas la meme chose ça ????

Ensuite tu vérifie si c supérieur à 0 !!! C tout !!

Pff..

0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
9 févr. 2009 à 12:04
Bonjour,

Tout d'abord, merci de votre aide.
Je ne m'interposerai pas dans vos échanges car nocive comme je suis, il m'est difficile de voir qui peut bien avoir tord ou raison.

Ce que je vois c'est que l'un comme l'autre vous avez prit le temps d'essayer de m'aider et pour cela, encore merci.

Toto :

Ta requête à l'air de fonctionner.
Je me suis permis d'y apporter une modification car avant cela ça ne marchait pas.
==> "SELECT * FROM table_test WHERE $requete ORDER BY champ_1";

Je vais garder cette version :)

Je me confronte néanmoins à un cas d'école ...

Dans mon "$monentree2surformulaire" j'ai voulu ne taper que le début du mot à rechercher + % mais ça n'a pas fonctionné.
C'est normal d'après vous ?

En tout cas je suis déjà très content du résultat :)
0
Bien vu pour la correction. Effectivement, je fais rarement des tests complets avant de poster une réponse parce qu'il faudrait à chaque fois créer un formulaire et une table avec les champs particuliers de chaque cas.
Pour que le début de mot + % marche, je pense qu'il suffit de remplacer le = par LIKE dans la clause WHERE.
0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
9 févr. 2009 à 14:12
La mention LIKE fonctionne en effet !
Bravo et Merci surtout ....

J'ai, par ailleurs, un autre besoin.

Pensez-vous que je puisse profiter de ce post puisqu'il s'agit, ici, encore d'une requête SQL ou est-il préférable que je fasse un nouveau Topic ?
0
Un nouveau topic, sans aucun doute
0
Boueep Messages postés 41 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 3
10 févr. 2009 à 10:23
go alors :)

Merci encore pour votre aide !

Boueep
0