2011-10-20 130 views
2

总而言之我通常建立C之内一个MySQL查询中使用的sprintf传递给MYSQL_QUERY

sprintf(sqlcmd,"update foo set dog=\"lab\" where description=\"%s\"",some_desc); 
mysql_query(some_conn,sqlcmd); 

之前有效地逃逸用C报价然而,如果some_desc是一样的东西疯狂5" 狗,那么MySql Server尖叫,因为它在悬挂报价上感到困惑。

在C中,扫描some_desc替换“with”是最好的,OR在MySql中有一个函数来更好地包装这个... ie description =字符串(C狂野5“狗)?

谢谢!

回答

6

虽然MySQL有一个mysql_real_escape_string()功能,你或许应该使用prepared statements而不是,它允许你使用?占位符而不是实参,然后在每次执行语句之前将它们绑定到实参。

+0

谢谢ninjalj,@ Francisco Soto ....我结束了使用mysql_real_escape_string;我的代码太离谱了,无法切换到准备好的语句...虽然知道了! – jparanich

-2

我会写这样一个简单的逃生功能如下:

size_t escape_mysql_string(const char * input, size_t input_size, 
    char * output, size_t output_size) 
{ 
    unsigned long ipos; // position within input buffer 
    unsigned long opos; // position within output buffer 

    // quick check to verify output buffer is at least as large as input buffer 
    if (output_size < (input_size+2)) 
     return(0); 

    // loop through input buffer 
    opos = 0; 
    for(ipos = 0; ((ipos < input_size) && (input[ipos])); ipos++) 
    { 
     // verify that output buffer has room for escaped input 
     if ((opos+2) >= output_size) 
     { 
     output[opos] = '\0'; 
     return(opos); 
     }; 

     switch(input[ipos]) 
     { 
     // escape ("""), ("'"), ("\"), ("%"), and ("_") characters 
     case '\'': 
     case '\"': 
     case '\\': 
     case '%': 
     case '_': 
     output[opos] = '\\'; 
     opos++; 
     output[opos] = input[ipos]; 
     break; 

     // escape newlines 
     case '\n': 
     output[opos] = '\\'; 
     opos++; 
     output[opos] = 'n'; 
     break; 

     // escape carriage returns 
     case '\r': 
     output[opos] = '\\'; 
     opos++; 
     output[opos] = 'r'; 
     break; 

     // escape tabs 
     case '\t': 
     output[opos] = '\\'; 
     opos++; 
     output[opos] = 't'; 
     break; 

     // save unescapd input character 
     default: 
     output[opos] = input[ipos]; 
     break; 
     }; 
     opos++; 
    }; 

    output[opos] ='\0'; 
    return(opos); 
} 

的的东西,如以下称之为:

char some_escaped_desc[1024]; 
escape_mysql_string(some_desc, strlen(some_desc), some_escaped_desc, 1024); 
+0

不要写自己的SQL逃生过程:在MySQL支持UTF-8和各种疯狂的字符集,这可能会导致你怎么看之间巨大的差异字节以及MySQL如何解释它们。 – BraveNewCurrency