3

我希望这不是重复的,但是 jQuery-Ajax-calls 中单引号的所有其他问题都是关于错误,而不是我在这里观察到的。

我有一个 jQuery-Ajax 调用的问题,它在发送的参数中包含一个单引号 - 这些在服务器端总是加倍!我写了一个包含前端和后端的小操场脚本来显示问题:

游乐场.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

所以不知何故,脚本从一个中提取了两个单引号。用萤火虫检查,我看到参数只用一个单引号正确发送。但答案总是包含其中两个,无论我是输出(在脚本顶部的 PHP 部分)还是通过 json_encode 或简单的回显。

我已经尝试过的:

  • 使用encodeURI(($"#fooInput").val())- 没有变化
  • 使用encodeURIComponent(($"#fooInput").val())- 没有变化
  • 使用escape($("#fooInput").val())- 这将输出 L%27eclisse

有没有人有建议,我可以做什么?是在客户端(javascript)端还是在脚本的服务器(php)端?提前致谢!

4

2 回答 2

3

我只是复制/粘贴了你的代码,它工作得很好。

我认为您应该检查您的 PHP.ini 设置并查看 magic_quotes。

尤其是:

; 使用 Sybase 风格的魔术引号(使用 '' 而不是 \' 转义 ')。; http://php.net/magic-quotes-sybase magic_quotes_sybase = 开启

于 2013-08-01T14:36:29.953 回答
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。解决方案是使用用户级脚本来撤消设置所做的转义,因为用户无权更改配置设置。

于 2013-08-01T13:53:11.000 回答