Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 13.08.2019, 10:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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. РНР при разборе принятых данных и сам сделает преобразование типов, если число будет числом, а не "числом", заниматься этим на клиенте нет смысла, вы все равно вынуждены проверить тип/преобразовать и проверить.

Последний раз редактировалось laimas, 13.08.2019 в 11:19.
Ответить с цитированием
  #22 (permalink)  
Старый 13.08.2019, 12:38
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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
Ответить с цитированием
  #23 (permalink)  
Старый 13.08.2019, 12:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

У вас в РНР коде куча дублированной писанины.
Ответить с цитированием
  #24 (permalink)  
Старый 14.08.2019, 00:12
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от _marisha
[place_id] => NaN
На клиенте проблему решите.
Ответить с цитированием
  #25 (permalink)  
Старый 14.08.2019, 07:57
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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

Тогда в консоли ошибок нет.
Подскажите, а как можно оба поля поместить в одну переменную (например в val)?
Ответить с цитированием
  #26 (permalink)  
Старый 14.08.2019, 08:09
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от _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. Вы шлете на сервер непотребное и при этом удаляете на нем проверку. Логика странная, тем более что странности есть и вообще в логике приема/ответа.

Последний раз редактировалось laimas, 14.08.2019 в 09:16.
Ответить с цитированием
  #27 (permalink)  
Старый 14.08.2019, 13:27
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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');
          }
        });
      }
		});
	}

Явно что-то делаю не так...
Ответить с цитированием
  #28 (permalink)  
Старый 14.08.2019, 13:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от _marisha
'place_id[]': name, 'place_id[]': val
Так нельзя передать объектом, на сервере будет получено только последнее значение, ибо не могут быть в объекте два одинаковых свойства, как и два одинаковых ключа в массиве. Вот так:

data: 'action=setPlace&place_id[]='+val+'&place_id[]='+val1
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Валидация веб формы giovanni Events/DOM/Window 3 01.09.2017 15:49
ajax передача отдельной переменной и формы dmitriy94 AJAX и COMET 16 16.01.2015 23:33
Четыре одинаковые формы на странице с разной версткой varanika jQuery 2 19.10.2014 13:14
проверка формы не работает в ie begelme Javascript под браузер 6 13.08.2013 01:00
Результаты проверки сервером формы ekkl jQuery 3 30.01.2010 14:29