Forum » Programiranje » [c++] osnovna težava z mysql api
[c++] osnovna težava z mysql api
arjan_t ::
Sem bolj svež v c++ in mi ne uspe prevest tele kode (linux):
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main(){
MYSQL * conn;
if( mysql_real_connect(conn, "localhost", "root", "", "test", 0, NULL, 0) ){
cout << mysql_error(conn);
return 0;
}
mysql_close(conn);
return 0;
}
Dobim te napake:
./src/mysql.o: In function `main':
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:12: undefined reference to `mysql_init'
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:14: undefined reference to `mysql_real_connect'
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:20: undefined reference to `mysql_close'
Kaj delam narobe :S
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main(){
MYSQL * conn;
if( mysql_real_connect(conn, "localhost", "root", "", "test", 0, NULL, 0) ){
cout << mysql_error(conn);
return 0;
}
mysql_close(conn);
return 0;
}
Dobim te napake:
./src/mysql.o: In function `main':
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:12: undefined reference to `mysql_init'
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:14: undefined reference to `mysql_real_connect'
/home/arjantop/programming/eclipse_test/Debug/../src/mysql.cpp:20: undefined reference to `mysql_close'
Kaj delam narobe :S
- spremenilo: snow ()
snow ::
Si poleg tvoje kode prevedel/linkal tudi mysql api?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
arjan_t ::
Sem seldil tem navodilom:
http://dev.mysql.com/doc/refman/5.0/en/...
Sedaj program lepo prevede a ko ga zaženem dobim: Segmentation fault (core dumped)
http://dev.mysql.com/doc/refman/5.0/en/...
Sedaj program lepo prevede a ko ga zaženem dobim: Segmentation fault (core dumped)
mspiller ::
Problem je, ker nisi klical mysql_init pred mysql_real_connect.
P.S. Kar bi te opozoril je to, da je Mysql pod GPL licenco, kar pomeni, da mora biti tvoja aplikacija prav tako. Ce tega ne zelis, lahko kupis mysql licenco (predno zacnes razvijati), ali pa vzames kaksno alternativo (postgres).
P.S. Kar bi te opozoril je to, da je Mysql pod GPL licenco, kar pomeni, da mora biti tvoja aplikacija prav tako. Ce tega ne zelis, lahko kupis mysql licenco (predno zacnes razvijati), ali pa vzames kaksno alternativo (postgres).
Matej_ ::
mspiller: ...kar pomeni, da mora biti tvoja aplikacija prav tako...
To ne drži povsem, morda bo aplikacijo uporabljal samo za njegove potrebe oziroma potrebe podjetja kjer je zaposlen. Z GPL licenco se bo moral "obremenjevati" le, če bo zadevo želel prodati tudi komu drugemu.
To ne drži povsem, morda bo aplikacijo uporabljal samo za njegove potrebe oziroma potrebe podjetja kjer je zaposlen. Z GPL licenco se bo moral "obremenjevati" le, če bo zadevo želel prodati tudi komu drugemu.
mspiller ::
To ne drži povsem, morda bo aplikacijo uporabljal samo za njegove potrebe oziroma potrebe podjetja kjer je zaposlen. Z GPL licenco se bo moral "obremenjevati" le, če bo zadevo želel prodati tudi komu drugemu.
Res je. Vendar pa mora to vedeti predno zacne razvijati, ker ko gres enkrat na GPL ne mores nazaj. Tudi ce samo za interno uporabo razvijas aplikacijo. Ne gre nekaj v stilu. Bom naredil aplikacijo, ki uporablja GPL knjiznice za interno uporabo, vendar ne bom distribuiral, potem pa ko jo bom kasneje hotel prodajati, bom pa kupil mysql licenco in "spremenil" GPL aplikacijo v drugo licenco. GPL licenca se vedno velja, tudi za interno uporabo, vendar pa je ne "obcutis" v istem smislu, dokler ne distribuiras.
SasoS ::
Dokler je program samo tvoj, lahko licenco spreminjaš po mili volji iz GPL in nazaj :)
Če GPL programa nisi releasal ven, potem ga tudi nikjer ne bo...
Če GPL programa nisi releasal ven, potem ga tudi nikjer ne bo...
arjan_t ::
No da se vrnemo na temo :)
Nobenega programa ne nameravam razvit, samo testiram (se učim) :)
Glede napake:
Tudi če dodam mysql_init() javi isto napako ...
Nobenega programa ne nameravam razvit, samo testiram (se učim) :)
Glede napake:
Tudi če dodam mysql_init() javi isto napako ...
mspiller ::
Skompajli z -g (debuging symbols). Potem pa pozeni z gdb. Ko se ti usuje pa vpisi bt (backtrace) in povej kaj javi. Drugace pa bi moral imeti tam pred mysql_real_connect klicaj.
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
arjan_t ::
Ja ta klicaj sem potem dodal :)
Zdaj sem pri tem:
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main(){
MYSQL conn;
MYSQL_RES result;
MYSQL_ROW row;
mysql_init(&conn);
if (!mysql_real_connect(&conn, "localhost", "root", "", "test", 0, NULL, 0)){
cout << mysql_error(&conn);
return 0;
}
if(!mysql_query(&conn, "SELECT * FROM 'estats_test_normal';")){
cout << "error";
mysql_close(&conn);
return 0;
}
mysql_store_result(&conn);
while ((row = mysql_fetch_row(&result)) != false){
cout << row[0] <<endl;
}
mysql_close(&conn);
return 0;
}
Prevede se vredu ampak ne dobim nobenega izpira (while stavek se ne izvede)
Zdaj sem pri tem:
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main(){
MYSQL conn;
MYSQL_RES result;
MYSQL_ROW row;
mysql_init(&conn);
if (!mysql_real_connect(&conn, "localhost", "root", "", "test", 0, NULL, 0)){
cout << mysql_error(&conn);
return 0;
}
if(!mysql_query(&conn, "SELECT * FROM 'estats_test_normal';")){
cout << "error";
mysql_close(&conn);
return 0;
}
mysql_store_result(&conn);
while ((row = mysql_fetch_row(&result)) != false){
cout << row[0] <<endl;
}
mysql_close(&conn);
return 0;
}
Prevede se vredu ampak ne dobim nobenega izpira (while stavek se ne izvede)
mspiller ::
mysql_store_result(&conn);Je treba tole nekam shraniti.
npr: result = mysql_store_result(&conn);
arjan_t ::
sem ime pa sem izbrisal ker javi tole napako:
../src/mysql.cpp: In function ‘int main()’:
../src/mysql.cpp:37: error: no match for ‘operator=’ in ‘result = mysql_store_result((& conn))’
/usr/include/mysql/mysql.h:309: note: candidates are: st_mysql_res& st_mysql_res::operator=(const st_mysql_res&)
make: *** [src/mysql.o] Error 1
EDIT:
mysql++ sem pogledal pa sem raje izbral mysql ker sem navajen na php
../src/mysql.cpp: In function ‘int main()’:
../src/mysql.cpp:37: error: no match for ‘operator=’ in ‘result = mysql_store_result((& conn))’
/usr/include/mysql/mysql.h:309: note: candidates are: st_mysql_res& st_mysql_res::operator=(const st_mysql_res&)
make: *** [src/mysql.o] Error 1
EDIT:
mysql++ sem pogledal pa sem raje izbral mysql ker sem navajen na php
Zgodovina sprememb…
- spremenil: arjan_t ()
mspiller ::
definirii kot MYSQL_RES *result;
pa mysql_fetch_row(&result) pisi brez &.
Tisti pointerji v mysql dokumentaciji so tam z razlogom. Mogoce bi moral pa naprej pogledati kaksen tutorial glede pointerjev?
pa mysql_fetch_row(&result) pisi brez &.
Tisti pointerji v mysql dokumentaciji so tam z razlogom. Mogoce bi moral pa naprej pogledati kaksen tutorial glede pointerjev?
arjan_t ::
problem je da takoj ko kam dodam pointer (k mysql "spremenljivkam") dobim enak error kot prej:
Segmentation fault (core dumped)
Segmentation fault (core dumped)
'FireSTORM' ::
P.S. Kar bi te opozoril je to, da je Mysql pod GPL licenco, kar pomeni, da mora biti tvoja aplikacija prav tako. Ce tega ne zelis, lahko kupis mysql licenco (predno zacnes razvijati), ali pa vzames kaksno alternativo (postgres).
MySQL je v tem primeru backend.
In ti na GPLed backed daš komercialen backend, dokler komunikacija ni preveč kompleksna.
Those penguins.... They sure aint normal....
mspiller ::
'FireSTORM': Ce includas mysql.h in linkas z gpl knjiznico, kakor je tukaj primer, potem je jasno kaj to pomeni. Glede backendov sva pa ze enkrat premlela zadevo.
SasoS: GPL licenca verjetno res velja samo ob distribuciji. Malo me je zavedno, ker Trolltech hoce imeti licenco za vsakega developerja. In ne pusti spreminjati GPL v komercialno licenco. Drugace bi bila zadosti ena komercialna licenca na dedicated builderju. Ampak pri njih je problem, ne v GPL licenci, ampak v njihovi komercialni licenci, ki tega ne pusti. Govorim pa o stavku: "The Commercial license does not allow the incorporation of code developed with the Open Source Edition of Qt into a proprietary product. ". Efekt je pa na koncu se vedno identicen.
Daj se "MYSQL conn" kot pointer. Ter povsod popravi &conn v conn. Tukaj je problem, ker ti mysql_close sprosti objekt, prav tako pa ti ga sprosti main funkcija. Se vedno pa velja, da naslednjic izpisi kaj ti vrne gdb (glej moj post zgoraj).
SasoS: GPL licenca verjetno res velja samo ob distribuciji. Malo me je zavedno, ker Trolltech hoce imeti licenco za vsakega developerja. In ne pusti spreminjati GPL v komercialno licenco. Drugace bi bila zadosti ena komercialna licenca na dedicated builderju. Ampak pri njih je problem, ne v GPL licenci, ampak v njihovi komercialni licenci, ki tega ne pusti. Govorim pa o stavku: "The Commercial license does not allow the incorporation of code developed with the Open Source Edition of Qt into a proprietary product. ". Efekt je pa na koncu se vedno identicen.
Daj se "MYSQL conn" kot pointer. Ter povsod popravi &conn v conn. Tukaj je problem, ker ti mysql_close sprosti objekt, prav tako pa ti ga sprosti main funkcija. Se vedno pa velja, da naslednjic izpisi kaj ti vrne gdb (glej moj post zgoraj).
mspiller ::
Sej ni treba direkt gdb uporabljati. Eclipse ima ze vgrajen debugger, ki v osnovi klice gdb. Pac pozeni kot debug pa nastavi breakpoint na zacetek, pa se sprehodi cez program (F6).
Tukaj mas primere za uporabo mysql-a (po celi minuti googlanja ... ).
Kar ti pa se manjka tukaj, je pa ukaz mysql_select_db.
Tukaj mas primere za uporabo mysql-a (po celi minuti googlanja ... ).
Kar ti pa se manjka tukaj, je pa ukaz mysql_select_db.
arjan_t ::
Hvala za potrpežljivost mi je sedaj uspelo :)
select_db ni potreben ker lahko dodaš ime baze že v mysql_real_connect()
Sem zdaj na novo spisal vse skupaj in dela
EDITED: eh moja neumnost
#include <iostream>
#include <mysql/mysql.h>
#include <cstring>
using namespace std;
int main(){
MYSQL *mysql;
MYSQL_RES *result;
MYSQL_ROW row;
char *sql;
if((mysql=mysql_init(mysql)) == NULL){
cout << "failed" <<endl;
}
if (!mysql_real_connect(mysql, "localhost", "root", "", NULL, 0, NULL, 0)){
cout << "not conneted" <<endl;
return 1;
} else {
cout << "Connected .." <<endl;
}
if ((mysql_select_db(mysql, "test")) != 0){
cout << "select db failed" <<endl;
} else {
cout << "select db success" <<endl;
}
sql = "SELECT * FROM koledar";
if(mysql_query(mysql, sql)){
cout << "error";
mysql_close(mysql);
return 0;
} else {
cout << "query success" <<endl;
}
result = mysql_use_result(mysql);
if(result){
while ((row = mysql_fetch_row(result))){
cout << "row0:" << row[0] << " | " << "row1:" << row[1] <<endl;
}
} else {
cout << "no result";
}
mysql_free_result(result);
mysql_close(mysql);
return 0;
}
select_db ni potreben ker lahko dodaš ime baze že v mysql_real_connect()
Sem zdaj na novo spisal vse skupaj in dela
EDITED: eh moja neumnost
#include <iostream>
#include <mysql/mysql.h>
#include <cstring>
using namespace std;
int main(){
MYSQL *mysql;
MYSQL_RES *result;
MYSQL_ROW row;
char *sql;
if((mysql=mysql_init(mysql)) == NULL){
cout << "failed" <<endl;
}
if (!mysql_real_connect(mysql, "localhost", "root", "", NULL, 0, NULL, 0)){
cout << "not conneted" <<endl;
return 1;
} else {
cout << "Connected .." <<endl;
}
if ((mysql_select_db(mysql, "test")) != 0){
cout << "select db failed" <<endl;
} else {
cout << "select db success" <<endl;
}
sql = "SELECT * FROM koledar";
if(mysql_query(mysql, sql)){
cout << "error";
mysql_close(mysql);
return 0;
} else {
cout << "query success" <<endl;
}
result = mysql_use_result(mysql);
if(result){
while ((row = mysql_fetch_row(result))){
cout << "row0:" << row[0] << " | " << "row1:" << row[1] <<endl;
}
} else {
cout << "no result";
}
mysql_free_result(result);
mysql_close(mysql);
return 0;
}
Zgodovina sprememb…
- spremenil: arjan_t ()
SasoS ::
mysql=mysql_init(mysql)
Tole raje napiši kot mysql=mysql_init(NULL). Pa SQL stavki se ponavadi končajo z ;
Tole raje napiši kot mysql=mysql_init(NULL). Pa SQL stavki se ponavadi končajo z ;
arjan_t ::
V dokumentaciji piše:
Normally, the string must consist of a single SQL statement and you should not add a terminating semicolon (“;”) or \g to the statement
Ono pa bom popravil ...
Normally, the string must consist of a single SQL statement and you should not add a terminating semicolon (“;”) or \g to the statement
Ono pa bom popravil ...
Zgodovina sprememb…
- spremenil: arjan_t ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C - shranjevanje rezultatov iz baze v arrayOddelek: Programiranje | 1234 (933) | Randomness |
» | PHP povezava z MysqlOddelek: Izdelava spletišč | 934 (779) | snooze77 |
» | PHP login skriptOddelek: Izdelava spletišč | 2824 (1410) | Lion29 |
» | php updateOddelek: Programiranje | 941 (755) | keworkian |
» | [C] MySQLOddelek: Programiranje | 2822 (1844) | Tutankhamun |