Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
C for SQL中的转义引号_Sql_C_String_Escaping - Fatal编程技术网

C for SQL中的转义引号

C for SQL中的转义引号,sql,c,string,escaping,Sql,C,String,Escaping,我知道用字符串创建SQL查询而不使用命令类是一种不好的做法。但是我使用的是将dbf数据库转换为sqlite数据库,这个工具不能正确地为insert语句转义字符串中的单引号。 该工具生成以下SQL: INSERT INTO sample VALUES('1','Am G'haubach'); 但正确的做法是——请注意双引号: INSERT INTO sample VALUES('1','Am G''haubach'); 由于该工具位于Github上,我试图自己修复错误,但我对C以及如何解决问题

我知道用字符串创建SQL查询而不使用命令类是一种不好的做法。但是我使用的是将dbf数据库转换为sqlite数据库,这个工具不能正确地为insert语句转义字符串中的单引号。 该工具生成以下SQL:

INSERT INTO sample VALUES('1','Am G'haubach');
但正确的做法是——请注意双引号:

INSERT INTO sample VALUES('1','Am G''haubach');
由于该工具位于Github上,我试图自己修复错误,但我对C以及如何解决问题一无所知: 以下是转义insert语句值的部分:

    /* Re-write invalid characters to their SQL-safe alternatives */
t = targetbuf;
for(s = buf; s <= lastchar; s++) {
switch(*s) {
case '\'':
    /* *t++ = '\\'; */
    *t++ = '\'\'';
    break;
case '\\':
    *t++ = '\\';
    *t++ = '\\';
    break;
case '\n':
    *t++ = '\\';
    *t++ = 'n';
    break;
case '\r':
    *t++ = '\\';
    *t++ = 'r';
    break;
case '\t':
    *t++ = '\\';
    *t++ = 't';
    break;
default:
    *t++ = *s;
}
}
/*将无效字符重新写入其SQL安全替代项*/
t=targetbuf;

对于(s=buf;s理想情况下,应该在SQL中为字符串使用占位符,因此——正如klutt在上文中所建议的那样——最好的做法可能是提交一份错误报告,您可以尝试以下操作。在遍历输入缓冲区时,它会检查相邻字符,并计算已分析的引号数,以估计它是否在字符串上下文中

int n_quotes = 0;
// Point to base of target buf ...
t = targetbuf;
while (*s) {
    switch (*s) {
        case '\'':
            // Examine the next character in an attempt
            // to determine if this is a 'string context'
            if (*(s + 1) != ',' && *(s + 1) != ')' && n_quotes % 2 == 1) {
                // We are more than likely inside a string ...
                *(t++) = '\'';
                *(t++) = '\'';
            } else {
                *(t++) = *s;
                n_quotes++;
            }
            break;
        default:
            *(t++) = *s;
            break;
    }
    s++;
}
*t = '\0';
puts(targetbuf);
完整示例见

输出:

INSERT INTO sample VALUES('1', 'Am G''haubach');

您在正确的位置修复它,但它应该是:

case '\'':
    *t++ = '\'';    // replace a single quote..
    *t++ = '\'';    //..with two single quotes
    break;

这假设您正在处理sql语句中的一个变量,因此输入是
Am G'haubach
,输出是
Am G'haubach
,然后必须将其打印到sql语句中,并用单引号括起来,如
'Am G'haubach'

查看代码如何将一个反斜杠变成两个反斜杠,然后重新编译将其复制为单引号你应该做的是提交一份错误报告。@ChrisTurner谢谢你,伙计,你的评论实际上解决了我的问题,但由于保罗在我测试答案之前就已经给出了答案,我无法告诉你将其作为答案发布。再次感谢。@Klutt尽管你的评论似乎有点讽刺,我刚刚意识到github上有一个pull请求,正好解决了我的问题:D@Abenil这根本不是为了讽刺。如果你发现了一个bug,开发人员会非常高兴地发现。谢谢你的例子,我从我的例子中删去了很多信息,因为我认为它不相关。在我引用的部分中,您肯定处于字符串上下文中,因为所有其他数据类型都将由另一个函数处理。非常感谢,这正是我想要的。;)克里斯·特纳让我走上了正确的道路,但在你发布答案之前,我甚至无法尝试。竖起大拇指!:)