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 调用中的单引号加倍的主要内容,如果未能解决你的问题,请参考以下文章

PHP中运用jQuery的Ajax跨域调用实现代码

如何使用 AJAX/JQuery 调用多个 PHP 脚本?

jquery ajax php 调用方法!

php+jquery+ajax简单Ajax调用示例 (转)

PHP & jQuery ajax 调用无需等待响应

如何使用 jquery ajax 调用来调用 php 函数? [复制]