при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 15:24
Оценка:
есть код:

int __stdcall SetMySqlRow(char * svUrl, char * svUrlPage)
{
    MYSQL mysql;
    MYSQL_RES * myRes;
    MYSQL_ROW myRow;
    char sql[1024];

    mysql_init(&mysql);
    mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "caamy_indexer");

    if(!mysql_real_connect(&mysql, host, login, pass, db, NULL, NULL, NULL))
    {
        MessageBox(NULL, mysql_error(&mysql), "Error!", NULL);
        return 0;
    }

    sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);

    if(mysql_query(&mysql, sql))
        return 0;

    myRes = mysql_store_result(&mysql);

    if(myRes->row_count == 0)
    {
        sprintf_s(sql, 1024, "INSERT INTO indexed (url,page) VALUES ('%s','%s')", svUrl, svUrlPage);

        if(mysql_query(&mysql, sql))
            return 0;
    }
    else
    {
        sprintf_s(sql, 1024, "UPDATE indexed SET page='%s' WHERE url='%s'", svUrlPage, svUrl);

        if(mysql_query(&mysql, sql))
            return 0;
    }

    return 1;
}


когда доходит до спринтфа, то вылетает в дебагер. кто зхнает почему — помогите.
заранее спасибо
Re: при выполнении sprintf_s прога вылетает
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.03.07 15:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>когда доходит до спринтфа, то вылетает в дебагер.


и что в Debug-e вылетает и никаких окошек и сообщений в Output нету?
Re[2]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 16:35
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, Аноним, Вы писали:


А>>когда доходит до спринтфа, то вылетает в дебагер.


OE>и что в Debug-e вылетает и никаких окошек и сообщений в Output нету?


скомпилил в Debug Mode. вылетело такое:

Debug Assertion Failed!
File: vsprintf.c
Program: blah-blah
Line: 244
Expression: ("Buffer too small", 0)
Re[3]: при выполнении sprintf_s прога вылетает
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.03.07 16:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Expression: ("Buffer too small", 0)


ну, на то он и sprintf_s чтоб вылетать когда Buffer too small Не хватает тебе 1024
Re[4]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 17:02
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, Аноним, Вы писали:


А>>Expression: ("Buffer too small", 0)


OE>ну, на то он и sprintf_s чтоб вылетать когда Buffer too small Не хватает тебе 1024


где мне увеличивать? в самом спринтфе или в переменной?

PS: я пробовал и просто sprintf — тоже вылетало
Re: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 08.03.07 17:17
Оценка:
Аноним wrote:

> sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);

НИКОГДА, НИГДЕ не пиши такие запросы. Только через bind параметров!!
Для pure C http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 18:03
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);

.>НИКОГДА, НИГДЕ не пиши такие запросы. Только через bind параметров!!
.>Для pure C http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html

что за бинд? пример покажы. и чем тебе не нравиться такой способ построения строки запроса?
Re[3]: при выполнении sprintf_s прога вылетает
От: Roman Odaisky Украина  
Дата: 08.03.07 18:34
Оценка:
Здравствуйте, Аноним, Вы писали:

>>> sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);

.>>НИКОГДА, НИГДЕ не пиши такие запросы. Только через bind параметров!!
.>>Для pure C http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html

А>что за бинд? пример покажы. и чем тебе не нравиться такой способ построения строки запроса?


На примере Web. Пусть у тебя есть скрипт для изменения данных юзеров:

http://yourserver/updateUser?favouriteMeal=borsch => UPDATE users SET favouriteMeal = '%s' WHERE id = %d

Всё хорошо. Только однажды юзер делает запрос

http://yourserver/updateUser?favouriteMeal=';UPDATE+users+SET+password=xyzzy+WHERE+group='admins';SELECT+'

И станет еще лучше.
До последнего не верил в пирамиду Лебедева.
Re: при выполнении sprintf_s прога вылетает
От: Roman Odaisky Украина  
Дата: 08.03.07 18:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>    char sql[1024];
А>    sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);
А>


А>когда доходит до спринтфа, то вылетает в дебагер. кто зхнает почему — помогите.


А куда '\0' писать? Скорее всего, там надо 1024 заменить на 1023.
До последнего не верил в пирамиду Лебедева.
Re[3]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 08.03.07 18:38
Оценка:
Аноним wrote:

> что за бинд? пример покажы.

Я ж дал ссылку, там всё есть.
http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html

> и чем тебе не нравиться такой способ

> построения строки запроса?
Так нельзя, не только главным образом с т.з. безопасности, а также с т.з. производительности, наличием ограничений на
длину текста запроса и невозможностью передавать таким образом некоторые типы данных (blob обычно).
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 18:43
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> что за бинд? пример покажы.

.>Я ж дал ссылку, там всё есть.
.>http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html

там написано кучу всякой дряни на ненужные мне фун-ции
мне надо токо само формирование запроса

>> и чем тебе не нравиться такой способ

>> построения строки запроса?
.>Так нельзя, не только главным образом с т.з. безопасности, а также с т.з. производительности, наличием ограничений на
.>длину текста запроса и невозможностью передавать таким образом некоторые типы данных (blob обычно).

а мне всякие блобы и не нужны. это не ISAPI модуль. это индексатор для поисковика. эму надо только занести пару текстовых полей в базу
Re[4]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 18:49
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> что за бинд? пример покажы.

.>Я ж дал ссылку, там всё есть.
.>http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-execute.html

и тем более в этих доках нету формирования запроса в программе. там все записано в define дериктивах. а мне такое не надо. мне самому для каждого урла надо сделать запрос. а тут без функций обработки строк не обойтись. а в бинды уже вставляються готовые строки
Re[5]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 08.03.07 18:51
Оценка:
Аноним wrote:

> и тем более в этих доках нету формирования запроса в программе. там все

Есть.

> записано в define дериктивах. а мне такое не надо. мне самому для

Ты должен сделать также!

> каждого урла надо сделать запрос. а тут без функций обработки строк не

> обойтись. а в бинды уже вставляються готовые строки
Нет. Разберись что означет знак "?" в запросах.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 18:57
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> и тем более в этих доках нету формирования запроса в программе. там все

.>Есть.

>> записано в define дериктивах. а мне такое не надо. мне самому для

.>Ты должен сделать также!

>> каждого урла надо сделать запрос. а тут без функций обработки строк не

>> обойтись. а в бинды уже вставляються готовые строки
.>Нет. Разберись что означет знак "?" в запросах.

ну ты можешь написать пример создания строки запроса без всяких mysql_stmt_* функций и прочей лабуды?
мне надо просто создать строку запроса и стравить ее mysql_query();
Re[6]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 19:14
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> записано в define дериктивах. а мне такое не надо. мне самому для

.>Ты должен сделать также!

а как я туда впишу нужные мне урлы и тексты? они же не статические. каждый раз при вызове функции ей травятся разные данные!
Re: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 19:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть код:


А>
А>int __stdcall SetMySqlRow(char * svUrl, char * svUrlPage)
А>{
А>    MYSQL mysql;
А>    MYSQL_RES * myRes;
А>    MYSQL_ROW myRow;
А>    char sql[1024];

А>    mysql_init(&mysql);
А>    mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "caamy_indexer");

А>    if(!mysql_real_connect(&mysql, host, login, pass, db, NULL, NULL, NULL))
А>    {
А>        MessageBox(NULL, mysql_error(&mysql), "Error!", NULL);
А>        return 0;
А>    }

А>    sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", svUrl);

А>    if(mysql_query(&mysql, sql))
А>        return 0;

А>    myRes = mysql_store_result(&mysql);

А>    if(myRes->row_count == 0)
А>    {
А>        sprintf_s(sql, 1024, "INSERT INTO indexed (url,page) VALUES ('%s','%s')", svUrl, svUrlPage);

А>        if(mysql_query(&mysql, sql))
А>            return 0;
А>    }
А>    else
А>    {
А>        sprintf_s(sql, 1024, "UPDATE indexed SET page='%s' WHERE url='%s'", svUrlPage, svUrl);

А>        if(mysql_query(&mysql, sql))
А>            return 0;
А>    }

А>    return 1;
А>}
А>


А>когда доходит до спринтфа, то вылетает в дебагер. кто зхнает почему — помогите.

А>заранее спасибо

я впринципе понял почему оно выкидует. я неправельно обращаюсь к указателю. функция вызываеться так:


char * svUrl = "http://172.17.1.1/";
char svUrlPage[10024];

//getting svUrlPage from downloaded file;

SetMySqlRow(svUrl, svUrlPage);
Re: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 08.03.07 19:49
Оценка:
все. я вдуплил надо писать так:

sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", (char **) svUrl);
Re[5]: при выполнении sprintf_s прога вылетает
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.03.07 04:04
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>>Expression: ("Buffer too small", 0)

OE>>ну, на то он и sprintf_s чтоб вылетать когда Buffer too small Не хватает тебе 1024
А>где мне увеличивать? в самом спринтфе или в переменной?

ты не сказал на каком sprintf_s вылетает. Но вообщем тут одно из двух, либо у тебя действительно svUrl или svUrlPage больше 1000 и тогда надо увеличивать sql, либо в svUrl или svUrlPage вместо правильных коротких строк приходит какой-то мусор, иди под отладчиком по шагам и смотри что там на самом деле в твоих строках
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[2]: при выполнении sprintf_s прога вылетает
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.03.07 04:04
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>все. я вдуплил надо писать так:

А>sprintf_s(sql, 1024, "SELECT id FROM indexed WHERE url='%s'", (char **) svUrl);

если перед этим все еще написано

int __stdcall SetMySqlRow(char * svUrl, char * svUrlPage)

то (char **) svUrl это бред.
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re[7]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 09.03.07 09:31
Оценка:
Аноним wrote:

> ну ты можешь написать пример создания строки запроса без всяких

> mysql_stmt_* функций и прочей лабуды?
Тебе нужно пользоваться этой лабудой.

> мне надо просто создать строку запроса и стравить ее mysql_query();

В mysql_query можно передавать запросы только такие, текст которых не меняется.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.