[C++] Problem z MySQL

0

Witam,

Mam problem z C++, a dokładnie biblioteką MySQL, podczas wykonywania zapytania wyskakuje błąd: Segmentation Fault.

Może pokażę kod:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <mysql/mysql.h>

using namespace std;

int main(void) {
    MYSQL *mysql;
    MYSQL_RES *result;
    MYSQL_ROW row;
    if(mysql_init(mysql) == NULL) {
        cout << "Nieudana inicjalizacja obiektu MySQL" << endl;
        return 0;
    }

    if(!mysql_real_connect(mysql, "localhost", "root", "pass", "db", 0, NULL, 0)) {
        cout << "Błąd NR: " << mysql_errno(mysql) << " O Treści: " << mysql_error(mysql) << endl;
        return 0;
    }

    const char *sql_query = "SELECT `id`, `name`, `value` FROM `configs`";

    if(mysql_query(mysql, sql_query)) {
        cout << "Błąd NR: " << mysql_errno(mysql) << " O Treści: " << mysql_error(mysql) << endl;
    } else {
        result = mysql_store_result(mysql);
        while((row = mysql_fetch_row(result)) != NULL) {
            cout << "ID: " << row[0] << " Name: " << row[1] << " Value: " << row[2] << endl;
        }
        mysql_free_result(result);
    }
    mysql_close(mysql);

    return 0;

}

Program dobrze kompiluję, kompilacja przebiega pomyślnie, kompiluje z opcją -Wall

Nie wiem gdzie tutaj leży problem, ponieważ próbowałem kilku metod z różnych źródeł tj książki, internet.
Tabela configs zawiera kilka rekordów, sprawa jest dość dziwna, jeżeli pobieram dane z tabeli gdzie jest jeden rekord to program poprawnie je wyciąga i wyświetla, lecz nawet po tym wyświetleniu dorzuca ten błąd, gdy zaś chodzi o tabele, gdzie znajduje się kilka rekordów, już nie wyświetla ani jednego, lecz od razu wyrzuca błąd.

Z góry dziękuję za pomoc!

Pozdrawiam

0

Z tego co wiem błąd Segmentation Fault nie dotyczy błędu związanego z kodem lub zapytaniem, tylko wiąże się z niepoprawną konfiguracją pliku my.cnf .

Zrób reintall MySQL-a i sprawdź działanie kodu. Tylko nie zapomnij sobie bazy wyeksportować na wszeli wypadek.

Pozdrawiam.

0

Z tego co wiem błąd Segmentation Fault nie dotyczy błędu związanego z kodem lub zapytaniem, tylko wiąże się z niepoprawną konfiguracją pliku my.cnf .

Jeśli niepoprawne dane w pliku mogą powodować segmentation fault, to ja bym takiego szajsu więcej nie używał.
Ale żeby nie krzyczeć hop, że to wina MySQLa, weź skompiluj sobie ten program z opcją -g (debug info) wrzuć do gdb i podejrzyj stacktrace - gdzie to się wywala. Jeśli się wywala w którejś z funkcji mysql_*, to znaczy że MySQL daje ciała, a jak gdzieś indziej (np. przy próbie wyswietlenia czegoś co jest 0) , to Twój program. Pewien jesteś, że row[n] zawsze zwraca konkretną wartość, nie 0? :>

0

Nie no panowie, wy tu o zapytaniach, konfiguracji, albo i o tym, że MySQL to g**no, a program... nawet biblioteki nie inicjalizuje po ludzku:

MYSQL *mysql;
if(mysql_init(mysql) == NULL)

co to ma być? mysql_init ma dostać adres istniejącego obiektu, albo NULL, jeśli ma sobie sam zarezerwować pamięć. A ty mu co dajesz - wiszący wskaźnik. Zrób to jak człowiek... albo żebyś nie musiał wszędzie & dopisywać, bo ci się pomerda, to chociaż tak:

MYSQL mysql_object, *mysql = &mysql_object;

if( NULL == mysql_init(mysql) )

albo tak:

MYSQL *mysql = mysql_init(NULL);

if( NULL == mysql )
0

Dziękuję pięknie Ranides, działa.

0 użytkowników online, w tym zalogowanych: 0, gości: 0