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);
}
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);
}
}
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
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.
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.
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.
× 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.
git is great because Linus did it, mercurial is better because he didn't.