Objective c 目标C:您是否必须在SQL的字符串中转义单引号?
我是一名iPhone开发者。我正在编写单元测试用例,其中一个测试用例检查应用程序是否接受要写入sqlite3数据库的UTF8字符串。我创建了一个测试用例来生成随机UTF8字符串,我可以看到失败的字符串,因为它们包含一个撇号('),我需要接受它 我正在向数据库中写入以下内容: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
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的输入,您将使用子类。这基本上可以让你把任何东西转换成字符串,然后再转换回来。它最常用于日期、数字、格式化字符串(如电话等),但它可以执行任何与字符串相关的转换或操作。在这种情况下,您需要一个格式化程序来自动转义用户输入字符串中的单引号。可能有人已经写过了 但我必须说我不认为这是个问题,因为:
我已经有一段时间没有研究过SQL了,所以我不能肯定地说问题出在哪里,但我不会把重点放在Objective-C方面 在此上下文中,它不是撇号,而是编译器将其视为分隔字符串的单引号。由于您正在构建一个字符串以发送到SQL,因此未替换的单引号将破坏出现该字符串的位置 在任何字符串上下文中都必须转义单引号和双引号字符。这适用于每种语言,而不仅仅是C语言变体 见鬼,如果您使用语法着色,编辑器通常会显示您已将代码的一大块转换为未终止的字符串 编辑: 好吧,我确实误解了。通常,要格式化来自UI的输入,您将使用子类。这基本上可以让你把任何东西转换成字符串,然后再转换回来。它最常用于日期、数字、格式化字符串(如电话等),但它可以执行任何与字符串相关的转换或操作。在这种情况下,您需要一个格式化程序来自动转义用户输入字符串中的单引号。可能有人已经写过了 但我必须说我不认为这是个问题,因为:
我已经有一段时间没有研究过SQL了,所以我不能肯定地说问题出在哪里,但我不会把重点放在Objective-C方面 复制品?嗯,凯。。。我尝试了另一个问题的建议,将准备好的语句参数从?到“%@”,但现在我的测试失败了,因为有双引号,所以我似乎不得不手动逃避。。太差劲了,重复?嗯,凯。。。我尝试了另一个问题的建议,将准备好的语句参数从?到“%@”,但现在我的测试失败了,因为有双引号,所以我似乎不得不手动逃避。。我来自java,如果你使用一个准备好的语句,它会清理引用。我只是想知道是否有一种更优雅的方法来替代每个参数中的引号。我认为在变量名中加撇号,无论语言中是否存在保护措施,都近乎自杀。你只是在自找麻烦。我认为Java中的净化实际上来自IDE或预编译器。如果必须使用的单引号作为撇号,那么编写一个Xcode用户脚本来清理字符串就很简单了。嗯,我想你有点困惑,我不是说变量名中的引号,我是说可以包含引号或撇号的用户输入,当它们进入sql语句时,它们就像sql注入一样,我认为,通过使用预先准备好的语句,绑定会像我提到的java那样自动转义引号。我不打算发动一场激烈的战争或诸如此类的事情。我来自java,如果你使用一个预先准备好的语句,它会清理引用。我只是想知道是否有一种更优雅的方法来替代每个参数中的引号。我认为在变量名中加撇号,无论语言中是否存在保护措施,都近乎自杀。你只是在自找麻烦。我认为Java中的净化实际上来自IDE或预编译器。