За последние 24 часа нас посетили 22211 программистов и 1685 роботов. Сейчас ищут 1645 программистов ...

Ajax.Request & Php

Тема в разделе "JavaScript и AJAX", создана пользователем dedulka, 30 июн 2014.

  1. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Добрый день. Есть функция с ajax
    После вызова функции в пхп, через json должна отдаваться обратно в js переменная. Но содержимое l_res.kpparam = nullю
    В чем ошибка может быть?

    Код (Text):
    1. new Ajax.Request(g_path+c_Kp_ScriptFileName,
    2.  
    3. {
    4.             parameters:  {
    5.                 '_func': 'UserDepartment',
    6.                 '_p_user_id': taskid
    7.             },
    8.         onSuccess: function(transport) {
    9.                 var l_res = transport.responseText.evalJSON();
    10.                 wnd_alert(l_res.kpparam);
    11.                     }  
    12.         }
    13.         )
    Код (Text):
    1. function UserDepartmen($p_user_id) {
    2.     $con = GetConnection();
    3.     $sql = $con->prepare("select * from table where id=:userid");
    4.     $sql->execute(array(":userid" => $p_user_id));
    5.     $array = current($sql->fetchAll(PDO::FETCH_ASSOC));
    6.     return $array;
    7. echo json_encode($array);
    8.     }
     
  2. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    А вот так?
    Код (Text):
    1.  
    2. alert(l_res[0].kpparam);
    А вообще, если пользуешься хромом, то открываешь в панельке разработчика вкладку Network, там смотри свой запрос. Нажми на нужную страницу и перейди по вкладке "Превью". Там можешь увидеть свой объект.
     
  3. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Спасибки. Получил все в js. Но теперь проблема другая.
    Вот тут
    Код (Text):
    1. onSuccess: function(transport) {
    2.             var l_res = transport.responseText.evalJSON();
    3.            var newkpst=l_res['kpstatus'];
    4.                }
    я получаю нормально переменную. А как передать переменную за функцию?
    За функцией newkpst все равно пустое, даже если глобальную переменную определять или через return.
     
  4. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    потому что область видимости в js такая. Тебе нужно где-то за пределами ajax объявить
    Код (Text):
    1.  
    2. var newkpst;
    А в самом запросе:
    Код (Text):
    1.  
    2. onSuccess: function(transport) {
    3.             var l_res = transport.responseText.evalJSON();
    4.             newkpst=l_res['kpstatus'];
    5.                }
     
  5. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Так и делал. В самом начале js , перед всеми функциями и т.д. в глобальных переменных. Не помогло
     
  6. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Да не нужно в глобальных, можно и в локальных. Ты уверен, что не присваивается? Попробуй в консоль вывести после присваивания.
    Код (Text):
    1.  
    2. onSuccess: function(transport) {
    3.             var l_res = transport.responseText.evalJSON();
    4.             newkpst=l_res['kpstatus'];
    5.             console.log(newkpst);
    6.                }
     
  7. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Если внутри функции, то присваивается
    А вот вне уже нет. Вот отбивка с консоли
    Uncaught ReferenceError: newkpst is not defined
     
  8. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Смотри...

    Код (Text):
    1.  
    2. var newkpst;
    3.  
    4. function requestTo() {
    5.     bla-bla-bla,
    6.     onSuccess: function() {
    7.         var l_res = transport.responseText.evalJSON();
    8.         newkpst = l_res['kpstatus'];
    9.     }
    10. }
    11.  
    12. console.log(newkpst);
    Все должно работать. Если объявлял newkpst - она не может быть 'undefined'! она может быть равна null, чему то другому и т. д., но не 'undefined'.
     
  9. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Сорри
    Забыл)))
    Пишет undefined
     
  10. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    выложи код
     
  11. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Код (Text):
    1.  
    2. var newkpst;
    3. new Ajax.Request(g_path+c_Task_ScriptFileName,
    4. {
    5.             parameters:  {
    6.                 '_func': 'getstatuskp',
    7.                 'tsk_id': _id.value
    8.             },
    9.         onSuccess : function(transport) {
    10.         var l_res = transport.responseText.evalJSON();
    11.         var newkpst=l_res['kpstatus'];
    12.         transport.responseText.evalJSON();
    13.                 console.log(newkpst); // Здесь пишет значение
    14.             }
    15.                 }
    16.         );
    17.   console.log(newkpst); // а здесь уже undefined
     
  12. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Код (Text):
    1.  
    2. var newkpst;
    3. new Ajax.Request(g_path+c_Task_ScriptFileName, {
    4.     parameters: {
    5.         '_func': 'getstatuskp',
    6.         'tsk_id': _id.value
    7.     },
    8.     onSuccess: function(transport) {
    9.         var l_res = transport.responseText.evalJSON();
    10.         newkpst = l_res['kpstatus'];
    11.     }
    12. });
    13.  
    14. console.log(newkpst);
     
  13. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Так-же, undefined ((
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Тема перемещена в JavaScript & AJAX

    Добавлено спустя 5 минут 53 секунды:
    помоему вы оба тупите. запрос асинхронный! проверьте что раньше выполняется: console.log() или onSuccess()
     
  15. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    А если вот так...

    Код (Text):
    1.  
    2. var newkpst;
    3.  
    4. new Ajax.Request(g_path+c_Task_ScriptFileName, {
    5.     parameters: {
    6.         '_func': 'getstatuskp',
    7.         'tsk_id': _id.value
    8.     },
    9.     onSuccess: function(transport) {
    10.         var l_res = transport.responseText.evalJSON();
    11.         newkpst = l_res['kpstatus'];
    12.     }
    13. });
    14.  
    15. function out() {
    16.     console.log(newkpst);
    17. }
    18.  
    19. var timeout = window.setTimeout(out, 5000);
    Добавлено спустя 4 минуты 33 секунды:
    Я ни туплю... Я знаю фсе сам...
     
  16. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Задержку из-за асинхронного вызова? Так я понимаю?
    Все равно сначала undefined
    Uncaught ReferenceError: newkpst is not defined
    out
    а как тогда эту задержку сделать?
     
  17. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Да не нужно делать задержку. Нужно просто как-то грамотно расставить все действия, чтобы прослеживалась очередность событий. Задержку я там вставил лишь для того, чтобы попробовать убедиться, что ход мыслей верен. У тебя есть событие onSuccess, которое выполняется после удачного запроса, вот там по идее и нужно делать дальнейшие действия (вызвать функцию, например).
     
  18. dedulka

    dedulka Новичок

    С нами с:
    8 май 2014
    Сообщения:
    13
    Симпатии:
    0
    Да я тоже так подумал. Но после ajax много чего понаписано. Если все остальные действия по функциям отдельным раскидать, то наверное можно будет их с тела вызывать поочередно. Только возможно, функции вызывать последовательно? Т.е. дожидаясь пока отработает одня, и только потом вторая7
     
  19. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Если ты после отработки запроса делаешь что-то из анимаций, то ты можешь, конечно сделать так, чтобы твои функции выполнялись последовательно. Но это опять таки делается с помощью задержек (т. е. если скажем анимация длится 200 мс, то делаешь задержку 200мс после которой выполняешь следующую функцию). Если же ты точно не знаешь сколько по времени должна выполняться твоя функция, то с задержками трюк не прокатит.
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    jquery подключите и проблемы отпадут.