За последние 24 часа нас посетили 27023 программиста и 1508 роботов. Сейчас ищут 894 программиста ...

js-encodeURIComponent и php-json_decode

Тема в разделе "PHP для новичков", создана пользователем osi322, 27 апр 2016.

  1. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    Есть форма с различным набором input,textarea которые собираются в массив следующим образом:
    Код (Javascript):
    1. var mas=new Array();
    2. //собираем данные полей по классу
    3.     $('.pole_dan').each(function(i,elem) {
    4.         var pos=new Array();
    5.         //записываем имя поля и его значение
    6.         pos.push($(this).attr("name"),encodeURIComponent($(this).val()));
    7.         mas.push(pos);
    8.         //проверка что поле не заполнено
    9.         if ($(this).val()=='' || $(this).val()==null ) {
    10.             error=error+"Не заполнено поле:"+$(this).parent().parent().find('td.nn').html()+"\n";
    11.         }
    12.     });
    Далее отправляется все это ajax
    Код (Javascript):
    1. data: ... +'&dan_pol='+JSON.stringify(mas).....
    В PHP декодируется
    PHP:
    1. $dan_pol=json_decode($_POST['dan_pol']);
    И вот тут проблема! Если была форма textarea с переходом новой строки ответ будет
    PHP:
    1. echo var_dump($_POST['dan_pol']);
    2. /*string(206) "[....["col0","asd
    3. asd
    4. zxc"]]"*/
    5. echo var_dump(json_decode($_POST['dan_pol']));
    6. //NULL
    Я так понял json_decode не работает с переходами новых строк, что подскажите и как с этим бороться?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нужно экранировать спецсимволы. таково требование формата json. превращайте перенос строки в \r\n
     
    osi322 нравится это.
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а откуда они там берутся, если JSON.stringify() используется?
     
  4. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    Нашел на просторах это
    Код (Javascript):
    1. RegExp.escape = function(text) {
    2.     return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    3. }
    Получается одна строка, но тоже в ответе null
    PHP:
    1. echo var_dump($_POST['dan_pol']);
    2. /*string(206) "[....["col0","беспроводная\\ мышь\\\nфывфы\\\nвапвап"]]"*/
    --- Добавлено ---
    Сам не знаю.. разбираюсь, так var_dump выдает
    --- Добавлено ---
    А нет работает только теперь везде флеши..причем при каждом обновлении запроса они увеличиваются в количествах)) в общем нужно регулярку написать, всем спасибо!
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а где написано что stringify() обрабатывает дополнительно спецсимволы?
     
  6. osi322

    osi322 Активный пользователь

    С нами с:
    21 май 2015
    Сообщения:
    19
    Симпатии:
    0
    Использовал следующую проверку
    Код (Javascript):
    1. RegExp.escape = function(text) {
    2.     return text.replace(/\n/g, "\\n");
    3. }
    и все ОК.

    Оказывается проблема была в функции encodeURIComponent.
    Без нее конвертация stringify() и декодирование json_decode, проходит на ура, а если перед этим конвертировать данные полученные с помощью функции encodeURIComponent то работает странно и нужно самому экранировать переход строки до функции encodeURIComponent..
    --- Добавлено ---
    Спасибо за наводку, так бы голову ломал в чем проблема!