2013-05-05 4 views
0

Я пытаюсь выполнить запрос MySQL в C, однако я получаю ошибку сегментации при вызове mysql_num_rows().C mysql_num_rows() Ошибка сегментации

Вот код, я использую:

char *username = "[email protected]"; 
char *password = "pass"; 

char query[1000]; 
int len; 
char *q = "SELECT * FROM Users WHERE `Email` = '%s' AND `Password` = '%s'"; 
len = snprintf(query, strlen(q) + strlen(username) + strlen(password), q, username, password); 
MYSQL_RES *result; 
if (db_query(query, result)) 
{ 
if (result != NULL) 
{ 
    int test_count = mysql_num_rows(result); 
    printf("%d\n", test_count); 
} 
} 
else 
{ 
printf("Query error\n"); 
} 

А вот функция db_query():

bool db_query(const char *query, MYSQL_RES *result) 
{ 
    if (mysql_query(db_connection, query)) 
    { 
    printf("mysql_query(): Error %u: %s\n", mysql_errno(db_connection), mysql_error(db_connection)); 

    return false; 
    } 

    if (!(result = mysql_store_result(db_connection))) 
    { 
    printf("mysql_store_result(): Error %u: %s\n", mysql_errno(db_connection), mysql_error(db_connection)); 

    return false; 
    } 

    return true; 
} 

Я проверил запрос и проблема не там, соединение также инициировано. Есть идеи?

Спасибо!

ответ

3

Ваша проблема здесь, в db_query функции:

if (!(result = mysql_store_result(db_connection))) 

Присваивание result имеет никакого видимого эффекта в вызывающий функцию, - вы не передаете указатель на значение, изменяя значение result в вызываемый не делает ничего, чтобы result в вызывающем.

Вам нужно изменить свою функцию, чтобы перенести указатель на указатель, а также настроить сайт вызова и функцию db_query.

bool db_query(const char *query, MYSQL_RES **result) 
{ 
    ... 
    if (!(*result = mysql_store_result(db_connection))) 
    ... 
} 
+0

Это сделало, спасибо! Кажется, я всегда испортил указатели. Ура! – user1667175

2

Любые изменения result в вашей db_query функции, не отражается обратно к абоненту, следовательно, он все равно будет содержать произвольное значение, которое он имел, когда он был создан (как автоматической переменной, без инициализации.

Если вы хотите изменить значение и есть это отражается обратно, вы должны пройти двойной указатель на него затем разыменовать двойной указатель, чтобы получить по фактической стоимости.

Еще лучше будет возвращать значение result и использовать его статус NULL/non-NULL для кода успеха, а не возврат true/false.

+0

Да, это была проблема, спасибо! :) – user1667175

Смежные вопросы