PHP / jQuery - Ajax 调用中的单引号加倍
Posted
技术标签:
【中文标题】PHP / jQuery - Ajax 调用中的单引号加倍【英文标题】:PHP / jQuery - single quote doubled in Ajax call 【发布时间】:2013-08-02 11:12:07 【问题描述】:我希望这不是重复的,但是 jQuery-Ajax 调用中单引号的所有其他问题都是关于错误,而不是我在这里观察到的。
我有一个 jQuery-Ajax 调用的问题,它在发送的参数中包含一个单引号 - 这些在服务器端总是加倍!我写了一个包含前端和后端的小操场脚本来显示问题:
playground.php
<?php
if(isset($_REQUEST["foo"])) ?>
<root>
<fooVal>
<?php echo $_REQUEST["foo"]; ?>
</fooVal>
</root>
<?php
die;
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script>
function testSend()
$.ajax(
type: "get",
url: "playground.php",
data: "foo" : $("#fooInput").val(),
success: function(data)
$("#fooResult").text($(data).find("fooVal").text());
);
</script>
</head>
<body>
<input type="text" id="fooInput" />
<a href="javascript:testSend()">send</a>
<div id="fooResult"></div>
</body>
</html>
如果我输入输入字段例如:
L'eclisse
AJAX 调用后的 div#fooResult 包含:
L''eclisse
所以不知何故,脚本从一个单引号中提取了两个单引号。用萤火虫检查,我看到参数只用一个单引号正确发送。但答案总是包含其中两个,无论我是输出(在脚本顶部的 PHP 部分)还是通过 json_encode 或简单的回显。
我已经尝试过的:
使用encodeURI(($"#fooInput").val())
- 没有变化
使用encodeURIComponent(($"#fooInput").val())
- 没有变化
使用escape($("#fooInput").val())
- 这将输出 L%27eclisse
有没有人有建议,我可以做什么?是在客户端(javascript)端还是在脚本的服务器(php)端?提前致谢!
【问题讨论】:
您是否尝试过来自客户端的L\'eclisse
以查看返回的内容?为了实现这一点,你需要像这样var string = $("#fooInput").val().replace(/'/g, "\\'");
来逃避它
@FDL ,现在试了一下,结果是:\''eclisse
。
【参考方案1】:
我只是复制/粘贴了您的代码,它工作得很好。
我认为您应该检查您的 PHP.ini 设置并查看 magic_quotes。
特别是:
;使用 Sybase 风格的魔术引号(使用 '' 而不是 \' 转义 ')。 ; http://php.net/magic-quotes-sybase magic_quotes_sybase = 开启
【讨论】:
这似乎是最可能的原因。 感谢您的意见!不幸的是,我无法访问 php.ini :/ 但是使用 phpinfo() 我发现了以下内容: magic_quotes_gpc On On magic_quotes_runtime Off Off magic_quotes_sybase On On 所以 magic_quotes_sybase 似乎打开了...... 也许您可以尝试此处示例 #2 中列出的解决方案:php.net/manual/en/security.magicquotes.disabling.php @Elpy 是的,这正是帮助我看到下面的原因,Orangepill 将我引导到同一页面,但无论如何感谢!嗯..我是新来的,有什么办法可以将这个问题标记为已解决?【参考方案2】:在构建 xml 文档以使用 xml 库来确保所有内容都被正确编码时,这总是一个好主意。
$doc = new DomDocument("1.0", "UTF-8");
$foo = $doc->createElement("fooVal", $_REQUEST["foo"]);
$root = $doc->createElement("root");
$root->appendChild($foo);
$doc->appendChild($root);
echo $doc->saveXML();
更新:最终问题是启用了magic_quotes。解决方法是使用用户空间脚本撤消设置所做的转义,因为用户无权更改配置设置。
【讨论】:
非常感谢您的提示,我会记住的!不幸的是,问题仍然存在......:/ 我无法用上面的代码重现问题。可能让你绊倒的一件事是 php magic_quotes 设置。请参阅here 了解更多信息。 那个页面对我帮助很大,谢谢!由于不幸的是我无法访问 php.ini,那里的 htaccess 解决方案也不起作用,我不得不使用示例 #2 下的解决方案(被描述为非常低效......)所以它可以工作,谢谢! 对此答案的第二条评论中的解决方案(至少对我而言)。以上是关于PHP / jQuery - Ajax 调用中的单引号加倍的主要内容,如果未能解决你的问题,请参考以下文章