2013-05-02 158 views
1

我正在使用mysql.h庫的C程序。這是代碼:mysql_real_escape_string()導致段錯誤

int newproduct(){ 
    char *name;//nombre del prducto 
    char *desc;//descripcion del producto 
    double price;//precio del producto 
    cprint("Agregar nuevo producto\n\n"); 
    printf("Nombre del producto: "); 
    scanf("%s", &name); 
    printf("Descripcion: "); 
    scanf("%s", &desc); 
    printf("Precio: "); 
    scanf("%e", &price); 

    MYSQL *conn; 
    conn = mysql_init(NULL); 

    if (!mysql_real_connect(conn, server, 
    user, password, database, port, NULL, 0)) { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    } 

    char *rname = NULL;//string donde guardar el nombre con caracteres de escape 
    char *rdesc = NULL; 
    mysql_real_escape_string(conn,rname,name,strlen(name));//se realiza el real escape 
    mysql_real_escape_string(conn,rdesc,desc,strlen(desc)); 
    /* 
    char *query;//donde guardar el query 

    snprintf(query,1000,"INSERT INTO productos (nombre,descripcion,stock,precio) VALUES(%s,%s, 0, %e)",rname,rdesc,price);//query a enviar 

    if (mysql_query(conn, query)) {//enviar el query 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit(1); 
    }*/ 

    mysql_close(conn); 

return 0; 
} 

這是控制檯執行

Agregar nuevo producto 

Nombre del producto: a 
Descripcion: a 
Precio: 1 
Segmentation fault (core dumped) 


------------------ 
(program exited with code: 139) 
Press return to continue 

我敢肯定的是,mysql_real_escape_string引起分段錯誤,因爲當我評論它的代碼工作正常,但它是我的第一次與MySQL一起工作,我不知道爲什麼這是失敗的。除此之外,我能夠從數據庫檢索一些信息,所以它不是連接錯誤。 PD:cprint是一個聲明函數,它向包含mysql行數據的printf函數添加一個頭文件。

回答

2

rnamerdesc都應該是緩衝區,而不是指向NULL。您必須先分配內存空間。

例如:

char rname[1024]; 
char rdesc[1024]; 
mysql_real_escape_string(conn, rname, name, 1024); 
mysql_real_escape_string(conn, rdesc, desc, 1024); 

而且,rname的大小不能strlen(name),因爲轉義字符將需要額外的空間。所需的緩衝區可能不得不比原始字符串大四倍。

+0

緩衝區,根據文檔必須是原始字符串的長度加1(對於空終止符)的長度的2倍。這是最壞的情況(也就是說,緩衝區不過是單引號)。 – 2013-06-14 20:29:26

1

docsto說法:

unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length) 
                 ^^^^^^^^ 

而你的情況是rnamerdesc需要足夠的空間分配給他們。該文件明確說:

You must allocate the to buffer to be at least length*2+1 bytes long. 

您還沒有使用scanf正確地namedesc,因爲分配給他們既沒有空間。像下面的內容將工作:

char name[80]; 
scanf("%s", name); 

如果我們用一個尺寸的80name去然後按照文件,下面會爲rname工作:

char rname[161] ;