Php iPhone中的特殊字符导致SQL中的POST错误

Php iPhone中的特殊字符导致SQL中的POST错误,php,iphone,mysql,Php,Iphone,Mysql,我有一个iPhone应用程序,它将用户输入的数据提交到SQL数据库。它会导致错误,当使用特殊字符时,会切断数据或输入“null”。似乎撇号、问号和句号都可以,但任何超出这一范围的东西都会导致它切断帖子或根本不发布任何内容 我插入数据的SQL查询如下: mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(

我有一个iPhone应用程序,它将用户输入的数据提交到SQL数据库。它会导致错误,当使用特殊字符时,会切断数据或输入“null”。似乎撇号、问号和句号都可以,但任何超出这一范围的东西都会导致它切断帖子或根本不发布任何内容

我插入数据的SQL查询如下:

mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(), '$cat', '$sub', '$body');");
数据库中的字段类型是varchar(8000)。所以,有足够的空间,我知道它不会因为角色的限制而被切断。我使用的排序规则是“拉丁语-瑞典语-ci”

编辑:我再次测试。在发布到SQL数据库时,正是“&”切断了字符串。如果我从phpMyAdmin手动插入,我可以毫无问题地插入字符串“测试并查看是否有效”

iPhone代码:

[p setObject:[NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://website.com/script.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",[[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],[[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],sport,@"",[[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]] forKey:@"q"];
此外:

如果我手动插入带有符号(&)的字符串,它将出现在iPhone应用程序中。只是在发布功能上,它不起作用

2010年10月8日3:20增加:
我已经做了一些额外的测试,插入查询工作正常。我创建了一个单独的脚本,从HTML页面获取输入的数据,并插入了带有“&”符号的脚本。似乎我需要看看iPhone是如何抓取字符串并传递到PHP脚本的。

在将数据发送到服务器之前尝试对数据进行URL编码,并分别对响应进行解码。NSString有相应的方法。

尝试在将数据发送到服务器之前对数据进行URL编码,并分别对响应进行解码。NSString有用于此的方法。

使用转义数据。作为一个丑陋但快速的解决方案,这看起来像

$cat = mysql_real_escape_string($cat);
$sub = mysql_real_escape_string($sub);
$body = mysql_real_escape_string($body);
mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(), '$cat', '$sub', '$body');");
你的特殊角色有多特别?如果它们是Unicode,您可能需要
设置名称UTF8
,如中所述。

使用转义数据。作为一个丑陋但快速的解决方案,这看起来像

$cat = mysql_real_escape_string($cat);
$sub = mysql_real_escape_string($sub);
$body = mysql_real_escape_string($body);
mysql_query("INSERT INTO tblQA (intResponseID, intPosterID, dPostDateTime, cCategory, cSubject, cBody) VALUES ($id, $u, NOW(), '$cat', '$sub', '$body');");

你的特殊角色有多特别?如果它们是Unicode,您可能需要
设置名称UTF8
,如中所述。

不要通过字符串连接用户提供的数据来构建SQL查询。使用绑定参数(像PDO和ADODB这样的数据库抽象层在PHP中提供了这一点)。

不要通过字符串连接用户提供的数据来构建SQL查询。使用绑定参数(像PDO和ADODB这样的数据库抽象层在PHP中提供了这一点)。

是“&”字符切断了post“mysql\u real\u escape\u string”似乎根本不允许post发生$body=mysql\u real\u escape\u字符串(“'”,“`”,@$\u请求['body']);您使用的函数不正确。删除前两个参数:
$body=mysql\u real\u escape\u string(@$\u REQUEST['body'])谢谢MvanGeest,但它仍在切断字符串。那么,如果我键入“Testing&testingtheapp”,它会将“Testing”插入到SQL数据库中,您是否尝试过以某种方式调试它
print\r
将其打印到页面,或者如果PHP不生成输出,则打印某种错误日志?错误可能来自应用程序本身(见tob的答案)。是“&”字符切断了帖子。“mysql\u real\u escape\u string”似乎根本不允许帖子发生$body=mysql\u real\u escape\u字符串(“'”,“`”,@$\u请求['body']);您使用的函数不正确。删除前两个参数:
$body=mysql\u real\u escape\u string(@$\u REQUEST['body'])谢谢MvanGeest,但它仍在切断字符串。那么,如果我键入“Testing&testingtheapp”,它会将“Testing”插入到SQL数据库中,您是否尝试过以某种方式调试它
print\r
将其打印到页面,或者如果PHP不生成输出,则打印某种错误日志?错误可能来自应用程序本身(参见tob的答案)。tob,谢谢。我目前正在使用NSURL URLWithString。我编辑了我的原始帖子,也加入了我的iPhone代码。tob,谢谢。我目前正在使用NSURL URLWithString。我编辑了我的原始帖子,也加入了我的iPhone代码。安德鲁,你能帮我举个例子吗?我该如何改变?安德鲁,你能举个例子帮我吗?我该如何改变?