为啥我的单引号 (') 没有被编码?

Posted

技术标签:

【中文标题】为啥我的单引号 (\') 没有被编码?【英文标题】:Why is my single quotation mark (') not getting encoded?为什么我的单引号 (') 没有被编码? 【发布时间】:2014-10-28 04:35:43 【问题描述】:

我有以下代码将我的 UITextView 文本转换为编码的 NSString,我可以将其与其他内容一起插入到我的数据库中。插入工作得很好,除非有一个单引号......然后它不起作用。当我 NSLog 编码 NSString 时,' 甚至没有转换成任何东西。因此,当它执行 Web 服务器请求时,url 仍然在其中,这导致它失败......为什么单引号没有事先编码?这是我的代码(我也不是很擅长 php):

iOS:

NSString *encodedString = (NSString 
*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
  NULL, (CFStringRef)self.textView.text,     NULL,  (CFStringRef)@"!*'();:@&=+$,/?%#[]",      kCFStringEncodingUTF8 ));          
  NSString *strURL = [NSString stringWithFormat:@"http://example.org/postText.php?thePost=%@&byUserID=%@&nickname=%@", encodedString, [UniqueUserIdentification getUserID], nickname];

php:

<?php

$con=mysqli_connect("editout","editout","editout","editout");    
if (mysqli_connect_errno())

  echo "Failed to connect to MySQL: " . mysqli_connect_error();


$thePost = $_GET["thePost"];
$byUserID = $_GET["byUserID"];
$nickname = $_GET["nickname"];

mysqli_query($con,"INSERT INTO MyTable
VALUES ('$thePost', '$byUserID', '$nickname', 0, 0)");    
mysqli_close($con);

?>

【问题讨论】:

与其从 ios 应用程序进行验证,为什么不将其移至 PHP?您也应该准备/执行查询。 mysqli real escape string 尝试在我的 GET 之后添加它,但它仍然不起作用:$thePost = $mysqli->real_escape_string($thePost); 我明白了。谢谢!原来我没有正确更新 php 脚本,所以它甚至没有识别新脚本 XD 【参考方案1】:

您的 SQL 错误。

$thePost = $_GET["thePost"];

您将 GET 数据分配给 $thePost,但这是 url 解码的。

例如,$thePost 是“Let's go!”,所以你的 SQL 变成:

INSERT INTO MyTable
VALUES ('Let's go', '$byUserID', '$nickname', 0, 0)"

显然有语法错误。

您需要使用mysqli_real_escape_string 转义字符串。

看看this post。

【讨论】:

【参考方案2】:

在客户端,它编码为 ' %27,它是正确的。但是在服务端,你的sql用错了。urlencode

【讨论】:

urlencode 仅适用于 url。对于其他领域,它会造成混乱的局面。参数化查询是要走的路。 url 不是他插入的唯一字段。 你看到他的代码了吗,他也编码参数。使用编码结果发布到服务器。服务器代​​码错误。 ^他在服务器中收到错误。这告诉你什么? ' 在sql中,它有一定的含义,代表一个字符串引号。所以服务器可以获取值,但是代码:mysqli_query($con,"INSERT INTO MyTable VALUES('$thePost',' $byUserID', '$nickname', 0, 0)");错了。 打印那个 sql ,它可能像这样 INSERT INTO MyTable VALUES(''fdsaf','32','fdsa',0,0) ,它的值中有乘 ',所以数据库会说错。它应该转义 ' 在 sql 字符串中。

以上是关于为啥我的单引号 (') 没有被编码?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SQL 查询中的单引号会影响计算?

python脚本入参的单、双引号

如何阻止 Swift 在我的 [String] 中注入转义的单引号?

python中的单引号,双引号和三双引号的区别

Java Regex:查找带转义的单引号文本

从 shell 中转义 sqlite3 的单引号