Insertion de duplication de données SQL

J'essaie d'éviter les insertions de noms d'utilisateur, mots de passe, numéros de téléphone et adresses e-mail en double.

Fonction ajoutée au fichier principal

if(data.open()){
        QString username,password,email,phone;
        username = ui->line_Edit_username_Registery->text();
        password = ui->line_Edit_password_Registery->text();
        email = ui->line_edit_email->text();
        phone = ui->line_edit_phone->text();

        //Query Check
        QSqlQuery queryCheck;
        queryCheck.prepare(QString("SELECT * FROM register where username = :username AND        password = :password AND email = :email AND phone = :phone"));
        queryCheck.bindValue(":username", username);
        queryCheck.bindValue(":password", password);
        queryCheck.bindValue(":email",email);
        queryCheck.bindValue(":phone",phone);


        bool check = true;
        if ( queryCheck.exec())
        {

            while (queryCheck.next()) {
                QString usernameDB,passwordDB,emailDB,phoneDB;
                username_database = queryCheck.value(1).toString();
                password_database = queryCheck.value(2).toString();
                email_database = queryCheck.value(3).toString();
                phone_database = queryCheck.value(4).toString();
                if(username == username_database || phone == phone_database || email == email_database){
                    QMessageBox::information(this,"Error!","Duplicated!");
                    check = false;

                }

            }
        }// End Query Check

Mon problème est d'éviter l'ajout de doublons lors de l'insertion de données. J'ai écrit cette condition:

if(username == username_database || phone == phone_database || email == email_database)

Ainsi, lorsque j'insère un nom d'utilisateur, un mot de passe, un numéro de téléphone et une adresse e-mail en double, la base de données m'envoie un message et me dit "Dupliqué!". Mais, lorsque je lui donne un autre mot de passe, il l'insère dans la base de données. La condition est de vérifier le nom d'utilisateur, le numéro de téléphone et l'adresse e-mail.

Code complet

void mainwindow::on_pushButton_register_clicked()
{

    if(data.open()){
        QString username,password,email,phone;
        username = ui->line_Edit_username_Registery->text();
        password = ui->line_Edit_password_Registery->text();
        email = ui->line_edit_email->text();
        phone = ui->line_edit_phone->text();

        //Query Check
        QSqlQuery queryCheck;
        queryCheck.prepare(QString("SELECT * FROM register where username = :username AND        password = :password AND email = :email AND phone = :phone"));
        queryCheck.bindValue(":username", username);
        queryCheck.bindValue(":password", password);
        queryCheck.bindValue(":email",email);
        queryCheck.bindValue(":phone",phone);


        bool check = true;
        if ( queryCheck.exec())
        {

            while (queryCheck.next()) {
                QString usernameDB,passwordDB,emailDB,phoneDB;
                username_database = queryCheck.value(1).toString();
                password_database = queryCheck.value(2).toString();
                email_database = queryCheck.value(3).toString();
                phone_database = queryCheck.value(4).toString();
                if(username == username_database || phone == phone_database || email == email_database){
                    QMessageBox::information(this,"Error!","Duplicated!");
                    check = false;

                }

            }
        }// End Query Check


        // query insert
        if(check){
            QSqlQuery query;
            query.prepare("INSERT INTO register (username, password , email , phone) "
                          "VALUES (:username, :password, :email , :phone)");
            query.bindValue(":username", username);
            query.bindValue(":password", password);
            query.bindValue(":email", email);
            query.bindValue(":phone", phone);


                bool chkbox = ui->checkBox->isChecked();
                //Checking checkbox condition
                if (chkbox){
                    if(query.exec())
                        QMessageBox::information(this,"this","yes");
                    else
                        QMessageBox::information(this,"this","no");
                }
                else {
                    QMessageBox::information(this,"title","Please accept the rules");
                }//Checking checkbox condition
        }
    }
    else{
        QMessageBox::information(this,"this","database didn't connect");
    }
}
-2
siamak alipour 22 sept. 2020 à 15:16

2 réponses

Meilleure réponse

Je trouve la solution. le problème était de sélectionner la table de la base de données et je remplace ET par OU puis il les vérifie un par un.

0
siamak alipour 24 sept. 2020 à 07:23

Considérez checkDataBaseRegister:
Vous exécutez une requête pour vérifier si un utilisateur existe ou non, au cas où cet utilisateur existe, vous récupérerez un enregistrement, mais s'il n'existe pas, vous ne récupérerez aucun enregistrement, et donc {{X1} } ne sera jamais true, et votre compilateur vous avertit probablement que cela pourrait arriver à atteindre la fin de cette fonction, sans aucun retour, donc je vous suggère d'ajouter un peu de return après {{X4} } et if:

bool MainWindow::checkDataBaseRegister(QString username , QString password , QString email , QString phone){

    QSqlDatabase data = QSqlDatabase::addDatabase("QSQLITE");
    data.setDatabaseName("qt5.sqlite");
    data.open();
    QSqlQuery query;
    query.prepare(QString("SELECT * FROM register where username = :username AND password = :password AND email = :email AND phone = :phone"));
    query.bindValue(":username", username);
    query.bindValue(":password", password);
    query.bindValue(":email",email);
    query.bindValue(":phone",phone);
    if(query.exec())
    {
        while(query.next()){
            QString usernameDB,passwordDB,emailDB,phoneDB;
            usernameDB = query.value(1).toString();
            passwordDB = query.value(2).toString();
            emailDB = query.value(3).toString();
            phoneDB = query.value(4).toString();
            if(username==usernameDB || email == emailDB || phone == phoneDB){
                return false;
            }
            else{
                return true;
            }
        }
        return true;
        // ^^^^^^^^^-- because no records are been returned
    }
    return false;
    // ^^^^^^^^^-- errors on the connection

}

Considérez également que

    while(query.next()){
        QString usernameDB,passwordDB,emailDB,phoneDB;
        usernameDB = query.value(1).toString();
        passwordDB = query.value(2).toString();
        emailDB = query.value(3).toString();
        phoneDB = query.value(4).toString();
        if(username==usernameDB || email == emailDB || phone == phoneDB){
            return false;
        }
        else{
            return true;
        }
    }

Peut être remplacé par un simple

return query.size() > 0
0
Berto99 22 sept. 2020 à 12:24