我希望这不是重复,但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
div#fooResult包含在AJAX调用之后:
L''eclisse
所以不知何故,这个脚本用一个引用了两个单引号。用firebug检查,我看到参数只用一个引号正确发送。但是答案总是包含其中两个,无论我是以XML格式输出(在脚本顶部的PHP部分中),还是通过json_encode输出,或者只是一个普通的回声。
我已尝试过的内容:
encodeURI(($"#fooInput").val())
- 无变更encodeURIComponent(($"#fooInput").val())
- 无变更escape($("#fooInput").val())
- 这将输出L%27eclisse 有没有人有建议,我可能会做什么?在客户端(javascript)端或脚本的服务器(php)端?提前谢谢!
答案 0 :(得分:3)
我只是复制/粘贴你的代码,它工作得很好。
我认为您应该检查您的PHP.ini设置并查看magic_quotes。
特别是:
使用Sybase风格的魔术引号(使用''而不是''转义'。 ; http://php.net/magic-quotes-sybase magic_quotes_sybase =开启
答案 1 :(得分:1)
构建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。解决方法是使用userland脚本来撤消设置完成的转义,因为用户无权更改配置设置。