Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Objective c 目标C:您是否必须在SQL的字符串中转义单引号?_Objective C_Iphone_Sqlite_Quotes - Fatal编程技术网

Objective c 目标C:您是否必须在SQL的字符串中转义单引号?

Objective c 目标C:您是否必须在SQL的字符串中转义单引号?,objective-c,iphone,sqlite,quotes,Objective C,Iphone,Sqlite,Quotes,我是一名iPhone开发者。我正在编写单元测试用例,其中一个测试用例检查应用程序是否接受要写入sqlite3数据库的UTF8字符串。我创建了一个测试用例来生成随机UTF8字符串,我可以看到失败的字符串,因为它们包含一个撇号('),我需要接受它 我正在向数据库中写入以下内容: NSString *query=@"INSERT INTO song (id,title, duration) VALUES (?,?,?);"; sqlite3_stmt *_statement; insert=sqlit

我是一名iPhone开发者。我正在编写单元测试用例,其中一个测试用例检查应用程序是否接受要写入sqlite3数据库的UTF8字符串。我创建了一个测试用例来生成随机UTF8字符串,我可以看到失败的字符串,因为它们包含一个撇号('),我需要接受它

我正在向数据库中写入以下内容:

NSString *query=@"INSERT INTO song (id,title, duration) VALUES (?,?,?);";
sqlite3_stmt *_statement;
insert=sqlite3_prepare_v2(_database, [query UTF8String], -1, &_statement, NULL);
sqlite3_bind_text(_statement, 1, [value1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(_statement, 2, [value2 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(_statement, 3, [value3 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_step(_statement);

我是否必须用替换或类似的方式手动转义value1-3中的撇号?如果是这样的话,那就有点站不住脚了……

在本文中,它不是撇号,而是编译器将其视为分隔字符串的单引号。由于您正在构建一个字符串以发送到SQL,因此未替换的单引号将破坏出现该字符串的位置

在任何字符串上下文中都必须转义单引号和双引号字符。这适用于每种语言,而不仅仅是C语言变体

见鬼,如果您使用语法着色,编辑器通常会显示您已将代码的一大块转换为未终止的字符串

编辑:

好吧,我确实误解了。通常,要格式化来自UI的输入,您将使用子类。这基本上可以让你把任何东西转换成字符串,然后再转换回来。它最常用于日期、数字、格式化字符串(如电话等),但它可以执行任何与字符串相关的转换或操作。在这种情况下,您需要一个格式化程序来自动转义用户输入字符串中的单引号。可能有人已经写过了

但我必须说我不认为这是个问题,因为:

  • NSString非常擅长处理引号。您甚至可以使用带有单个刻度的UTF8String,直接通过printf转储它,printf是出了名的对这类事情挑剔。我不确定事情的客观方面是否是问题所在
  • 我还没有发现任何其他提到这个问题的地方。SQL在iPhone和Mac上被广泛使用,如果appleapi无法解决一个非常常见的输入模式,我希望看到数百篇关于在SQL查询中处理胭脂引号的帖子

  • 我已经有一段时间没有研究过SQL了,所以我不能肯定地说问题出在哪里,但我不会把重点放在Objective-C方面

    在此上下文中,它不是撇号,而是编译器将其视为分隔字符串的单引号。由于您正在构建一个字符串以发送到SQL,因此未替换的单引号将破坏出现该字符串的位置

    在任何字符串上下文中都必须转义单引号和双引号字符。这适用于每种语言,而不仅仅是C语言变体

    见鬼,如果您使用语法着色,编辑器通常会显示您已将代码的一大块转换为未终止的字符串

    编辑:

    好吧,我确实误解了。通常,要格式化来自UI的输入,您将使用子类。这基本上可以让你把任何东西转换成字符串,然后再转换回来。它最常用于日期、数字、格式化字符串(如电话等),但它可以执行任何与字符串相关的转换或操作。在这种情况下,您需要一个格式化程序来自动转义用户输入字符串中的单引号。可能有人已经写过了

    但我必须说我不认为这是个问题,因为:

  • NSString非常擅长处理引号。您甚至可以使用带有单个刻度的UTF8String,直接通过printf转储它,printf是出了名的对这类事情挑剔。我不确定事情的客观方面是否是问题所在
  • 我还没有发现任何其他提到这个问题的地方。SQL在iPhone和Mac上被广泛使用,如果appleapi无法解决一个非常常见的输入模式,我希望看到数百篇关于在SQL查询中处理胭脂引号的帖子

  • 我已经有一段时间没有研究过SQL了,所以我不能肯定地说问题出在哪里,但我不会把重点放在Objective-C方面

    复制品?嗯,凯。。。我尝试了另一个问题的建议,将准备好的语句参数从?到“%@”,但现在我的测试失败了,因为有双引号,所以我似乎不得不手动逃避。。太差劲了,重复?嗯,凯。。。我尝试了另一个问题的建议,将准备好的语句参数从?到“%@”,但现在我的测试失败了,因为有双引号,所以我似乎不得不手动逃避。。我来自java,如果你使用一个准备好的语句,它会清理引用。我只是想知道是否有一种更优雅的方法来替代每个参数中的引号。我认为在变量名中加撇号,无论语言中是否存在保护措施,都近乎自杀。你只是在自找麻烦。我认为Java中的净化实际上来自IDE或预编译器。如果必须使用的单引号作为撇号,那么编写一个Xcode用户脚本来清理字符串就很简单了。嗯,我想你有点困惑,我不是说变量名中的引号,我是说可以包含引号或撇号的用户输入,当它们进入sql语句时,它们就像sql注入一样,我认为,通过使用预先准备好的语句,绑定会像我提到的java那样自动转义引号。我不打算发动一场激烈的战争或诸如此类的事情。我来自java,如果你使用一个预先准备好的语句,它会清理引用。我只是想知道是否有一种更优雅的方法来替代每个参数中的引号。我认为在变量名中加撇号,无论语言中是否存在保护措施,都近乎自杀。你只是在自找麻烦。我认为Java中的净化实际上来自IDE或预编译器。