Запуск или предотвращение функции JavaScript, если $_SESSION['SESS_USER_ID'] не установлен

Эта функция php в настоящее время перенаправляет пользователя на другую страницу, если он не вошел в систему

if(!isset($_SESSION['SESS_USER_ID']) || (trim($_SESSION['SESS_USER_ID']) == '')){
header("location: login_failed.html");
exit();
} 

Как я могу изменить функцию, чтобы вместо перенаправления пользователя она делала следующее:

  • Запускает функцию JavaScript: loginFailed();
  • Предотвращает определенные iframes, которые предварительно загружены от запуска (они требуют, чтобы пользователь вошел в систему, и в настоящее время открываются как пустые iframes, если они не вошли в систему). Я включил сценарий для этого ниже. В качестве альтернативы, предотвращение запуска фреймов, которые имеют определенный класс или тип данных-fancybox, или те, которые требуют !isset($_SESSION['SESS_USER_ID']),

Функции, которые я хочу вызвать / предотвратить

function loginFailed() {
    $().toastmessage('showToast', {
        text: 'Log In Failed<br/><br/>Please check your username and password',
        sticky: false,
        position: 'top-center',
        type: 'message',
        closeText: '',
        close: function () { console.log("toast is closed ...") }
    });
} 
$(function () {
    $(".fancybox").fancybox({
      preload: true,
    });
    $(".fancybox").eq(0).trigger('click');
});   

Я пробовал:

echo "<script>loginFailed();</script>";
echo "<script type="text/javascript">loginFailed();</script>";
echo "<script type="text/javascript">loginFailed;</script>";

3 ответа

Решение

Я объединил предложение @hellohellosharp с решением, которое мне дал @willoller для другой проблемы, и выяснил это:-)

Добавьте это к php:

$logged_in = (isset($_SESSION['SESS_USER_ID']));

Добавьте это к JavaScript:

<?php if ($logged_in) : ?>
    <a class="fancybox" data-fancybox-type="iframe" href="iframe1.html"></a>
<?php else : ?>  
     loginFailed();
<?php endif; ?>

Я также использую это для изменения параметров меню в зависимости от того, вошел ли пользователь в систему.

Просто напоминание - он использует ISSET для определения того, что должен отображать javascript, но он только меняет восприятие пользователя и не обеспечивает никакой безопасности.

Добавление к ответу techfoobar...

Как правило, рекомендуется помещать ваши переменные из PHP в Javascript (при необходимости) и разрешать его обработку в Javascript, а не выводить другой javascript в зависимости от переменной PHP.

Имейте в виду, что все переменные JavaScript могут манипулировать клиентом.

Попробуйте что-то вроде этого:

if(!isset($_SESSION['SESS_USER_ID']) || (trim($_SESSION['SESS_USER_ID']) == '')){
$t="no_session";
}
else{
$t="yes_session";
} 

.... 


<script>
var session="<?php echo $t; ?>";

if(session == "no_session")
loginFailed();
</script>

PHP работает на стороне сервера. JavaScript работает на стороне клиента внутри браузера. PHP не может напрямую вызывать функции JavaScript.

Однако PHP может отображать JavaScript вместе с HTML в браузер, чтобы браузер, в свою очередь, мог его запустить.

В вашем конкретном случае вы можете проверить состояние входа в систему с помощью вызова AJAX и вызвать требуемые методы JS при успешном обратном вызове.


Пример:

Для проверки статуса входа в систему:

/* JS */
function checkLoginState() {
    $.post('/yourserver.com/isloggedin.php', function(data) {
        if(data != "OK") { //  not logged in

            // call your JS method thats disables stuff etc.
            loginFailed();
        }
    });
}

// Periodically check login state
setInterval(checkLoginState, 10000); // check every 10 seconds, change as needed.

/* PHP - isloggedin.php */
if(!isset($_SESSION['SESS_USER_ID']) || (trim($_SESSION['SESS_USER_ID']) == '')){
    echo "NOT OK";
} 
else {
    echo "OK";
}
Другие вопросы по тегам