Параметр с '&' нарушает запрос $ .ajax - PullRequest
3 голосов
/ 18 ноября 2011

Я разрабатываю веб-приложение, которое использует JavaScript + JQuery на стороне клиента и PHP на стороне сервера.

Одна из строк, которые я хочу передать в качестве параметра для запроса AJAX, имеет '&'в его содержании.

По этой причине строка запроса нарушена.Браузер «думает», что этот параметр исчерпан, потому что в строке есть «&».

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";
var dataString = "first=" + hasChar + "&second=" + doesntHave;

$.ajax({
    type : "POST",
    url : "myurl.php",
    data : dataString,
    cache : false,
    success : function(html) {
    }
});

Сервер получает первый параметр как «Это строка, которая имеет»

Мой вопрос:

Как кодировать строку на стороне клиента и как ее декодировать на PHP-сервере.

Ответы [ 9 ]

8 голосов
/ 18 ноября 2011

Пусть jQuery обрабатывает кодировку hasChar (и другие ваши параметры) для вас:

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";

$.ajax({
    type : "POST",
    url : "myurl.php",
    data : { first: hasChar, second: doesntHave },
    cache : false,
    success : function(html) {
    }
});
7 голосов
/ 18 ноября 2011

Почему бы не сделать следующее:

    $.ajax({
        type : "POST",
        url : "myurl.php",
        data : {
          'first': hasChar,
          'second': doesntHave
        },
        cache : false,
        success : function(html) {
        }
    });

В этом случае jQuery обеспечит правильное кодирование строки.

В качестве альтернативы вы можете использовать встроенную функцию encodeURIComponent () JSдля правильного кодирования строк:

var dataString = "first=" + encodeURIComponent(hasChar) + "&second=" + encodeURIComponent(doesntHave);
5 голосов
/ 18 ноября 2011

Вы можете использовать .param;

dataString = $.param({first: asChar, second: doesntHave});
1 голос
/ 18 ноября 2011

Вы также можете использовать encodeURI:

var encodedData = encodeURI(dataString);
$.ajax({
    type : "POST",
    url : "myurl.php",
    data : encodedData,
    cache : false,
    success : function(html) {
    }
});

Ссылка

1 голос
/ 18 ноября 2011

Вы можете просто установить его как объект:

var hasChar = "This is a string that has a & in the content.";
var doesntHave = "This one does not contain.";

$.ajax({
    type : "POST",
    url : "myurl.php",
    data : {first: hasChar, second: doesntHave},
    cache : false,
    success : function(html) {
    }
});
1 голос
/ 18 ноября 2011

или если вы хотите пропустить часть $.param, как указано @ alex-k

data : {'first': hasChar, 'second': doesntHave},
0 голосов
/ 18 ноября 2011

Ваши параметры должны быть просто в URL-кодировке.На стороне PHP вам не нужно будет их декодировать, все будет работать как обычно.

Существует функция Javascript с именем encodeURIComponent(), которая будет корректно кодировать URL-адрес вашей строки.Итак, на базовом уровне вы можете сделать это:

var dataString = "first=" + encodeURIComponent(hasChar) + "&second=" + encodeURIComponent(doesntHave);

Если вы используете jQuery, он автоматически обработает это для вас, если в вашем вызове $ .ajax () вы передадите ему объектвместо строки запроса :

Параметр данных может содержать либо строку запроса формы key1 = value1 & key2 = value2, либо карту вида {key1: 'value1', key2: 'value2'}.Если используется последняя форма, данные перед отправкой преобразуются в строку запроса с помощью jQuery.param ().

Таким образом, вы должны сделать это только в своем коде:

var dataString = { first: hasChar, second: doesntHave);
0 голосов
/ 18 ноября 2011

Попробуйте это

var dataString = {};
dataString["hasChar"] = "This is a string that has a & in the content.";
dataString["doesntHave"] = "This one does not contain.";

$.ajax({
    type : "POST",
    url : "myurl.php",
    data : dataString,
    cache : false,
    success : function(html) {
    }
});
0 голосов
/ 18 ноября 2011

Если вы хотите де / кодирование на стороне сервера, используйте urlencode() и urldecode().

...