Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] chercher dans une base de donnée

    15 juillet 2019 à 13:20:11

    Salut tout le monde , désoler pour le dérangement 

    je suis en train de faire un petite application mobile ... 

    en utilisant qt creator et mysql 

    j'ai essayer de faire une petite fonction qui teste par exemple le nom qui j'ai tapis est le même dans la base de données .. 

    ( comme connexion de Facebook ... il faut taper adresse email et mot de passe et si email et nom est juste  une nouvelle page ouvert ( page accueil du Facebook ) et si non tu dois répéter adresse email et mot de passe ...  ) 

    mon problème .. j'ai fait une fonction mais elle ne marche pas j'ai chercher sur internet et j'ai plusieurs des tutos .. mais rien il ne marche pas ... 

    la plupart j'ai trouer fonction recherche a partir d'un entier .( int ) .. moi je veux faire a partir une chaîne de caractère ... voila mon code  

    vous pouvez m'aider et merci d'avance

    bool admin::chercher(QString n)
     {
         QSqlQuery *query = new QSqlQuery;
        query->prepare("select * from ADMIN where nom='"+n+"'");
        if (query->exec())
        {
            return(1);
        }
        return(0);
     }

    -
    Edité par Benzouye 15 juillet 2019 à 13:27:56

    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2019 à 13:27:41

      Bonjour,

      Mauvais forum

      Le sujet est déplacé de la section Base de données vers la section Langage C++

      Je ne sais pas ce que tu crois faire avec cette fonction, mais la requête en question s’exécutera toujours, donc la fonction retournera toujours 1 ...

      Ensuite regarde ce qu'est une requête préparée, car là bonjour les injections SQL ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        15 juillet 2019 à 13:36:00

        salut oui tu as raison j'ai tromper du forum.. merciii 

        je veux faire si le client il tape le nom et il clique sur le bouton connecter .. ( je teste le nom est juste ou non  il appartient dans la base de données ) 

        si elle n'appartient pas un message erreur affiche sinon un message correct affiche ... 

        ouii elle renvie toujours 1 .. même si j'ai taper un nom qui n'appartient pas dans la base ..  

        je veux savoir ou es exactement le problème ? pourquoi il renvoie 1 même si le nom est faux ??

        void MainWindow::on_pushButton_clicked()
        {
             QString no= ui->lineEdit->text();
             QString m= ui->lineEdit_2->text();
              admin a;
        
             int x;
                  x=a.chercher(no);
        if (x==1)
                  {
                          QMessageBox::critical(nullptr, QObject::tr("database is open"),
                                      QObject::tr("connection successful.\n"
                                                  "Click Cancel to exit."), QMessageBox::Cancel);
                  }
                          else
                  {
                          QMessageBox::critical(nullptr, QObject::tr("erreur"),
                                      QObject::tr("connection is not  successful.\n"
                                                  "Click Cancel to exit."), QMessageBox::Cancel);
        
        }
        }
        



        -
        Edité par eya_ar 15 juillet 2019 à 13:37:37

        • Partager sur Facebook
        • Partager sur Twitter
          15 juillet 2019 à 14:03:40

          Salut,

          Ta requête SQL est trouée par l'injection SQL. Utilise les fonctions bindValue de QSqlQuery avant de continuer.

          Pour ton problème, « ça ne marche pas » n'est pas une description. Il faut des vrais détails :

          • Que se passe-t-il ?
          • Il y a une erreur ?
          • Ça plante ?
          • etc.

          La classe QSqlQuery possède une fonction lastError qui permet de récupérer des informations supplémentaire si la requête n'a pas fonctionné.

          Autre question, pourquoi tu alloues un QSqlQuery sur le tas ?

          -
          Edité par markand 15 juillet 2019 à 14:06:09

          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            15 juillet 2019 à 14:06:27

            je pense .j'ai pas besoins pour bindValue ..c'est pour affecter une valeur ... 

            marche pas ça veut dire il se passe rienn il affiche le message ( le message qui trouve dans le code quand la fonction retourne 1 )  et il y pas aucune erreur  

            moi j'ai fait quand il teste la fonction et il trouve le nom est juste il affiche un message correct sinon un message incorrect dans mon cas il affiche toujours un message correct 

            -
            Edité par eya_ar 15 juillet 2019 à 14:10:00

            • Partager sur Facebook
            • Partager sur Twitter
              15 juillet 2019 à 14:12:41

              Utilise plutôt le mot clé LIKE que =

              QString quoteString(QString const &s)
              {
                  QString result{"'"};
                  for (auto c : s){
                     if (c == '\'') {
                        result += "''";
                     }
                  }
                  result += "'";
                  return result;
              }
              
              QString likeString(QString const & s)
              {
                  QString result{"%"};
                  result += s;
                  result += "%";
                  return result;
              }
              
              bool admin::chercher(QString const & n)
               {
                  QSqlQuery query;
                  query.prepare(QString{"SELECT nom FROM ADMIN WHERE nom LIKE %1}.arg(quoteString(likeString(n)));  
                  if (query.exec()){
                      while(query.next()){
                         auto chk = query.toString(0);
                         if(chk == n) return true;
                      } 
                  }
                  return false;
               }

              Donne tous les champs de ta requête (n'utilise pas *),  lorsque tu utilises * l'ordre des champs n'est pas garanti, du coup ça peut poser de gros problèmes, si tu as spécifié les noms des champs, il apparaîtront dans l'ordre où tu les as mis, c'est carré, pas de mauvaises surprises. Sur les comparaisons de chaines utilise plutôt like '%s%' ou s est la chaîne que tu cherches, like va rechercher la chaîne dans le champ donné et te renvoyer toutes les lignes qui matchent. 

              -
              Edité par int21h 15 juillet 2019 à 15:35:49

              • Partager sur Facebook
              • Partager sur Twitter
              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                15 juillet 2019 à 14:26:37

                merci mais j'ai essayer il ne marche pas .il affiche plusieurs d'erreurs .. je vais les voir .. mais je veux plutôt m'expliquer encore pourquoi  tu as fait comme ça ?  j'ai pas bien compris si vous ne dérange pas et merci d"avance.

                • Partager sur Facebook
                • Partager sur Twitter
                  15 juillet 2019 à 15:23:00

                  J'ai fait ça de tête, il n'est pas impossible qu'il y traîne un bug ou deux, en le relisant, je me suis appercu que j'avais oublié le else dans la fonction quoteString...

                  Il y a plusieurs problèmes avec la comparaison de chaînes en SQL, tu as la casse, Toto c'est pas pareil que toto, par exemple, tu vas aussi avoir les accents, éventuellement le paramétrage du SGBD qui peuvent faire qu'une sélection sur une égalité stricte (en utilisant = ) ne marchera pas alors qu'une sélection utilisant LIKE marchera très bien.

                  Dans mon code, je sais que la requête peut potentiellement me retourner plusieurs lignes, par exemple si l'identifiant entré par l'utilisateur est toto, le SGBD va me retourner touts les enregistrements dont le champ nom contient un truc qui ressemble à toto, par exemple Toto, TOTO, ToTo, aToto, 32toto, toto12... Il faut donc parcourir le résultat et comparer chaque ligne avec ce que l'utilisateur a entré, pour être sûr d'avoir un résultat valide.

                  -
                  Edité par int21h 15 juillet 2019 à 15:30:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                  [Qt] chercher dans une base de donnée

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown