<body> <div> <?= $_POST['msg'] ?> </div> <form id="frm" method="post"> <input type="hidden" name='msg' value='{"field0": "Im a string", "field1": 84, "field3": "so am I"}' /> <input type="submit" value="test" /> </form> </body>
Когда форма отправляется, следующая строка отображается между тегами div.
{\ "field0 \": \ "Im строка \", \ "field1 \": 84, \ "field3 \": \ "so am I \"}
Почему добавляются escape-символы? Добавляются ли они сервером PHP или веб-клиентом? Могу ли я сделать что-нибудь, чтобы предотвратить это?
Кто-то уже упоминал функции stripslashes PHP. Я использую его сейчас, но я хочу избавиться от косых черт.
Проверьте, активирована ли ваша настройка PHP magic_quotes_gpc
, в этом случае сервер PHP автоматически добавляет косые черты в значения GET / POST / cookie …
Я считаю, что проблема заключается лишь в том, чтобы ускользнуть от инструментов, которые вы используете для вывода строки. Например:
var msg = dojo.toJson({field1: 'string', field2: 84, field3: 'another string'}); alert(msg);
покажет двойные кавычки как неизолированные. Аналогичным образом, запустив первый пример, когда браузер подключен к прокси-серверу, например, Charles, он показывает двойные qoutes как unescaped.
Поэтому я считаю, что это просто авто-побег, который Firebug / PHP делает, когда вы показываете строки.
Если информация правильная, когда она покидает клиента, то додзё должен делать какое-то волшебство перед отправкой информации в $ _POST, нет? Существуют ли какие-либо флаги, которые вы можете установить для метода dojo.toJson (), который позволит вам контролировать уровень манипуляции / экранирования входных строк? Если нет, я думаю, что использование stripslashes () (или что-то еще, в зависимости от того, где эта информация направляется) является единственным ответом.
проверьте, включены ли магические кавычки на вашем хосте
Скорее всего, вы включили hav magic_quotes_gpc на своем сервере. Этот параметр конфигурации и функция устарели в php5.3. Пока вы не обновите:
if (get_magic_quotes_gpc()) { set_magic_quotes_runtime(0); foreach (array('POST', 'GET', 'REQUEST', 'COOKIE') as $gpc) $GLOBALS["_$gpc"] = array_map('dequote', $GLOBALS["_$gpc"]); } function dequote($v) { return is_array($v) ? array_map('dequote', $v) : stripslashes($v); }
Вышеупомянутое решение основано на чей-то код, который я нашел где-то несколько лет назад.