第二次调用时出现分段错误 mysql_fetch_row
Segmentation Fault on second time calling mysql_fetch_row
我正在编写一些嵌入到 C++ 中的 MYSQL,但我遇到了一些我无法查明原因的行为。
我有一个主要功能和两个可以按作者或出版商搜索的功能。如果我按作者搜索,我会在第一时间得到正确的结果。如果我按出版商搜索,我第一次不会得到任何结果。但是,无论我做什么,第二次调用其中一个函数时,我在 while 循环中的行 "mysql_fetch_row" 处遇到了分段错误。我假设我正在打开某种与第二次调用冲突的连接,但我无法弄清楚。
抱歉代码墙,但我不确定问题出在程序的哪个位置。我试图描述每个部分,并指出程序在两个函数中的每一个中崩溃的地方。
主函数,连接数据库,调用另外两个函数
#include <mysql.h>
#include <iostream>
#include <string>
using namespace std;
void searchByAuthor(MYSQL *connect);
void searchByPublisher(MYSQL *connect);
int main()
{
int choice = 0;
MYSQL *connect, mysql;
connect = mysql_init(&mysql);
//connect to the database
connect = mysql_real_connect(connect, SERVER, USER, PASSWORD, DATABASENAME, 0,
NULL, 0);
//Get user input here to select what to search by
//Loops until user quits the program
return 0;
}
按作者搜索 - 获取用户输入并进行 SQL 调用。 Returns 第一次结果正确。
void searchByAuthor(MYSQL *connect)
{
string name;
string sql = "select Title, Price, Type, AuthorFirst, AuthorLast from Book, Author, Wrote where Author.AuthorNum=Wrote.AuthorNum and Wrote.BookCode = Book.BookCode and AuthorLast=\'" + name + "\'";
MYSQL_RES *res_set;
MYSQL_ROW row;
cout << "Enter the last name of the author" << endl;
cin >> name;
mysql_query(connect, (sql).c_str());
res_set = mysql_store_result(connect);
//Crashes here on second call
while ((row = mysql_fetch_row(res_set)) != NULL)
{
cout << endl << row[0] << " "
<< row[1] << " " << row[2] << " "
<< row[3] << " " << row[4] << endl;
}
mysql_free_result(res_set);
mysql_close(connect);
}
按发布者搜索 - 获取用户输入并进行 SQL 调用 - 永远不会 return 任何结果。
void searchByPublisher(MYSQL *connect)
{
string publisher;
string sql = "select Book.Title from Book, Publisher where Publisher.PublisherName =\'" + publisher + "\' and Publisher.PublisherCode = Book.PublisherCode";
MYSQL_RES *res_set;
MYSQL_ROW row = NULL;
cout << "Enter the name of the publisher" << endl;
cin >> publisher;
mysql_query(connect, sql.c_str());
res_set = mysql_store_result(connect);
//Crashes here on second call
while ((row = mysql_fetch_row(res_set)) != NULL)
{
cout << endl << row[0] << endl;
}
mysql_free_result(res_set);
mysql_close(connect);
}
您使用 mysql_close(connect)
关闭了连接,但不确定在再次查询之前是否重新打开连接?检查 here 当你关闭它时句柄也关闭了。
同时检查您的 mysql 数据库是否有空值。
你的错误在mysql_init()
。 mysql_init
的参数必须为 NULL 而不是 &mysql
.
一定是这样:
connect = mysql_init(NULL);
我正在编写一些嵌入到 C++ 中的 MYSQL,但我遇到了一些我无法查明原因的行为。
我有一个主要功能和两个可以按作者或出版商搜索的功能。如果我按作者搜索,我会在第一时间得到正确的结果。如果我按出版商搜索,我第一次不会得到任何结果。但是,无论我做什么,第二次调用其中一个函数时,我在 while 循环中的行 "mysql_fetch_row" 处遇到了分段错误。我假设我正在打开某种与第二次调用冲突的连接,但我无法弄清楚。
抱歉代码墙,但我不确定问题出在程序的哪个位置。我试图描述每个部分,并指出程序在两个函数中的每一个中崩溃的地方。
主函数,连接数据库,调用另外两个函数
#include <mysql.h>
#include <iostream>
#include <string>
using namespace std;
void searchByAuthor(MYSQL *connect);
void searchByPublisher(MYSQL *connect);
int main()
{
int choice = 0;
MYSQL *connect, mysql;
connect = mysql_init(&mysql);
//connect to the database
connect = mysql_real_connect(connect, SERVER, USER, PASSWORD, DATABASENAME, 0,
NULL, 0);
//Get user input here to select what to search by
//Loops until user quits the program
return 0;
}
按作者搜索 - 获取用户输入并进行 SQL 调用。 Returns 第一次结果正确。
void searchByAuthor(MYSQL *connect)
{
string name;
string sql = "select Title, Price, Type, AuthorFirst, AuthorLast from Book, Author, Wrote where Author.AuthorNum=Wrote.AuthorNum and Wrote.BookCode = Book.BookCode and AuthorLast=\'" + name + "\'";
MYSQL_RES *res_set;
MYSQL_ROW row;
cout << "Enter the last name of the author" << endl;
cin >> name;
mysql_query(connect, (sql).c_str());
res_set = mysql_store_result(connect);
//Crashes here on second call
while ((row = mysql_fetch_row(res_set)) != NULL)
{
cout << endl << row[0] << " "
<< row[1] << " " << row[2] << " "
<< row[3] << " " << row[4] << endl;
}
mysql_free_result(res_set);
mysql_close(connect);
}
按发布者搜索 - 获取用户输入并进行 SQL 调用 - 永远不会 return 任何结果。
void searchByPublisher(MYSQL *connect)
{
string publisher;
string sql = "select Book.Title from Book, Publisher where Publisher.PublisherName =\'" + publisher + "\' and Publisher.PublisherCode = Book.PublisherCode";
MYSQL_RES *res_set;
MYSQL_ROW row = NULL;
cout << "Enter the name of the publisher" << endl;
cin >> publisher;
mysql_query(connect, sql.c_str());
res_set = mysql_store_result(connect);
//Crashes here on second call
while ((row = mysql_fetch_row(res_set)) != NULL)
{
cout << endl << row[0] << endl;
}
mysql_free_result(res_set);
mysql_close(connect);
}
您使用 mysql_close(connect)
关闭了连接,但不确定在再次查询之前是否重新打开连接?检查 here 当你关闭它时句柄也关闭了。
同时检查您的 mysql 数据库是否有空值。
你的错误在mysql_init()
。 mysql_init
的参数必须为 NULL 而不是 &mysql
.
一定是这样:
connect = mysql_init(NULL);