2011-12-13 4 views
4

Я пишу сценарий входа для своего сайта. Я написал сценарий входа, и у меня есть форма, связанная с ним через вызов AJAX через jQuery.

Вот PHP форма вызова:

<?PHP 
    # Make sure form data was passed to the script 
    IF (isset($_POST) && isset($_POST['username']) && isset($_POST['password'])){ 
     # Connect to the database 
     REQUIRE('../../../../my_db.php'); 

     # Define variables 
     $given_username = $_POST['username']; 
     $given_password = $_POST['password']; 
     $hashed_password = md5($given_password); 
     $matched_username = ""; 
     $matched_password = ""; 


     # See if there is matching info in the database 
     $sql = 'SELECT username, pass FROM users WHERE username="'.$given_username.'" AND pass = "'.$hashed_password.'"'; 
     $result = mysql_query($sql); 
     WHILE($row = mysql_fetch_assoc($result)){ 
      $matched_username = $row['username']; 
      $matched_password = $row['pass']; 
     }; 


     # If there was a match 
     IF ($matched_username != "" && $matched_password != ""){ 

      # Double check the values match 
      IF ($given_username == $matched_username && $hashed_password == $matched_password){ 

       # If there is only one result returned 
       $session_sql = 'SELECT * FROM users WHERE username="'.$matched_username.'" AND pass = "'.$matched_password.'"'; 
       $session_result = mysql_query($session_sql); 
       IF(count(mysql_fetch_assoc($session_result)) != 0 && count(mysql_fetch_assoc($session_result)) < 2){ 

        # If they do, start a session 
        if(!isset($_SESSION)) { 
        session_start(); 
        session_regenerate_id(); 
        }; 

        # Set our session values 
        WHILE($session_row = mysql_fetch_assoc($session_result)){ 
         $_SESSION['id'] = $session_row['id']; 
         $_SESSION['last_login'] = $session_row['last_login']; 
         $_SESSION['username'] = $session_row['username']; 
         $_SESSION['signup_date'] = $session_row['signup_date']; 
        }; 

        # Set users last login date and time to this login 
        $update_sql = 'UPDATE users SET last_login = NOW WHERE username="'.$matched_username.'" AND pass = "'.$matched_password.'"'; 
        $update = mysql_query($update_sql); 

        echo json_encode(array("success"=>"user logged in", "session"=>$_SESSION)); 
       }ELSE 
        echo json_encode(array("error"=>"More than one user with the same information. What did you do?!")); 
      }ELSE 
       echo json_encode(array("error"=>"invalid login provided")); 
     }ELSE 
      echo json_encode(array("error"=>"invalid login provided")); 
    }ELSE 
     echo json_encode(array("error"=>"you must supply a username and password")); 
?> 

Но если я console.log(result.session) я [], который заставляет меня думать, что либо установка переменных сеанса через AJAX не является жизнеспособным, или сама сессия ISN Не работает.

У меня нет ошибок из этого кода.

Может ли кто-нибудь указать мне в правильном направлении?

Я не думаю, что у меня есть доступ к php.ini, но я давно помню, что вам приходилось устанавливать сеансы для работы в файле где-то, но для жизни я не могу найти пример.

+0

Hi @StephenRios У меня такая же проблема, как вы это решили? заранее спасибо – Ebrahim

+0

@Ebrahim Проверьте ответ, который я выбрал ниже. Вот что решило мою проблему. – StephenRios

ответ

5

Убедитесь, что у вас есть session_start() в начале вашего скрипта. Если какие-либо уведомления или что-то брошено , прежде чем вы получите session_start(), то вы получите сообщение об ошибке, как это:

Внимание: session_start(): Не удается отправить куки сессии - заголовки уже прислал (выход начался в. ..

Кроме того, ваш сценарий открыт для инъекции SQL Убедитесь, что вы правильно бежать имя пользователя и пароль Примечание:.! вам лучше использовать prepared statements

+0

поэтому мне нужно session_start() в начале моего javascript? Разве мы не хотим только начать сеанс, если пользователь успешно вошел в систему? или мы просто проверяем сессию, чтобы узнать, вошли ли они в систему и просто запускаете ее все время? – StephenRios

+0

Нет в начале вашего _javascript_, в начале вашего скрипта _PHP_. И нет, вы только хотите, чтобы _store data_ в сеансе, если пользователь входит в систему, вам все равно нужно запустить его в начале, чтобы избежать ошибок. –

+0

Перемещенный session_start() в начало, добавлен ini_set, чтобы попытаться установить некоторые параметры сеанса. Не повезло ни на одном фронте. Спасибо за информацию о сеансе и SQL-инъекции. – StephenRios

0

Я пчела. n от PHP на некоторое время, так что я могу говорить от моего фундамента, но я думаю, вам нужно использовать session_start() и session_write_close().

Вы должны позвонить session_start(), прежде чем что-либо сделать в массив $ _SESSION. После того, как вы закончили модификацию $ _SESSION вы должны вызвать session_write_close()

Для получения более подробной информации см http://www.php.net/manual/en/book.session.php

Вам также может понадобиться изменить php.ini, если ваш хостинг-провайдер не сделал этого. См. http://www.php.net/manual/en/session.configuration.php

Надеюсь, что это поможет.

+0

Угадайте, мне нужно связаться с моим хостинг-провайдером. Я попытался настроить этот файл с помощью ini_set, но даже это не сработало. – StephenRios

1

Некоторые советы для вашего PHP скрипт:

  • Убедитесь, что вы начали сессию в качестве первой строки кода после тега PHP,

    session_start();
    // другой код приходит сюда

Примечание: Вы также можете проверить, что сеанс запускается с помощью session_id()

  • Первый тест отдельно сценарий PHP вызывается Ajax (поместить некоторые достоверные данные $ _POST в качестве ввода кода) и убедитесь, что вы ничего не повторяете перед своими возвращаемыми json-строками, и вы не получаете предупреждений (которые будут рассматриваться как выходы экрана),

  • вы также можете объявить правильные заголовки, поскольку здесь они отсутствуют:

    header ('Content-type: application/json');

  • Не забудьте яваскрипт обратного вызова для чтения запроса ответа :-)

0

Уважаемых @StephenRios особенно спасибо за ваши ответы, я применить указанные параметры в коде, но на самом деле проблема была о совместном использовании ресурсов CORS Cross-Origin, я застрял в этой проблеме и задал вопрос Уважаемый @StephenRios, особенно спасибо за ваши ответы, я применил указанные настройки в коде, но на самом деле проблема была в совместном использовании ресурсов CORS Cross-Origin, Я застрял в этом вопросе и задал вопрос в stackoverflow, а мой друг Милан Фили мог решить проблему,

Я использовал установку в angularJS:

$httpProvider.defaults.withCredentials = true; 

, а также настройки в моем веб-сервере (здесь апач)

Header add Access-Control-Allow-Credentials "true" 

очень признателен за ваши ответы, я просто поделился мой случай здесь, потому что я было googling это больше чем 3 дня, я надеюсь, это могло помочь.

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