【问题标题】:special characters from iPhone causing POST error in SQL来自 iPhone 的特殊字符导致 SQL 中的 POST 错误
【发布时间】:2011-03-27 21:50:26
【问题描述】:

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

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

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

数据库中的字段类型是 varchar(8000)。所以,有足够的空间,我知道它不会因为字符的限制而被切断。我使用的排序规则是“latin1_swedish_ci”

编辑:我再次测试。当发布到 SQL 数据库时,它是切断字符串的“&”。如果我从 phpMyAdmin 手动插入,我可以毫无问题地插入字符串“Testing & Seeing if this works”。

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 应用程序中。只是发帖功能不行。

添加 3:20p 8/10/10: 我已经做了一些额外的测试,并且 INSERT 查询工作正常。我创建了一个单独的脚本来从 HTML 页面获取输入的数据,并在其中插入“&”符号就可以了。看来我需要看看 iPhone 正在抓取什么作为字符串并传递给 PHP 脚本。

【问题讨论】:

    标签: php iphone mysql


    【解决方案1】:

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

    $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,您可能需要 SET NAMES UTF8,如 How can I store Unicode in MySQL? 中所述。

    【讨论】:

    • 它的“&”字符切断了帖子
    • “mysql_real_escape_string”似乎根本不允许发帖。 $body = mysql_real_escape_string("'", "`", @$_REQUEST['body']);
    • 您使用的功能不正确。删除前两个参数:$body = mysql_real_escape_string(@$_REQUEST['body']);
    • 感谢 MvanGeest,但它仍在切断字符串。因此,如果我输入“测试和测试应用程序”,它会将“测试”插入 SQL 数据库
    • 您是否尝试过以某种方式对其进行调试? print_r 将其打印到页面上,或者如果 PHP 不产生输出,则打印出某种错误日志?错误可能来自应用程序本身(参见 tob 的回答)。
    【解决方案2】:

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

    【讨论】:

    • 托布,谢谢。我目前正在使用 NSURL URLWithString。我编辑了我的原始帖子以包含我的 iPhone 代码。
    【解决方案3】:

    不要通过字符串连接用户提供的数据来构建 SQL 查询。使用绑定参数(如 PDO 和 ADODB 等数据库抽象层在 PHP 中提供此功能)。

    【讨论】:

    • 安德鲁,你能帮我举个例子吗?我将如何进行此更改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-03-06
    • 2017-03-15
    相关资源
    最近更新 更多