Bezdepbonusu7Программирование: статьи и ответы

Вопрос

PHP/jQuery - одинарная кавычка удваивается при вызове Ajax

Автор вопроса: jwulfОтветов: 2

Надеюсь, это не дубликат, но все остальные проблемы с одиночной кавычкой в ​​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, я вижу, что параметр отправляется правильно только с одной одинарной кавычкой. Но ответ всегда содержит два из них, независимо от того, вывожу ли я (в части PHP в верхней части скрипта) в XML или через json_encode или просто эхо.

Что я уже пробовал:

  • используя encodeURI(($"#fooInput").val()) - без изменений
  • используя encodeURIComponent(($"#fooInput").val()) - без изменений
  • используя escape($("#fooInput").val()) - это выведет L%27eclisse

У кого-нибудь есть предложение, что я могу сделать? Либо на стороне клиента (javascript), либо на стороне сервера (php) сценария? Заранее спасибо!

  • Вы пробовали L\'eclisse из клиента, чтобы увидеть, что возвращается? Чтобы добиться этого, вам нужно избежать чего-то вроде этого var string = $("#fooInput").val().replace(/'/g, "\\'"); naththedeveloper 01.08.2013
  • @FDL, попробовал сейчас, результат: \''eclisse. jwulf 01.08.2013

phpjqueryajaxquotes

Ответы

Ответ 1 · рейтинг 1 · Orangepill

Всегда полезно при создании 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. Решение состояло в том, чтобы использовать пользовательский сценарий для отмены экранирования, выполненного параметром, поскольку у пользователя не было доступа для изменения параметров конфигурации.

Ответ 2 · рейтинг 3 · Elpy

Я просто скопировал/вставил ваш код, и он отлично работает.

Я думаю, вам следует проверить настройки PHP.ini и взглянуть на magic_quotes.

особенно:

; Используйте волшебные кавычки в стиле Sybase (экранируйте ' с помощью '' вместо \'). ; http://php.net/magic-quotes-sybase magic_quotes_sybase = Вкл.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы