За последние 24 часа нас посетил 20941 программист и 1138 роботов. Сейчас ищут 699 программистов ...

Передача переменной из JavaScript в PHP

Тема в разделе "JavaScript и AJAX", создана пользователем waterman, 18 июл 2011.

  1. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Добрый день, уважаемые знатоки PHP! Помогите, пожалуйста, в следующей проблеме. Необходимо передать переменную из JavaScript в PHP без перезагрузки страницы. Знаю, тема не нова, но вразумительных ответов нигде на нашел, кроме jquery и ajax; но всё равно косяк. Библиотека jquery подключена должным образом.
    Код (Text):
    1. test.php(фрагмент)
    2. <head>
    3. <script type="text/javascript" src="jquery-1.6.1.min.js"></script>
    4. <script type="text/javascript" src="script1.js"></script>
    5. ---
    6. </head>
    7. ---
    8. <script>
    9. $.ajax({type:'POST',url:'test.php',data:{proba:123},success:function(){alert("OK");}});
    10. </script>
    11.  
    12. <?php print_r($_POST); echo ($_POST['proba']);?>
    Alert отрабатывает, выскакивает ОК, однако массив $_POST выводится пустой, а хотелось бы получить значение переменной proba. Заранее благодарю!
     
  2. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Ajax делает параллельный запрос к тест странице test.php, и результат работы вы не видите на экране. Однако, результат работы можно отследить с помощью FireBug для браузера Firefox.

    Ajax не передаёт параметры в текущий запрос к пхп, т.к. по сути это не возможно.
    Сначала отрабатывает пхп, а потом уже работает javascript.
    Фактически вы к test.php обращаетесь 2 раза.
    1 раз когда заходите на страницу сами, 2-ой раз - обращается Ajax.

    И если думать логически, то обращение идёт бесконечное, т.к. каждое обращение к странице создаёт новое обращение к этой же странице и так до бесконечности, однако, это не совсем так, потому что Javascript не отрабатывает, когда запрос идёт от Ajax, а не от пользователя.

    Для более наглядного примера, используйте Iframe


    <iframe src="test.php" width="640" height="480"></iframe>

    И вы увидите бесконечный iframe страницы test.php


    В вашем случае, как вы уже поняли бесконечного не будет, т.к. javascript при запросе от Ajax не отрабатывает, т.е. у вас будет всего лишь 2 обращения к странице test.php
     
  3. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Спасибо большое за ответ, neverlose. Так как же мне получить значение value из скрытого элемента
    Код (Text):
    1. <input id="view" name="mode_of_view" type="hidden" value="0">
    2.         <span id="spantabs"><a href="#" onClick="set_mode_view(0);">закладка 1/a></span>
    3.         <span id="spantabs"><a href="#" onClick="set_mode_view(1);">закладка 2</a></span>
    4.         <span id="spantabs"><a href="#" onClick="set_mode_view(2);">закладка 3</a></span>
    5.         <span id="spantabs"><a href="#" onClick="set_mode_view(3);">закладка 4</a></span>
    6.         <span id="spantabs"><a href="#" onClick="set_mode_view(4);">закладка 5</a></span>
    7.         <script> $.ajax({type:'GET',url:'view_things.php',data:{test:123},success:function(){alert("OK");}});
    8.         </script>
    9.         <?php print_r($_POST); print_r($_GET); echo "id= ".$_POST['test']?>
    Фунцкция JS set_mode_view меняет значение скрытого элемента в зависимости от клика на span. Нет ли способа получить value средствами PHP, а не JavaScript(или jquery, что еще проще), где есть DOM. В PHP тоже есть DOM, но она применяется к XML. Вообще, можно ли получать доступ к элементам без отправки формы? Да и вообще обойтись без тэга form. Во всех книгах говорят про отправку формы, мне это не совсем подходит.
     
  4. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    вообще то результат передаётся обратно в страницу, в функцию success, что мешает написать так:
    [js]success:function(data){alert(data);}[/js]
    и в сообщение выскочит результат выполнения php скрипта.

    ну так вы через аякс и отправляйте его value

    HTML:
    1. <?php
    2. if (isset($_POST['test'])) {
    3.    die('Вы нажали на кнопку: ' . $_POST['test']);
    4. }
    5. ?>
    6. <head>
    7. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    8.  </head>
    9.  
    10.  
    11.  
    12.       <span id="spantabs"><a href="#" onClick="set_mode_view(0);">закладка 1</a></span>
    13.       <span id="spantabs"><a href="#" onClick="set_mode_view(1);">закладка 2</a></span>
    14.       <span id="spantabs"><a href="#" onClick="set_mode_view(2);">закладка 3</a></span>
    15.       <span id="spantabs"><a href="#" onClick="set_mode_view(3);">закладка 4</a></span>
    16.       <span id="spantabs"><a href="#" onClick="set_mode_view(4);">закладка 5</a></span>
    17.  
    18. function set_mode_view(id)
    19. {
    20.     $.ajax({
    21.             type:'POST',
    22.             url:'test.php',
    23.             data:{test:id},
    24.             success:function(data){
    25.                 alert(data)
    26.             }
    27.     })
    28. }
     
  5. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    php прекрасно может работать с HTML смотрите функцию loadHTML
    вот только какой смысл передавать обратно в сценарий весь html код, аякс нужен для сокращения трафика а не для увеличения :)
     
  6. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Спасибо за ответ!
    Я пробовал
    Код (Text):
    1. success:function(data){alert(data);}
    У меня в браузере вывалилось на весь экран содержимое всей страницы! Да и что это, собственно, даст?

    А значение скрытого элемента идет дальше в PHP-скрипт и определяет способ сортировки записей из базы данных, так что ограничиться только JavaScript не получится!
    Сама навигация сделана из span'ов в виде вкладок и кнопки "Применить фильтр" нет. Я не хочу кнопу. Хочу динамизм. Видимо придется искать другие пути. А JavaScript умеет работать с файлаим?
     
  7. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    а даст это то, что вы увидите что всё таки переменная ваша ушла в скрипт, просто вы пока видимо не поняли технологии аякса и как его применять.
    то что весь текс, вам написали ещё в первом ответе, я привёл пример как сделать не весь текс а только результат работы при переданной переменной, вы сами должны понять что вам возвращать, возможно текст который вставите в контейнер или ещё что.
    ну вот, я же говорю вы не поняли смысла аякса :)
    при чём тут толлько джава скрипт, вы можете передать что угодно аяксом в скрипт и оно выполнится а как результат что то вернуть.
    аякс вам в помощь :)
     
  8. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    самый простой пример
    PHP:
    1. <?php
    2.  
    3. $array = array(1,65,234,2,5,12,4435,43);
    4.  
    5. function show($array) {
    6.     foreach ($array as $val) {
    7.         echo "<li>{$val}</li>";
    8.     }
    9. }
    10.  
    11. if (isset($_POST['sort'])) {
    12.     switch ($_POST['sort']) {
    13.         case 1: sort($array); break;
    14.         default: rsort($array);;
    15.     }
    16.     die(show($array));
    17. }
    18.  
    19.  
    20.  
    21. ?>
    22. <head>
    23. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    24.  </head>
    25.  
    26. <script>
    27. function sort(id)
    28. {
    29.     $.ajax({
    30.             type:'POST',
    31.             url:'test.php',
    32.             data:{sort:id},
    33.             success:function(data){
    34.                 $('#res').html(data)
    35.             }
    36.     })
    37. }
    38. </script>
    39.  
    40. <a href="#" onclick="sort(1)">а-я</a> | <a href="#" onclick="sort(2)">я-a</a>
    41. <ul id="res">
    42. <?php
    43. show($array);
    44. ?>
    45. </ul>
    при запуске вывод не отсортированного массива
    при кликах по ссылке вывод через аякс с сортировкой

    но вообще я возвращаю html код, когда поймёте как работает, возвращайте JSON массив и генерируйте на JS уже html код, так как это сильно может уменьшить трафик в реальных условиях и увеличить скорость отображения данных.
     
  9. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Спасибо, Easy, за разъяснение и код! Только у меня вопрос: функция show - рекурсивная?! Этот момент я так и недопонял. Объясните, пожалуйста, что к чему? Почему рекурсивный вызов, да еще с die? Как это работает?

    Код (Text):
    1. function show($array) {
    2.      foreach ($array as $val) {
    3.          echo "<li>{$val}</li>";
    4.      }
    5.  }
    6.  
    7.  if (isset($_POST['sort'])) {
    8.      switch ($_POST['sort']) {
    9.          case 1: sort($array); break;
    10.          default: rsort($array);;
    11.      }
    12.      die(show($array));
    13.  }
     
  10. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    нет там не где рекурсии.

    это вообще могут быть два разных файла, или два разных метода контроллера

    один формирует страницу, другой только ответ аякса.

    я применил die что бы убить процесс и не было вывода дальше. зачем нам обратно передавать весь код страницы? если нужно только текст который мы вставим на страницу.

    функция ahow только потому нужна, что бы не дублировать код, то есть нам нужно вызвать её для вывода в старницу, просто тут пример не очень удачный из за того что нет шаблонизатора и вывод и php код на одной странице.

    просто при хагрузки страницы на строке 43 будет вызвана функция show и вывод будет текста сразу без аякса и после основного кода страницы

    а при запросе аяксом выполнится условие
    PHP:
    1.  if (isset($_POST['sort'])) {
    и функция будет вызвана до вывода основного кода страницы
    ну а потом что бы основной код. который нам не нужно передавать не вывелся в аякс, мы просто убили процесс.
     
  11. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Здравствуйте, Easy! Разбираясь в Вашем коде, я понял, что информация обновляется на странице путем
    Код (Text):
    1. success:function(data){ $('#res').html(data)
    и
    Код (Text):
    1. <ul id="res">
    2.  <?php
    3.  show($array);
    4.  ?>
    5.  </ul>
    Мне же нужно не выводить информацию, а получить значение переменной, которая соответствует выбранной вкладке, т.е. от 1 до 5.
    Затем значение этой переменной в другую PHP-функцию, где участвует в SQL-запросе, который выдаст таблицу из базы данных с соответствующей сортировкой. AJAX то не влезет в SQL, поэтому нужна переменная!
    Грубо говоря, SELECT * from table ORDER BY 'номер вкладки'. Вот что я хочу получить.
    А приведенный выше код - супер, я возьму на вооружение, но здесь он не подойдёт.

    Помогите, пожалуйста! Может есть какой-то другой способ?

    Есть, конечно, способ сформировать URL GET-запрос, перенаправить на страницу, а затем переменную извлечь методом GET(как в большинстве книг), но это не то. Опять же пользователь может ввести в адресную строку всякую хрень.
     
  12. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    нет. обновляется путём
    [js]success:function(data){ $('#res').html(data)[/js]
    и
    PHP:
    1. function show($array) {
    2.      foreach ($array as $val) {
    3.          echo "<li>{$val}</li>";
    4.      }
    5.  }
    6.  
    7.  if (isset($_POST['sort'])) {
    8.      switch ($_POST['sort']) {
    9.          case 1: sort($array); break;
    10.          default: rsort($array);;
    11.      }
    12.      die(show($array));
    13.  }
    ajax не влезет? куда он не влезет?) аякс не куда и не влазиет :)
    он просто отправляет запрос и передаёт, в данном случае, одно значение, это тут
    [js]sort:id[/js]
    то есть в php вы получите переменную $_POST['sort'] равную ID из JS
    ну вот и передавайте номер вкладки.
     
  13. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Ни фига не получается! Вот выдержка из кода
    script2.js
    Код (Text):
    1. function set_mode_view(view)
    2. { $.ajax({url: '../view_things.php',data: {param1:view}, type: 'POST',success: function(){alert(view);}});}
    В начале view_things.php
    Код (Text):
    1. [php]function get_view() {  if (isset($_POST['param1'])) {echo "yes";} else {echo "no";}    }[/php]
    2. далее
    3. <span id="spantabs"><a href="#" onClick="set_mode_view(0);">Закладка 1</a></span>
    4. <span id="spantabs"><a href="#" onClick="set_mode_view(1);">Закладка 1</a></span>
    5. ---
    6. <?php get_view();?>
    alert(view) выдает всё нормально (значаения от 0 до 4), т.е. якобы success, но всё время выдается no и массив $_POST пустой, т.е. ничего не посылается! Как этот ajax вообще работает? Извините за тупость!
     
  14. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    а что он вам должен выдавать?)
    в таком виде
    [js]function(){alert(view);}[/js]
    вы выводите не ответ полученный аяксом а переменную определённую в самом скрипте.
    что бы вывести ответ нужно писать так
    [js]function(data){alert(data);}[/js]

    я так понимаю вам выдаёт no на страницу при её открытии? а что вы там ожидали? при открытии нет переменной $_POST['param1'] вот и пишет no
     
  15. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Я так понял, что ajax на лету меняет значение и поведение самих элементов.
    Этот факт я не могу использовать дальше в расчетах.
    Я же не могу в PHP указать, например, $("#res").value
    Указывается метод POST, но в действительности на сервер ничего не посылается!!!
    А если и посылается, то в каком месте скрипта нужно обрабатывать.
    Да, видимо, взаимодействия PHP и JS нет в части асинхронных запросов!
     
  16. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    видимо просто вы ещй не разорались всё таки как аякс работает :)
     
  17. Котэ

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

    С нами с:
    20 июл 2011
    Сообщения:
    35
    Симпатии:
    0
    ajax ничего не меняет, его задача обмен данными браузера с веб-сервером.

    скажем так, ты когда отправляешь и получаешь почту, твой почтовый ящик меняется?
     
  18. waterman

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

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    А если пойти другим путём! Оставить php в покое! При первом заходе на страницу выбирается вкладка номер 1(инициализация). Дело осложняется тем, что на странице сделан пагинатор, который, перезагружает страницу
    (он-то сделан в виде гиперссылок).

    Код (Text):
    1. <span align="left"><strong> СОРТИРОВКА ПО :</strong></span>
    2.         <span id="spantabs"><a href="#" onClick="set_mode_view(0);">Закладка 1</a></span>
    3.         <span id="spantabs"><a href="#" onClick="set_mode_view(1);">Закладка 2</a></span>
    4.         <span id="spantabs"><a href="#" onClick="set_mode_view(2);">Закладка 3</a></span>
    5.         <span id="spantabs"><a href="#" onClick="set_mode_view(3);">Закладка 4</a></span>
    6.         <span id="spantabs"><a href="#" onClick="set_mode_view(4);">Закладка 5</a></span>
    7. //Инициализация
    8.         <script> set_mode_view(0);</script>
    Мне нужно как-то запомнить номер выбранной закладки. А то всё время после перезагрузки получается отрабатывает секция инициализация и, соответственно, выбирается закладка №1.