Автор Тема: C и Mysql  (Прочетена 1439 пъти)

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
C и Mysql
« -: 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
Активен

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
C и Mysql
« Отговор #1 -: 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
Активен

tseso

  • Напреднали
  • *****
  • Публикации: 12
    • Профил
C и Mysql
« Отговор #2 -: 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
Активен

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
C и Mysql
« Отговор #3 -: Jan 13, 2006, 10:45 »
Не е това проблема, не е нужно да посочвам полетата, когато броя полета които добавям отговаря, но дори и това да е(а то не е), пробвах всякакви варианти, дори и по-прости query-ta, нищо не изпълнява.Днеска
 ще пробвам да си компилирам mysql , а не от пакет, но ме съмнява ...
Активен

i_danov

  • Участници
  • ***
  • Публикации: 7
    • Профил
C и Mysql
« Отговор #4 -: Jan 13, 2006, 13:47 »
Защо не си напечаташ query-то на конзола преди да го пратиш към сървъра? Избрал ли си коя е базата данни?
Освен това този ред:
Примерен код
printf(mysql_error(&demo_db));

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

  • Гост
C и Mysql
« Отговор #5 -: 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));

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

tseso

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

  • Гост
C и Mysql
« Отговор #7 -: 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). това е проблема
Активен

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
C и Mysql
« Отговор #8 -: Jan 13, 2006, 19:36 »
Цветозар едно голямо мерси, бях се отчаял.Само ме е яд че не сетих аз там '<img'> Спести ми доста време.
Активен

tseso

  • Напреднали
  • *****
  • Публикации: 12
    • Профил
C и Mysql
« Отговор #9 -: 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  се подава параметър нулево завършващ стринг без дължина.
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
MySql малък проблем.
Хардуерни и софтуерни проблеми
Marto 6 2330 Последна публикация Sep 25, 2002, 12:32
от
mysql въпрос
Настройка на програми
dumi 0 959 Последна публикация Oct 08, 2003, 06:42
от dumi
Perl + CGI,DBI + Mysql ili PHP + Mysql
Общ форум
jica 3 3299 Последна публикация Sep 07, 2004, 17:02
от jica
Mysql проблем със стартирането(mysql.sock missing)
Настройка на програми
coveka 6 4937 Последна публикация Mar 01, 2008, 22:02
от coveka
Mysql: can't connect to local mysql server
Настройка на програми
wonder 1 3569 Последна публикация Mar 16, 2008, 01:17
от neter