Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Результаты формы (https://javascript.ru/forum/misc/78225-rezultaty-formy.html)

laimas 13.08.2019 10:37

У вас вообще серверный код странный, если не сказать более. Допустим, что это

if (isset($_POST['place_id']) && intval($_POST['place_id'])){
     FavPlaces::setFavs(intval($_POST['place_id']), 'UF_FAV_PLACE');
}


еще можно трактовать как запрос без ответа, то есть что-то сделать на сервере по запросу клиента и все, а далее все ответы. Но тогда (JSON.parse на клиенте в этом случае не нужен, но нужно учесть как действует JQ при разборе json):

if (isset($_POST['action'])){
    $id = (int)$_POST['place_id']; $data = null;
    switch($_POST['action']){
        case 'setfavplace':
            if ($id) FavPlaces::setFavs($id, 'UF_FAV_PLACE');
            break;
        case 'getfavplace': $data = FavPlaces::getFavs();
            break;
        case 'setPlace':
            if ($id) $data = FavPlaces::setPlace($id);
            break;
        case 'getPlace': $data = FavPlaces::getPlace();
    }
    
    header('Content-type: application/json');
    exit(json_encode($data));
}


Если при этом данные корректны, а значит и ошибок в JSON не будет (собственно в этом случае ошибка была бы уже на сервере). У вас же ошибка указывает на то, что данные json при декодировании неожиданно закончились. Проверить нужно по самое не хочу ответ сервера.

PS. РНР при разборе принятых данных и сам сделает преобразование типов, если число будет числом, а не "числом", заниматься этим на клиенте нет смысла, вы все равно вынуждены проверить тип/преобразовать и проверить.

_marisha 13.08.2019 12:38

laimas, если в файле actions.php сделать так
if (isset($_POST['action']))
{
    switch ($_POST['action'])
    {
        case 'setfavplace':
            if (isset($_POST['place_id']))
            {
                FavPlaces::setFavs($_POST['place_id'], 'UF_FAV_PLACE');
            }
            break;
        case 'getfavplace':
            echo json_encode(FavPlaces::getFavs());
            break;

        case 'setPlace':
            if (isset($_POST['place_id']))
            {
                echo json_encode(FavPlaces::setPlace($_POST['place_id']));
                echo "<pre>" .print_r($_POST,1)."</pre>";
            }
            break;
        case 'getPlace':
            echo json_encode(FavPlaces::getPlace());
            break;
    }
}

Тогда при клике на кнопку "Выбрать" в консоли ошибка "Unexpected token < in JSON at position 4"
Результат:
[action] => setPlace
[place_id] => NaN

laimas 13.08.2019 12:43

Цитата:

Сообщение от _marisha
если в файле actions.php сделать так

Так делать нет смысла, ибо до и после передачи json никакого вывода в браузер не должно быть, иначе вы и получаете такую ошибку. Ошибка же до этого иная, и словно у вас идет поток данных, а потом бабах и EOF.

У вас в РНР коде куча дублированной писанины.

laimas 14.08.2019 00:12

Цитата:

Сообщение от _marisha
[place_id] => NaN

На клиенте проблему решите.

_marisha 14.08.2019 07:57

laimas, если сделать так:
let val = $('.place_sections_block input[name="fio"]').val();
let val1 = $('.place_elements input[name="city"]').val();

Тогда в консоли ошибок нет.
Подскажите, а как можно оба поля поместить в одну переменную (например в val)?

laimas 14.08.2019 08:09

Цитата:

Сообщение от _marisha
Подскажите, а как можно оба поля поместить в одну переменную

В каком смысле одну: если объединить в строку, то это плохо, если передать под одним ключом массив, это можно. Если массив, то это можно сделать двояко:
1) именовать ключ как элемент массива, то есть - data: 'action=setPlace&place_id[]='+val+'&place_id[]='+val1
2) передать под одним ключом как json, то есть - data: {action: 'setPlace', place_id: JSON.stringify(arr)}, где arr массив значений (можно и ручками прописать json для двух значений)

На сервере в первом случае под ключом place_id будет массив из двух значений, во втором случае json, который декодировать и получить массив.

PS. Вы шлете на сервер непотребное и при этом удаляете на нем проверку. Логика странная, тем более что странности есть и вообще в логике приема/ответа.

_marisha 14.08.2019 13:27

laimas,
$(document).ready(function(){
  $('.place_sections').on('change', function(){
    var val = $(this).val();
  });

  $('.placeChoose').on('click', function(){
    let name = $('.place_sections_block input[name="name"]').val();
    let val = $('.place_elements input[name="city"]').val();
    $.ajax({
      type: 'POST',
      url: '/ajax/actions.php',
        data: {action: 'setPlace', 'place_id[]': name, 'place_id[]': val},
      success: function(data){
        var result = JSON.parse(data);
          console.log(data);//true
        if (result){
          whenPlaceChoosen(name); //custom.js
        }
      }
    })
  });
});

В консоли отображаются результаты заполненных полей, но после нажатия на "Выбрать" в файле custom.js console.log(data) приходит значение ["226"]. Хотя в поля вводились значения "ФИО" и "Город"
window.getFavPlaces = function(){
		ajaxAction({action:'getfavplace'}, function(data){
            console.log(data);// приходит 226
			data = JSON.parse(data);

      if (Array.isArray.call(null, data)) {
        data.forEach(function(item){
          if ($('.js_favorite.js_favin[data-id_place=' + item + ']').length){
            $('.js_favorite.js_favin[data-id_place=' + item + ']').addClass('active');
            $('.js_favorite.js_favto[data-id_place=' + item + ']').removeClass('active');
          }
        });
      }
		});
	}

Явно что-то делаю не так...

laimas 14.08.2019 13:43

Цитата:

Сообщение от _marisha
'place_id[]': name, 'place_id[]': val

Так нельзя передать объектом, на сервере будет получено только последнее значение, ибо не могут быть в объекте два одинаковых свойства, как и два одинаковых ключа в массиве. Вот так:

data: 'action=setPlace&place_id[]='+val+'&place_id[]='+val1


Часовой пояс GMT +3, время: 07:06.