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

Надеюсь, это не дубликат, но все остальные проблемы с одиночной кавычкой в ​​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) сценария? Заранее спасибо!


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


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

person Orangepill    schedule 01.08.2013
comment
Большое спасибо за подсказку, буду иметь в виду! К сожалению, проблема осталась... :/ - person jwulf; 01.08.2013
comment
Я не могу воспроизвести проблему с приведенным выше кодом. Одна вещь, которая может сбить вас с толку, — это настройки php magic_quotes. см. здесь для получения дополнительной информации. - person Orangepill; 01.08.2013
comment
Эта страница мне очень помогла, спасибо! Так как, к сожалению, я не могу получить доступ к php.ini, и решение htaccess там не работает, мне пришлось использовать решение из Примера № 2 (описано как очень неэффективное...) Так что оно работает, спасибо! - person jwulf; 01.08.2013
comment
Решение (по крайней мере, для меня) во втором комментарии к этому ответу. - person jwulf; 01.08.2013

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

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

особенно:

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

person Elpy    schedule 01.08.2013
comment
Похоже, это наиболее вероятная причина. - person Orangepill; 01.08.2013
comment
Спасибо за этот вклад! К сожалению, у меня нет доступа к php.ini :/ но с помощью phpinfo() я обнаружил следующее: magic_quotes_gpc On On magic_quotes_runtime Off Off magic_quotes_sybase On On Итак, magic_quotes_sybase, кажется, включен... - person jwulf; 01.08.2013
comment
возможно, вы могли бы попробовать решение, указанное в примере № 2, здесь: php.net/manual /en/security.magicquotes.disabling.php - person Elpy; 01.08.2013
comment
@Elpy да, это именно то, что помогло мне увидеть ниже, Orangepill направил меня на ту же страницу, но все равно спасибо! Хм .. Я здесь новенький, есть ли способ пометить этот вопрос как решенный? - person jwulf; 01.08.2013