PHP / jQuery - 在Ajax调用中单引号加倍

时间:2013-08-01 13:35:29

标签: php jquery ajax quotes

我希望这不是重复,但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)端?提前谢谢!

2 个答案:

答案 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脚本来撤消设置完成的转义,因为用户无权更改配置设置。