2013-07-08 4 views
0

У меня есть функция Jquery Ajax для входа на веб-страницу.

url="<?php echo Yii::app()->createUrl("security/login") ?>" 

       $.ajax({      
        type:"POST", 
        url:url, 
        data:{}, 
        success: function (jsonResponse) { 
         var json=JSON.parse(jsonResponse); 

         if(json.result == "SUCCESS") 
         { 
          <?php $_SESSION['LOGGED_USER']="USER"; ?> 
         } 

        }, 
        error: function (jqXHR, textStatus, errorThrown) { 
          console.log(errorThrown); 
        }  
       }); 

И в моих взглядах макет У меня есть этот

session_start(); 

if(isset($_SESSION['LOGGED_USER'])) 
{ 
    print_r("LOGGED"); 
} 
else 
{ 
    print_r("NOT LOGGED"); 
} 

Когда я вхожу в первый раз на страницу он печатает «НЕ LOGGED», но мне кажется, что она автоматически устанавливает сеанс так, что, когда Я перезагружаю страницу. Он печатает «LOGGED».

Как правильно настроить сеанс в моем аякс-запросе?

Большое спасибо :)

+0

Обратите внимание, что 'if (json.result ==" SUCCESS ") { } 'устанавливает $ _SESSION ['LOGGED_USER'] после успеха этого запроса ajax не раньше этого. Поэтому в первый раз вы видите «NOT LOGGED», но затем вы входите в систему и $ _SESSION ['LOGGED_USER']. Затем вы обновите страницу и увидите «LOGGED». Надеюсь, теперь причина понятна :) – Fallen

+0

@MuhammedHedayet: Умм ... нет. В зависимости от того, как настроен сервер и где находится этот скрипт, часть PHP либо выдает синтаксическую ошибку, либо запускает загрузку скрипта. – cHao

+0

Спасибо всем за ваши ответы, я мой сценарий, так что мой контроллер устанавливает переменную сеанса и работает отлично. :) –

ответ

0

Кажется, много людей путают о клиенте против сервера, когда речь идет о Ajax. Позвольте мне посмотреть, могу ли я это понять:

  • Ваш JS работает в браузере (клиенте). PHP работает на сервере. Эти два являются разными языками, которые работают на совершенно разных машинах; они не используют одни и те же переменные или что-то еще. Они не разговаривают напрямую друг с другом или даже не знают друг о друге. Их единственным средством коммуникации является HTTP-запрос. (Ну, есть и WebSockets ... но это еще немного продвинуто.)

  • JS и PHP обычно даже не запускаются одновременно. В зависимости от вашей настройки и того, где живет этот сценарий, происходит одна из двух вещей, и в этом случае ни один из них не нужен.

    • JS находится в файле некоторого типа, который сервер не передает на PHP. Код PHP по-прежнему находится в файле, когда браузер видит его - и является недопустимым JS, вызывает синтаксическую ошибку при попытке запустить его. Возможно, прежде чем вы даже доберетесь до должности Ajax.

    • JS находится в файле некоторого типа сервер фид на PHP. Интерпретатор PHP послушно просматривает файл, находит в нем весь PHP-код и анализирует и запускает его. PHP-код в нем работает на сервере, возможно, до того, как страница будет отправлена ​​в браузер. (И поскольку PHP не говорит JS, и даже не волнует, что то, что он генерирует, является допустимым HTML или JS ... любой не-PHP-код на странице не имеет значения.) В любом случае, к моменту, когда браузер запускает ваш скрипт выше, это выглядит следующим образом:

      ... 
           success: function (jsonResponse) { 
            var json=JSON.parse(jsonResponse); 
      
            if(json.result == "SUCCESS") 
            { 
             } 
      
           }, 
      ... 
      

    потому, что PHP уже прошел через файл и интерпретировал немного о настройке $_SESSION['LOGGED_USER']. Если у пользователя есть активный сеанс вообще, вошел в систему или нет, эта переменная LOGGED_USER устанавливается второй, которую его браузер запрашивает на этой странице.

PHP-скрипт, обрабатывающий запросы для security/login, должен установить переменную сеанса. Ваш JS не сможет это сделать, поскольку данные сеанса полностью серверные, и вы не можете позволить браузеру просто подняться и сказать серверу, чтобы он запускал произвольный PHP-код, не открывая массивную дыру в безопасности. (Подумайте, что может случиться, если браузер может сказать «эй, PHP, запустите это». Все, что мне нужно сделать, это открыть консоль JS, посмотреть, как вы это делаете ... и, по крайней мере, я мог бы написать строку JS в консоли, чтобы установить эту переменную независимо от того, вошел ли я в систему или нет.)

. Если вы действительно хотели, ,Это кажется пустой тратой, хотя ... и это может быть довольно сложно сделать надежно. (Если PHP еще не знает, что вы вошли в систему, вам придется повторить проверку подлинности и все такое.) Я бы не подумал об этом, если по какой-либо причине security/login не может быть изменен.

+0

Спасибо вам большое, сэр, это было действительно хорошее объяснение, я ценю ваши усилия, написав это :) –

Смежные вопросы