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>>
при выполнении 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[7]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 09.03.07 09:31
Оценка:
Аноним wrote:

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

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

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

В mysql_query можно передавать запросы только такие, текст которых не меняется.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 09.03.07 09:32
Оценка:
Аноним wrote:

> а как я туда впишу нужные мне урлы и тексты? они же не статические.

> каждый раз при вызове функции ей травятся разные данные!
РАЗБЕРИСЬ с кодом что я тебе дал. Там урлы не вписываются в запрос, а передаются байндом как данные запроса, а не текст.
Посмотри для каких запросов в том коде используется mysql_query и посмотри как запросе "INSERT INTO" передаются данные.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: при выполнении sprintf_s прога вылетает
От: Аноним  
Дата: 09.03.07 13:26
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


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

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

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


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

OE>то (char **) svUrl это бред.

тут надо смотреть еще _как_ вызываеться функция. что ей травиться. и когда я пишу (char **) svUrl — то все работает
Re[4]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 09.03.07 13:53
Оценка:
Аноним wrote:

> OE>то (char **) svUrl это бред.

>
> тут надо смотреть еще _как_ вызываеться функция. что ей травиться. и
> когда я пишу (char **) svUrl — то все работает
Всё равно бред.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: при выполнении sprintf_s прога вылетает
От: nemaga  
Дата: 09.03.07 14:01
Оценка:
Здравствуйте, ., Вы писали:

.>Аноним wrote:


>> OE>то (char **) svUrl это бред.

>>
>> тут надо смотреть еще _как_ вызываеться функция. что ей травиться. и
>> когда я пишу (char **) svUrl — то все работает
.>Всё равно бред.

это не бред. просто так требует функция, из-за того что при ее вызове ей тоже передается указатель.

вообщем я переделал на stmt:

[сcode]
int __stdcall indexer::SetMySqlRow(char * svUrl, char * svUrlPage)
{
SYSTEMTIME sysTime;
MYSQL_STMT * myStmt;
MYSQL_BIND myBind[3];
my_ulonglong myAffRows;
char svTime[12];
unsigned long nLenth;

GetSystemTime(&sysTime);

sprintf_s(svTime, 12, "%02d.%02d.%02d", sysTime.wDay, sysTime.wMonth, sysTime.wYear);
sprintf_s(this->sql, 20048, "SELECT id FROM indexed WHERE url='?'");

if(!(mysql_stmt_init(&this->mysql)))
return 0;
if(mysql_stmt_prepare(myStmt, this->sql, strlen(this->sql)))
return 0;

memset(myBind, 0, sizeof(myBind));
myBind[0].buffer_type = MYSQL_TYPE_STRING;
myBind[0].buffer = (char *) svUrl;
myBind[0].buffer_length = strlen(svUrl);
myBind[0].is_null = 0;
myBind[0].length = &nLenth;
myBind[1].buffer_type = MYSQL_TYPE_STRING;
myBind[1].buffer = (char *) svTime;
myBind[1].buffer_length = strlen(svTime);
myBind[1].is_null = 0;
myBind[1].length = &nLenth;
myBind[2].buffer_type = MYSQL_TYPE_STRING;
myBind[2].buffer = (char *) svUrlPage;
myBind[2].buffer_length = strlen(svUrlPage);
myBind[2].is_null = 0;
myBind[2].length = &nLenth;

if(mysql_stmt_bind_param(myStmt, myBind))
return 0;
if(mysql_stmt_execute(myStmt))
return 0;

myAffRows = mysql_stmt_affected_rows(myStmt);

if(myAffRows == 0)
{
sprintf_s(this->sql, 20048, "INSERT INTO indexed (url,date,page) VALUES ('?','?','?')");

if(mysql_stmt_bind_param(myStmt, myBind))
return 0;
if(mysql_stmt_execute(myStmt))
return 0;
}
else
{
sprintf_s(this->sql, 20048, "INSERT INTO indexed (url,date,page) VALUES ('?','?','?')");

if(mysql_stmt_bind_param(myStmt, myBind))
return 0;
if(mysql_stmt_execute(myStmt))
return 0;
}

return 1;
}
[/сcode]

но прога вылетает на строке: myBind[2].buffer_length = strlen(svUrlPage);
Re[6]: при выполнении sprintf_s прога вылетает
От: nemaga  
Дата: 09.03.07 14:48
Оценка:
упс ) я лохонулся ) в крде емного не дописал ) все исправил и пашет.
спс, .
Re[6]: при выполнении sprintf_s прога вылетает
От: . Великобритания  
Дата: 12.03.07 13:10
Оценка:
nemaga wrote:

> sprintf_s(svTime, 12, "%02d.%02d.%02d", sysTime.wDay, sysTime.wMonth,

> sysTime.wYear);
А зачем даты в строку превращать? В mysql есть тип для дат и функция получения текущего времени тоже (эффективнее
хранение, обработка, больше возможностей для поиска и индексации и т.п.). Мало того, зачем
2 цифры для года используешь? Ты слишком молод, чтобы помнить y2k проблемы?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.