Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
zoleg
19 / 19 / 1
Регистрация: 10.01.2012
Сообщений: 194
#1

Как правильно засунуть переменные в SQL? - C (СИ)

06.02.2012, 18:39. Просмотров 788. Ответов 8
Метки нет (Все метки)

Пытаюсь сделать такое

C
1
2
3
4
5
ind = (int)part[4] + ((int)part[3]*256 + ((int)part[2]*256 + (int)part[1]*256));
            printf(" IND = %d \n",ind);
 
            sprintf(query,"Вывод запроса select * from (select * from net_ru where begin_ip<=%d order by begin_ip desc limit 1) as t where end_ip>=%d",ind,ind);
            fprintf(stderr," Печать запроса %s ",query);
Компилятор ошибок не дает, но вывод fprintf(stderr," Печать запроса %s ",query) ничего не выводит. Явно косяк в с sprintf, но не могу понять где.

Какие еще есть легкие способы вставки переменных в cтроки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2012, 18:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно засунуть переменные в SQL? (C (СИ)):

Переменные, какие заданы правильно а какие неправильно? - C (СИ)
Скажите можно или нельзя так задавать? а самое главное почему? char a='A', b='B'; int x=5, y=3; double m=5, n=2; a*b x/y m%n

Как соединить 2 кода воедино или как хранить переменные в массиве? - C (СИ)
Уважаемые форумчане, есть 2 кода, один умеет через меню выводить текст хранящийся в массиве(далее код1), а второй умеет получать текст с...

Как правильно засунуть поток в объект? - Delphi
Всем привет... проблема такая Есть у меня наследник от TThread все хорошо все работает никаких вопросов... теперь я хочу вот весь...

Как SQL запрос засунуть в DBF? - Visual Basic
У меня запрос формирует файл эксел а надо сделать чтобы формировлся файл dbf, как можно обставить никогда не работал с dbf-ом. буду...

Как правильно засунуть две строчки в код программы?( - C++
Вставить надо это: int ok; do { /********************************* *** Часть программы, *** которую нужно...

Как правильно засунуть php в php - PHP
У меня есть такой код: &lt;?php echo do_shortcode(&quot; &quot;);?&gt; и такая кнопка: &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;&lt;?php...

8
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
06.02.2012, 19:06 #2
zoleg, скорее всего query не правильно объявлена...
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
    
int main(void){
    char query[BUFSIZ];
    
    sprintf(query, "bla bla bla select * from tablitsa where calonka1=%d and calonka2<>%d", 13, 69);
    printf("%s\n", query);
    
    return 0;
}
Код
andrew@rd-andrew ~/cpp/strings
$ gcc -o q q.c

andrew@rd-andrew ~/cpp/strings
$ ./q
bla bla bla select * from tablitsa where calonka1=13 and calonka2<>69
0
zoleg
19 / 19 / 1
Регистрация: 10.01.2012
Сообщений: 194
06.02.2012, 19:12  [ТС] #3
C
1
2
3
4
5
6
7
  MYSQL mysql;
  MYSQL_RES *result;
  MYSQL_ROW row;
  MYSQL_FIELD *fild;
  unsigned int num_fields;
  unsigned long *lengths;
  char *query;
C
1
RUN FAILED (значение выхода 1, общее время:  1с)
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.02.2012, 19:15 #4
zoleg, так а память выделить?
0
zoleg
19 / 19 / 1
Регистрация: 10.01.2012
Сообщений: 194
06.02.2012, 19:23  [ТС] #5
Выкладываю весь код. Ногами не пинать. Первая прога после PHP.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
 
/*
 * sprintf
 */
 
int main(int argc, char** argv) {
 
 
   /* MySql login details  //Данные для БД */
const char *dbhost = "localhost";
const char *dbuser = "root";
const char *dbpwd = "";
const char *db_name = "fail2ban";
unsigned int dbport = 3306;
const char *unix_socket= NULL;
unsigned long flag=0;
 
const char *charset = "utf8_general_ci";
char *in;
unsigned int i = 0;
//int part[4];
int ind;
 
  MYSQL mysql;
  MYSQL_RES *result;
  MYSQL_ROW row;
  MYSQL_FIELD *fild;
  unsigned int num_fields;
  unsigned long *lengths;
  char *query;
 
 
  sscanf(argv[1],"%d",(int *)&in); /* Command or name of connected сервер */
          
  mysql_init(&mysql);
  
if (!mysql_real_connect (&mysql, dbhost, dbuser, dbpwd, db_name, dbport, unix_socket, flag)){
                fprintf(stderr, " Failed to connect to database: Error: %s\n",mysql_error(&mysql));
                } else {
                        //thread_id = mysql_thread_id(&mysql); /* Получаем ID текущего потока Mysql */
                        
                        //#if (defined CONTROL)
                        fprintf(stdout,"Соединение mysql_real_connect в функции blacklistmain произошло - %s %s %s \n",dbuser,db_name,dbpwd);
                        fprintf(stdout,"Текущий charset - %s \n",(char *)mysql_character_set_name(&mysql));
                        fprintf(stdout," ID потока - %lu \n",mysql_thread_id(&mysql));
                       // #endif 
                        
                        if(mysql_character_set_name(&mysql)){
                                                                            // SET default charset
                                                                            mysql_set_character_set(&mysql, charset);
                                                                            #if (defined CONTROL)
                                                                            char *characternew;
                                                                            characternew = (char *)mysql_character_set_name(&mysql);
                                                                            fprintf(stdout,"Проверяем установку нужного чарсета charset - %s \n",characternew);
                                                                            #endif
                                                                             }    
                         }
 
  fprintf(stdout,"In = %s \n",argv[1]);
 
 if (!strcmp(argv[1], "show")) {
                query = "SELECT * FROM `baned` ORDER BY num DESC LIMIT 100";
                if (mysql_query(&mysql,query)){
                                fprintf(stderr, "Query failed in geo2ban with option show: %s \n)", mysql_error(&mysql));
                                } else {
                                        result = mysql_store_result(&mysql);
                                        num_fields = mysql_num_fields(result);
                                        printf("\n");
                                        while (row = mysql_fetch_row(result)){
                                                                              lengths = mysql_fetch_lengths(result);
                                                                              for(i = 0; i < num_fields; i++)
                                                                              {
                                                                               printf("[%.*s] ",(int) lengths[i],row[i] ? row[i] : "NULL" );
                                                                              }
                                                                               printf("\n");
                                                                              }
                                        mysql_free_result(result);
                                        mysql_close(&mysql);
                                        }
                                
                                } 
 else if (!strcmp(argv[1], "clear")){
                                       //query = "TRUNCATE TABLE `baned`";
                                       if (mysql_query(&mysql,"TRUNCATE TABLE `baned`"))
                                       fprintf(stderr, "Query TRUNCATE failed in geo2ban with option clear: %s \n)", mysql_error(&mysql));
                                       printf(" Resetting database \n");
                                       if (mysql_query(&mysql,"OPTIMIZE TABLE `baned`"))
                                       fprintf(stderr, "Query OPTIMIZE failed in geo2ban with option clear: %s \n)", mysql_error(&mysql));
                                       printf(" Optimising database \n");
                                       mysql_free_result(result);
                                       mysql_close(&mysql);                                       
                                       }
 else {
/* Основное действие  */
char *ipt = strdup(argv[1]);
char *part[4];    
    /* При первом вызове strtok в качестве первого параметра
     * передается указатель на строку в которой нужно искать
     * токены. Второй параметр - набор разделителей.
     * Возвращаемое значение - указатель на начало первого
     * токена, если он найден и NULL в противном случае.
    */
    char *p = strtok(ipt, ".");
    while(p) {
             i++;
             int val = atoi(p);
             printf(" Val = %d i = %d \n",val,i);
             /* Каждое поле IP адреса должно принимать значение
             * из диапазона 0-255. Если это не так, прерываем
             * цикл и возвращаем 0.
             */
             
             if (val < 0 || val > 255 || i > 4) {
                                                 printf(" IP extructed \n");
                                                 break;
                                                }
               part[i] = (char *) val;
               printf(" part%d = %d \n",i,(int)part[i]);
             /* При втором и последующем вызове strtok в качестве
             * первого параметра передается NULL. Указатель на
             * строку переданный при первом вызове этой функции
             * сохраняется в статической переменной, определенной
             * внутри функции strtok.
             */
             p = strtok(NULL, ".");
             }
    
    
    /* Если количество полей ip адреса не равно 4
     * возвращаем код ошибки.
    */
    if (i != 4) {
                printf(" IP is not valid \n");
    } else {
            printf(" IP is valid \n");
            /* Определяем индекс для поиска в БД города по IP*/
            ind = (int)part[4] + ((int)part[3]*256 + ((int)part[2]*256 + (int)part[1]*256));
            printf(" IND = %d \n",ind);
            /* Осуществляем поиск по Российским и Украинским городам*/
            sprintf(query,"select * from (select * from net_ru where begin_ip<=%d order by begin_ip desc limit 1) as t where end_ip>=%d",ind,ind);
            fprintf(stderr," Печать запроса %s ",query);
            /*if (mysql_query(&mysql,query)){
                                          fprintf(stderr, "Query failed in geo2ban select * from net_ru: %s query - %s \n)", mysql_error(&mysql),query);
                                          }
            else {
                 result = mysql_store_result(&mysql);
                 printf("Дошли до rows ==1");
                 if (mysql_num_rows(result) != 1){ 
                                                    printf("Num rows ==1");    
                                                   num_fields = mysql_num_fields(result);     
                                                   while (row = mysql_fetch_row(result)){
                                                                              lengths = mysql_fetch_lengths(result);
                                                                              for(i = 0; i < num_fields; i++)
                                                                              {
                                                                               printf("[%.*s] ",(int) lengths[i],row[i] ? row[i] : "NULL" );
                                                                              }
                                                                               printf("\n");
                                                                              }
                                                   }
                                                  
                 }*/
            }
    
    free(ipt);
  } 
/*    
sscanf(in,"%d %d %d %d",&a,&b,&c,&d);
    
 fprintf(stderr, "Выводим куски Айпи : %d %d %d %d \n)",a,b,c,d); */
  
 
 
 
  
    return (EXIT_SUCCESS);
 
 
}
 
/*
 * 
 INSERT INTO `baned` (`name`,`rmip`,`port`,`prot`,`city`,`dist`,`region`,`lat`,`lon`,`country`,`ccod`) VALUES ('172.14.3.132', '172.14.3.134', '22', 'ssh', 'Dtrkov', 'Hren', 'Hrenovi', '12.4555', '24.4444444', 'Belarus', 'BU')
 * 
 */
0
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
06.02.2012, 19:28 #6
вам уже сказали
char *query;
указатель в никуда
надо выделить память
0
zoleg
19 / 19 / 1
Регистрация: 10.01.2012
Сообщений: 194
06.02.2012, 22:49  [ТС] #7
Понял. Спасибо. Буду искать как выделяется память.

Добавлено через 3 часа 6 минут
Сделал так
C
1
char *query = malloc(sizeof(query));
Не знаю насколько это правильно, но работает.
Остались сомнения насчет того надо или не надо что либо за собой подчищать. Ну типа там free(query )?
0
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
06.02.2012, 22:55 #8
динамическая память - один из вариантов
только аргументом malloc принимает то, сколько нужно выделить байт
и да, память нужно очистить после того как она больше не нужна

C
1
2
3
char *query = (char *)malloc(sizeof(char) * 100);
...
free(query);
другой вариант - использовать статический массив

C
1
char query[100];
0
zoleg
19 / 19 / 1
Регистрация: 10.01.2012
Сообщений: 194
06.02.2012, 23:11  [ТС] #9
Спасибо. Я понял.
0
06.02.2012, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2012, 23:11
Привет! Вот еще темы с ответами:

Как правильно объявлять переменные? - Assembler
Здравствуйте, перед тем как писать что то наподобие &quot;google в помощь&quot; скажу что на разных сайтах написано по разному! Собственно говоря...

Как правильно создавать переменные в С++? - C++
Тема исключительно для завлечения. Почему castaway заблокировали? Обиделся что &quot;Спасибо&quot; не жмакают?

как правильно обьявить переменные в цикле - JavaScript
Привет всем, у меня есть кусок кода, который надо объявлять на автомате вот этот кусок group1 = new ymaps.GeoObjectArray({ ...

Как правильно создать переменные среды? - Java
Подскажите пожалуйста как прописать переменные среды если java установлена сюда http://prntscr.com/8v4xit CLASSPATH .;C:\Program...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru