IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Probleme de requete SQL [WD24]


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Novice
    Inscrit en
    Février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Février 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Probleme de requete SQL
    Bonjour à tous,

    Je suis novice dans Windev mais connait excellemment bien le PHP et MYSQLi, je galère toute fois dans windev pour faire une chose qui pourtant parais si simple, explication :

    J'ai une Table "COMPTE" avec colonne "username"

    Dans windev je remplis un SAI puis clic BUTTOM qui exécute ceci afin de vérifié en gros si le pseudo est déjà pris ou non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	pseudoverif est une chaîne
    	ResSQL est un chaîne
    	ResSQL = SQLExec(" SELECT username FROM compte WHERE username = '+SAI_pseudo+' ", "REQ1")
    	SI ResSQL = 1 ALORS
    		pseudoverif = SQLCol("REQ1", 1)
    		Info(pseudoverif+" : VRAI : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    	SINON
    		pseudoverif = SQLCol("REQ1", 1)
    		Erreur(pseudoverif+" : Faux : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    	FIN
    	SQLFerme("REQ1")
    Seulement peux importe ce que je note dans le SAI_pseudo sa me retourne toujours VRAI même si je rentre un pseudo qui ne se trouve pas dans la TABLE :/

    Je pense a une erreur bête mais je ne la trouve pas, sa fait 48h environ que je galère avec la doc PCSoft sans trouvé le pourquoi du comment.

    Merci d'avance de votre aide.

  2. #2
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    Mars 2018
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mars 2018
    Messages : 153
    Points : 295
    Points
    295
    Billets dans le blog
    1
    Par défaut
    Eh bien, c'est normal puisque SQLExec renvoi un booléen et sera toujours égal à 1 si la requête a été exécutée avec succès, qu'elle matche ou pas avec un résultat.

  3. #3
    Candidat au Club
    Homme Profil pro
    Novice
    Inscrit en
    Février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Février 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par padbrain Voir le message
    Eh bien, c'est normal puisque SQLExec renvoi un booléen et sera toujours égal à 1 si la requête a été exécutée avec succès, qu'elle matche ou pas avec un résultat.
    Ok du coup je comprend mieux effectivement, mais par qu'elle requete puis je passé pour sortir un résultat ? Car j'avoue que j'ai tenté le Col mais sans succès non plus.

    Merci de ton aide.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Citation Envoyé par karioRoss Voir le message
    Bonjour à tous,

    Je suis novice dans Windev mais connait excellemment bien le PHP et MYSQLi, je galère toute fois dans windev pour faire une chose qui pourtant parais si simple, explication :

    J'ai une Table "COMPTE" avec colonne "username"

    Dans windev je remplis un SAI puis clic BUTTOM qui exécute ceci afin de vérifié en gros si le pseudo est déjà pris ou non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	pseudoverif est une chaîne
    	ResSQL est un chaîne
    	ResSQL = SQLExec(" SELECT username FROM compte WHERE username = '+SAI_pseudo+' ", "REQ1")
    	SI ResSQL = 1 ALORS
    		pseudoverif = SQLCol("REQ1", 1)
    		Info(pseudoverif+" : VRAI : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    	SINON
    		pseudoverif = SQLCol("REQ1", 1)
    		Erreur(pseudoverif+" : Faux : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    	FIN
    	SQLFerme("REQ1")
    Seulement peux importe ce que je note dans le SAI_pseudo sa me retourne toujours VRAI même si je rentre un pseudo qui ne se trouve pas dans la TABLE :/

    Je pense a une erreur bête mais je ne la trouve pas, sa fait 48h environ que je galère avec la doc PCSoft sans trouvé le pourquoi du comment.

    Merci d'avance de votre aide.
    Il te manque un SQLPremier() pour que ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ResSQL = SQLExec(" SELECT username FROM compte WHERE username = '+SAI_pseudo+' ", "REQ1")
    SI ResSQL = 1 ALORS
    	SQLPremier("REQ1")
    	SI PAS SQL.Endehors
    		pseudoverif = SQLCol("REQ1", 1)
    		Info(pseudoverif+" : VRAI : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    	FIN
    SINON
    	SQLInfoGene("REQ1")
    	Erreur(pseudoverif+" : Faux : ResSQL:"+ResSQL+", Erreur:"+SQL.Erreur+RC+SQL.MesErreur)
    FIN
    SQLFerme("REQ1")
    [/CODE]
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  5. #5
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 374
    Points : 9 707
    Points
    9 707
    Par défaut
    Bonjour,

    A tout hasard, en plus de ce qui est dit, ta requête n'est pas bien écrite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResSQL = SQLExec(" SELECT username FROM compte WHERE username = '+SAI_pseudo+' ", "REQ1")
    SAI_pseudo sera passé tel quel et non remplacé par la valeur de SAI_pseudo.

    Je pense que l'utilisation de ChaineConstruit serait plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResSQL = SQLExec(ChaineConstruit(" SELECT username FROM compte WHERE username = '%1'", SAI_pseudo), "REQ1")
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Pour préciser, parce que Padbrain a été expéditif, en gros, le booléen renvoyé pas SqlExec te dit que ta requête est syntaxiquement correcte.
    Rien de plus.

    Différentes remarques.
    - Je ne sais plus comment j'étais arrivé à cette conclusion, mais je n'utilise jamais SqlExec. J'utilise systématiquement hExecuteRequeteSQL

    - SqlExec , ou hExecuteRequeteSQL exécute la requête, mais il ne récupère pas le résultat de la requête. D'ailleurs, le résultat serait en général plein de lignes, et non une seule ligne.
    Pour récupérer le résultat, après hExecuteRequeteSQL , il faut faire hLitPremier pour récupérer la 1er ligne ... et en général boucler avec hLitSuivant pour récupérer les lignes suivantes.
    Donc dans ton cas, hLitPremier et si hEnDehors() te dit que hLitPremier n'a rien trouvé, c'est que l'utilisateur n'existe pas.

    - Ici, tu cherches s'il y a un utilisateur dont le username est +SAI_pseudo+
    Essaie de mettre SAI___pseudo à la place de SAI_pseudo, et tu vas voir que ton code fonctionne aussi bien (ou aussi mal) ; la gestion des guillemets " et des quote ' est fausse.


    Je préfère ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SReq est une chaine 
    sd est une cource de données
     
    sReq = [
    select count(*) as nb from compte WHERE username = '%1' 
    ]
    sReq = chaineconstruit ( sReq, sai_pseudo)
    info( sReq) // Ca sert juste à voir la requete qui va s'exécuter ... à supprimer en vrai.
     
    si pas hexecuterequetesql( sd, sREQ ) alors 
       erreur ( " err dans la requete ", herreurinfo() )
       retour
    fin
    hlitpremier(sd)
     
    info ( " le nombre de users avec ce nom est " + sd.nb )
    Bien entendu, le nombre affiché devrait être 0 (pas de User avec ce nom) ou 1 (1 seul user avec ce nom ...)
    L'avantage de passer par Count(*), c'est que tu es sur que ta requete va renvoyer 1 et 1 seule ligne ... tu t'évites le test sur hendehors ()
    Mais c'est juste une quesiton de préférences personnelles.

    Ici, je déclares une chaine sReq, j'initialise le texte de la requete ... en concaténant éventuellement plein de trucs , je vérifie si le texte de la requete est bien ce que je voulais. Puis j'exécute cette requete.
    Je fais ça systématiquement, je ne fais jamais sqlExec ( " select ... ..") ; c'est beaucoup trop galère.


    Par ailleurs, tu déclares ResSQL comme une chaine, et tu testes si elle vaut 1... c'est une chaine, ou c'est un entier ?

    Le SQL de PCSoft a des limites, mais cette règle de séparer l'exécution de la requête avec la récupération du résultat est très bonne.

    Venant du monde Php et MySQL, tu auras différentes surprises de ce genre. Mais , sans vouloir médire sur MySQL, MYSQL tolère certaines syntaxes qui sont très dangereuses, et PCSoft est beaucoup plus dans les clous de ce point de vue.

    Edit : comme j'ai mis 10 mn à taper ma réponse, Jon est venu souligner un des points que j'avais relevé.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Candidat au Club
    Homme Profil pro
    Novice
    Inscrit en
    Février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Février 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Alors, j'ai testé avec un SQLLitCol mais il me dit qu'il ne renvoi pas de valeur (me met une erreur la dessus).

    Du coup j'ai testé avec le code de Philouz (que je remercie d'ailleurs) qui ne fonctionné pas non plus mais grace au supplément de Jon Shannow celui ci fonctionne maintenant .

    Merci encore a vous de m'avoir aidé

    Citation Envoyé par tbc92 Voir le message
    Merci pour ce complément d'info, du coup il vaut mieux passer par du SQLExec ou par le wlanguage (si j'ai bien compris c'est sa le Hexecute) ? C'est juste une différence de codage ou ça joue sur d'autre principe ?

  8. #8
    Membre actif

    Homme Profil pro
    Sans
    Inscrit en
    Mars 2018
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mars 2018
    Messages : 153
    Points : 295
    Points
    295
    Billets dans le blog
    1
    Par défaut
    Je ne suis pas sur que SQLExec te prémunisse des injections SQL.

    Les fonctions H sont censées le faire.

    Mais je dis p-e une bêtise.

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    Bonjour;
    qu'en dites-vous de l'utilisation d'un COUNT ?
    Bon Dev

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Ici, a priori, les fichiers que tu lis sont des fichiers HFSQL.
    Mais si tu viens d'un monde MYSQL, tu vas certainement vouloir utiliser Windev avec des bases de données MYSQL.
    Personnellement, j'utilise souvent Windev pour attaquer des bases externes , donc des Tables (MYSQL, POSTGRE , ORACLE ... ) qui ne sont pas déclarés dans mon projet.

    Avec HexecuteRequeteSQL, ça se fait très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cnx1 est une connexion 
    /// Je décris ma connexion pour accéder à telle ou telle base de donnée 
    HexecuterequeteSQL( Cnx1 ... ... ) : j'exécute cette requete , sur une connexion précise.
    La syntaxe de HexecuteRequeteSQL, en précisant la connexion à utiliser , ça permet plein de choses.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    @karioRoss: J'ai répondu à ta question, il aurait juste fallu lire. La différence entre SQLExec est HexecuteRequeteSQL est que le SQLExec te renverra le véritable message d'erreur du SGBD, ce que ne fait pas ou pas bien HexecuteRequeteSQL. J'utilise SQLExec depuis des années et sur plein de bases différentes je n'ai jamais eu de soucis. C'est un peu verbeux je te l'accorde mais bon ça fonctionne.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  12. #12
    Candidat au Club
    Homme Profil pro
    Novice
    Inscrit en
    Février 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Novice

    Informations forums :
    Inscription : Février 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par philouZ Voir le message
    @karioRoss: J'ai répondu à ta question, il aurait juste fallu lire. La différence entre SQLExec est HexecuteRequeteSQL est que le SQLExec te renverra le véritable message d'erreur du SGBD, ce que ne fait pas ou pas bien HexecuteRequeteSQL. J'utilise SQLExec depuis des années et sur plein de bases différentes je n'ai jamais eu de soucis. C'est un peu verbeux je te l'accorde mais bon ça fonctionne.
    J'ai bien lue et je t'ai d’ailleurs remercier quelque commentaire plus haut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de requete SQL avec la valeur NULL
    Par samyghan dans le forum Installation
    Réponses: 8
    Dernier message: 12/03/2006, 17h24
  2. Probleme de requete SQL
    Par arcane dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 04/10/2005, 11h59
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. Probleme Session/requete SQL
    Par kolib dans le forum ASP
    Réponses: 4
    Dernier message: 14/06/2005, 16h23
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo