Я пытаюсь передать и получить данные в переменной $_SESSION в PHP с помощью AJAX.

Вот мой сценарий:

enter image description here

Портативный компьютер просматривает веб-страницу admin.php , сохраненную на сервере srv-web. Этот сервер (raspberry PI) сам подключен к большому экрану, используемому в качестве панели управления, и веб-страница index.php (localhost) отображается поверх экрана.

Сообщение Hello World хранится в переменной $_SESSION['msg']. Форма в admin.php передает эту переменную, используя вводимые пользователем данные в качестве значения.

admin.php

<?php 
session_start();
if (isset($_POST['msg'])) { 
$_SESSION['msg'] = $_POST['msg']; 
echo $_SESSION['msg'];
}
?>
<form action="admin.php" method="post">
<input type="text" name="msg" />
<input type="submit" />
</form>

До сих пор панель управления использовала <META http-equiv="refresh" content="3; URL=index.php"> для обновления сообщения, отправленного административным портативным компьютером.

Это решение больше не может быть использовано, так как некоторые данные не могут быть обновлены на веб-странице. Я подумал об использовании ajax помимо PHP, чтобы эта настройка заработала. Вот что у меня есть на данный момент:

index.php

<?php session_start(); ?>
<html>
<head>
<script type="text/javascript" src="jquery-3.3.1.min.js"></script>
</head>
<body>
<script type="text/javascript">
    var session;
    $.ajaxSetup({cache: false})
    $.get('getsession.php', function (data) {
        session = data;
    });
</script>
<?php echo $_SESSION['msg']; ?>
</body>
</html>

getsession.php

<?php
session_start();
print json_encode($_SESSION['msg']);
?>

Как вы понимаете, я не разработчик javascript и не могу заставить этот код работать. Я тоже не нашел в Интернете (я пока не могу написать такой собственный код, и это немного актуально).

Может ли кто-нибудь помочь мне получить данные из $_SESSION['msg'] и отобразить их без обновления index.php ?

1
Will 16 Фев 2018 в 17:32
Где ты застрял? Похоже, ваш код еще не завершен. Вам нужно присвоить содержимое session какому-либо элементу dom. (например, document.getElementById('someid').textContent = session;), и вам нужно неоднократно делать запрос ajax. (например, с setInterval)
 – 
Roland Starke
16 Фев 2018 в 17:42
Я заключил весь javascript в setInterval(function(){ ... }, 3000); и добавил document.getElementById('someid').textContent = session; в функцию, кроме <h1 id='someid'></h1> внутри тела, но это не работает. Что я делаю неправильно ?
 – 
Will
16 Фев 2018 в 17:50
Не могли бы вы указать "не работает" Вы можете увидеть ошибки, открывая инструменты разработчика с помощью F12.
 – 
Roland Starke
16 Фев 2018 в 17:52

1 ответ

Лучший ответ

Вы должны создать такой ввод:

<input type="text" id="yourVal" value=""></input>';

А затем обновите значение в интервале в js следующим образом:

setInterval(function(){
    $.get('getsession.php', function (data) {
       document.getElementById("yourVal").value=data;
    });
}, 200);

Я не знаю, как выглядит ваш JSON, поэтому я не могу показать, как правильно получить значение данных

Изменить : очевидно, @DanFromGermany указал, что тайм-аут - лучшая практика. Вот что вы можете сделать, чтобы не застрять

var interval = 1000; // 1 sec
var keepGoing = true;
function execAjax() {
$.ajax({
        type: 'GET',
        url: 'session.php',
        dataType: 'json',
        success: function (data) {
            document.getElementById("yourVal").value=data;
        },
        error:{
           keepGoing=false;
        },
        complete: function (data) {
            // Schedule the next
            if(keepGoing==true){
                setTimeout(execAjax, interval);
            }
        }
    });
}
setTimeout(execAjax, interval);
2
Lorenzo Canavaggio 16 Фев 2018 в 20:12
1
Спасибо ! Используя ваше решение помимо Google, я наконец-то смог заставить его работать! : D
 – 
Will
16 Фев 2018 в 18:18
1
Лучшая практика - не использовать setInterval с ajax. Вместо этого используйте рекурсивный setTimeout. Если у вас есть тайм-аут или задержка в вызове ajax при использовании setInterval, ваш браузер получает обратную реакцию, и вы делаете это сами.
 – 
Daniel W.
16 Фев 2018 в 19:38
Спасибо, сэр ! спасибо, что поделились своими мыслями!
 – 
Lorenzo Canavaggio
21 Фев 2018 в 12:01