Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在传递到mysql\u查询之前高效地转义C中的引号_Mysql_Sql_C - Fatal编程技术网

在传递到mysql\u查询之前高效地转义C中的引号

在传递到mysql\u查询之前高效地转义C中的引号,mysql,sql,c,Mysql,Sql,C,简而言之,我通常使用sprintf在C中构建一个MySQL查询 i、 e 然而,如果某个描述有点像疯狂的5“狗,那么MySql服务器会尖叫,因为它对悬垂的引用感到困惑 在C语言中,最好扫描一些描述,将“替换为”,还是MySql中有一个函数可以更好地包装这些描述。。。i、 e.描述=字符串(疯狂的5英寸狗) 谢谢!我将编写一个简单的转义函数,如下所示: size_t escape_mysql_string(const char * input, size_t input_size, char

简而言之,我通常使用sprintf在C中构建一个MySQL查询

i、 e

然而,如果某个描述有点像疯狂的5“狗,那么MySql服务器会尖叫,因为它对悬垂的引用感到困惑

在C语言中,最好扫描一些描述,将“替换为”,还是MySql中有一个函数可以更好地包装这些描述。。。i、 e.描述=字符串(疯狂的5英寸狗)


谢谢!

我将编写一个简单的转义函数,如下所示:

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);

虽然MySQL有一个函数,但您可能应该改用它,它允许您使用占位符而不是实际参数,然后在每次执行语句之前将它们绑定到实际参数。

MySQL已经为您这样做了


谢谢ninjalj,@Francisco Soto.。我最终使用了mysql\u real\u escape\u string;我的代码太远了,无法切换到准备好的语句……不过这很好!永远不要编写自己的SQL escape例程:mysql支持UTF-8和各种疯狂的字符集,这可能会导致您如何看待字节和如何处理字节之间的巨大差异MySQL解释它们。
char some_escaped_desc[1024];
escape_mysql_string(some_desc, strlen(some_desc), some_escaped_desc, 1024);