自定义MySQL函数类

时间:2012-03-17 01:47:45

标签: c++ mysql shared-libraries

我开始研究一个类,包括许多函数重组我的项目(游戏服务器)需要的常见mysql任务。

现在,我正在学习如何在C ++中使用mysql

在尝试将此类构建为共享库(在linux下)时,我有一个错误,这里是..

error: ‘connect’ was not declared in this scope

所以..它发生在函数checklogin()当然我有点理解它意味着什么,问题是这个connect是在我做的另一个函数connectdb()中声明的同一个图书馆。我试图重复指针的事情,但是当我进入checklogin函数时,它导致我遇到一个段错误(seg错误来自mysql库,来自调试器所说的)所以我认为它可能不会是正确的方式(或者是吗?)

无论如何,我想知道这个问题的可能解决方案是什么,再次指向connect?或管理该指针被另一个函数检测到 这里是代码...(顺便说一下,函数代码已经从本教程中复制/粘贴了http://www.nitecon.com/tutorials-articles/develop/cpp/c-mysql-beginner-tutorial/

sssql.cpp

    #include "sssql.h"

sssql::sssql()
{
    //ctor
}

sssql::~sssql()
{
    //dtor
}


bool sssql::checklogin(std::string, std::string)
{
    MYSQL *connect;
    MYSQL_RES *res_set;
    MYSQL_ROW row;
    mysql_query(connect,"SELECT * FROM account");

    unsigned int i = 0;

    res_set = mysql_store_result(connect);

    unsigned int numrows = mysql_num_rows(res_set);

    while ((row = mysql_fetch_row(res_set)) != NULL)
        {
        printf("%s\n",row[i] != NULL ?
        row[i] : "NULL");
        }

}

bool sssql::connectdb()
{
     MYSQL *connect;
    connect=mysql_init(NULL);
    if(!connect)
    {
        printf("MySQL Initialization Failed");
        return 1;
    }

    connect=mysql_real_connect(connect,SERVER,USER,PASSWORD,DATABASE,0,NULL,0);

    if(connect){
        printf("Connection Succeeded\n");
    }
    else{
        printf("Connection Failed!\n");
    }
}

sssql.h

#ifndef SSSQL_H
#define SSSQL_H
#include "mysql.h"
#define SERVER "localhost"
#define USER "root"
#define PASSWORD "password"
#define DATABASE "database"
#include <stdio.h>
#include <string>
class sssql
{
    public:
        sssql();
        virtual ~sssql();

        // Check login info
        std::string usrcheck;
        std::string passwd;
        bool connectdb();
        bool checklogin(std::string, std::string);
    protected:
    private:
};

#endif // SSSQL_H

1 个答案:

答案 0 :(得分:0)

connect的问题是您在connectdb函数中创建了它,它是一个局部变量,因此connectdb返回connect后会被销毁。当您在checklogin()中重新声明它时,您基本上只创建一个单独的变量,只知道可以存储在其中的内容,然后您尝试使用它来与无法正常工作的MySQL进行通信。

您应该做的是将connect声明为私人类成员:

class sssql
{
private:
    MySQL *connect;

....
};

将使其成为该类中声明的所有函数的范围。如果您愿意,可以在构造期间或在connectdb()之类的单独函数中实例化它。但在继续之前,我强烈建议您阅读variable scope上的the same site和其他教程。

P.S。还有一个建议是不要将变量命名为connect,因为在同一名称下有几个库的函数。