在c ++中用sqlite验证用户的有效密码

时间:2016-11-03 15:41:27

标签: c++ sqlite

我是sqlite的新手,请帮我输出用户名和密码作为参数传递,我已经将密码存储在表名中的相应用户名为CREDENTIALS。如何检查密码是否有效? 感谢

        bool authenticateUser(string USER, string PASS)
        {
            sqlite3_stmt *pSelectStatement = NULL;
            int iResult = SQLITE_ERROR;
            bool ret = true;
            insertQuery<<"SELECT * FROM CREDENTIALS WHERE USERID LIKE '"<<USER<<"' AND PASSWORD LIKE '"<<PASS<<"';";
            iResult = sqlite3_prepare16_v2(db, insertQuery.str().c_str(), -1, &pSelectStatement, 0);
            if ((iResult == SQLITE_OK) && (pSelectStatement != NULL))
            {
                iResult = sqlite3_step(pSelectStatement);
                //was found?
                if (iResult == SQLITE_DONE) {
                    ret = false;
                    sqlite3_clear_bindings(pSelectStatement);
                    sqlite3_reset(pSelectStatement);
                 }
                iResult = sqlite3_finalize(pSelectStatement);
             }
             return ret;
         }

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的要求,您所要做的就是在凭证表上触发select count查询,然后评估结果。如果计数为0,则密码或用户ID错误。如果它大于0(理想情况下等于1),则凭证有效。

查看以下内容是否有效:

insertQuery<<"SELECT COUNT(1) FROM CREDENTIALS WHERE USERID LIKE '"<<USER<<"' AND PASSWORD LIKE '"<<PASS<<"';";

然后按照您的要求调用sqlite3_prepare16_v2sqlite3_step。然后调用sqlite3_column_int获取值。然后,对sqlite3_step的下一次调用将返回SQLITE_DONE

答案 1 :(得分:0)

我刚刚发现了函数中的问题:

    iResult=sqlite3_prepare16_v2(db, insertQuery.str().c_str(), -1, &pSelectStatement, 0);

我刚将其改为:

    iResult = sqlite3_prepare_v2(db, insertQuery.str().c_str(), -1, &pSelectStatement, 0);

现在问题解决了。 感谢