Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: PAIN1 в Jan 11, 2006, 19:18



Титла: C и Mysql
Публикувано от: PAIN1 в Jan 11, 2006, 19:18
На пръв поглед нещата трябва да работят, но не приема query-то което му подвам, примерен код:

Примерен код

 datasize=mysql_real_escape_string(&demo_db, encdata, argv[1], strlen(argv[1]));

/* Escape any MySQL-unsafe characters */

  query=malloc(datasize+255); //*Make sure we have enough space for the query
  sprintf(query, "INSERT INTO demotable VALUES ('%s' , 12)", encdata); //* Build query
  if(mysql_real_query(&demo_db, query, (strlen(query)+255))) { //* Make query
     printf(mysql_error(&demo_db));
     printf("\n");
     exit(1);
  }
  free(query);


Примера е директно копиран от интернет, самото query изпълнено в конзолата си работи ...., но като изпълня програмата връща

Примерен код

bash-3.00# ./mysqldemo test1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
bash-3.00#    

Тоест ерор в самото query, а не във програмата ..... ?
Програмата се връзва към базата данни и си селектва базата която искам (поне не връща грешка ) .
Идеи ?

Примерен код

mysql  Ver 14.7 Distrib 4.1.14, for slackware-linux-gnu (i486) using  EditLine wrapper


това връзка към кода който опитвам.
http://www.synnottsoftware.com/tutorials/mysqlbasic.php


Титла: C и Mysql
Публикувано от: PAIN1 в Jan 11, 2006, 22:03
Проблемът се изврати много тъпо когато опитах да упдейтна пакета,
по всички правила го инсталирах и резултата:

Примерен код

bash-3.00# ./mysqldemo test1
./mysqldemo: error while loading shared libraries: libmysqlclient.so.15: cannot open shared object file: No such file or directory



Примерен код

bash-3.00# mysql --version
mysql  Ver 14.12 Distrib 5.0.16, for slackware-linux-gnu (i486) using  EditLine wrapper


Титла: C и Mysql
Публикувано от: tseso в Jan 13, 2006, 00:01
Тук нещо не се вързва:
 sprintf(query, "INSERT INTO demotable VALUES ('%s' , 12)", encdata);

INSERT INTO table(Field1, Field2)  VALUES (value1, value2)

Field1- име на поле за value1
Field2 -име на поле за value2


Титла: C и Mysql
Публикувано от: PAIN1 в Jan 13, 2006, 10:45
Не е това проблема, не е нужно да посочвам полетата, когато броя полета които добавям отговаря, но дори и това да е(а то не е), пробвах всякакви варианти, дори и по-прости query-ta, нищо не изпълнява.Днеска
 ще пробвам да си компилирам mysql , а не от пакет, но ме съмнява ...


Титла: C и Mysql
Публикувано от: i_danov в Jan 13, 2006, 13:47
Защо не си напечаташ query-то на конзола преди да го пратиш към сървъра? Избрал ли си коя е базата данни?
Освен това този ред:
Примерен код
printf(mysql_error(&demo_db));

е хубаво да го смениш на:
Примерен код
printf("%s\n",mysql_error(&demo_db));


Титла: C и Mysql
Публикувано от: в Jan 13, 2006, 15:38
Цитат
if(mysql_real_query(&demo_db, query, (strlen(query)+255))) { //* Make query


а защо дължината на query-то, която подаваш ти е strlen(query)+255 ??!!?!?!?!?!?!? подай като дължина на query-то само strlen(query);

това ти е грешката. така функцията взема още 255 символа след края на SQL заявката, което си е неправилно.

@i_danov
Цитат
Освен това този ред:
Примерен код
printf(mysql_error(&demo_db));

е хубаво да го смениш на:
Примерен код
printf("%s\n",mysql_error(&demo_db));

може и да е хубаво щом ти харесва, но и както той го е записал е правилно и няма абсолютно никакъв проблем.


Титла: C и Mysql
Публикувано от: tseso в Jan 13, 2006, 17:55
по метода на налучкванияата мога да предложа да замениш символа ' с \'  между двойните скоби
 
Функцията sprintf слага нулев символ '\0' в края на набора от символи и не е от значение колко памет е заделена за query стига да са повече от необходимите +1, но за всеки случай може да се напише така:
(query, "INSERT INTO demotable VALUES (\'%s\' , 12)\0", encdata);


Титла: C и Mysql
Публикувано от: в Jan 13, 2006, 18:57
Цитат (tseso @ Ян. 13 2006,18:55)
Функцията sprintf слага нулев символ '\0' в края на набора от символи и не е от значение колко памет е заделена за query стига да са повече от необходимите +1,

Цитат
по метода на налучкванияата мога да предложа да замениш символа ' с \'  между двойните скоби

парсъра на C и в двата случая ще подразбере едно и също.

колкото до другото, не знам дали си се занимавал със C/MySQL след като толкова мъдруваш по въпроса, но това не е като да драскаш на PHP/MySQL! и е хубаво да прочетеш малко из API функциите на MySQL за линкване със C преди да даваш съвети, щото просто ще губиш времето на човека в тъпи проби.

mysql_real_query не прекъсва query-то до нулевия символ (т.е. \0, както го записваш), ТЪЙ КАТО С ТАЗИ ФУНКЦИЯ МОЖЕ ДА СЕ ПОДАДАТ БИНАРНИ ДАННИ, КЪДЕТО МОЖЕ ДА ИМА ВСЯКАКВИ СИМВОЛИ, ВКЛЮЧИТЕЛНО И \0.

затова е много важно да е абсолютно точен размера - т.е. да е strlen(query). това е проблема


Титла: C и Mysql
Публикувано от: PAIN1 в Jan 13, 2006, 19:36
Цветозар едно голямо мерси, бях се отчаял.Само ме е яд че не сетих аз там :) Спести ми доста време.


Титла: C и Mysql
Публикувано от: tseso в Jan 13, 2006, 21:26
API Function Descriptions:
http://dev.mysql.com/doc/refman/5.0/en/mysql-query.html
http://dev.mysql.com/doc/refman/5.0/en/mysql-real-query.html

Както се вижда от по горе описаните финкции, Цветозар е прав (като изключим острия тон), че mysql-real-query може да съдържа \0. Ако се използва mysql-query  се подава параметър нулево завършващ стринг без дължина.