Почему моя система входа в систему не работает? - PullRequest
1 голос
/ 14 мая 2011

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

Когда я иду на тестирование, я могу попытаться войти в систему, и это не удается.Затем я пытаюсь войти снова, и это будет успешно.Это всегда успешно со второй попытки войти в систему.Это никогда не удается с первой попытки в Firefox, но это происходит в Chrome.Кроме того, пару раз в Chrome, после того, как мне удалось войти в систему, переход на несколько разных страниц на моем сайте, казалось, стирал сеанс.Или, по крайней мере, этот сеанс не регистрировался на этих других страницах.У меня не было этой проблемы в Firefox.Я проверил, дважды проверил, и трижды проверил, и все мои страницы вызывают session_start () раньше всего, поэтому я знаю, что это не может быть проблемой.

У меня не должно быть достаточно полнойпонимание PHP-сессий, поскольку они просто не работают согласованно.

После публикации я протестировал в IE, и там все отлично работает.Я вхожу в систему с первой попытки, и любая страница, которую я посещаю, поддерживает мой сеанс.

Вот код для php-скрипта, который фактически «регистрирует» пользователя:

<?php
session_start();
//pass info to mysql(servername, username, password)
$connect = mysql_connect ("localhost", "ggstudio", "mtgertai1");
if (!$connect) 
{
    die ('Failed to connect: ' . mysql_error());
}
mysql_select_db("ggstudio_accountDatabase", $connect);

//capture data sent to page through login
//usernameField and passwordField

$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];

$validAccount = mysql_query("SELECT * FROM userAccounts WHERE userID = '$usernameSubmission' AND userPassword = '$passwordSubmission'");
$row = mysql_fetch_array($validAccount);
if (($row['userID'] == $usernameSubmission)&&($row['userPassword'] == $passwordSubmission))
{
/*********************************
**********************************
assign global variables to session
after starting session and then***
redirect to user homepage*********
**********************************
**********************************
*/
//get account number from database
$_SESSION['accountNumber']= $row['accountNumber'];
//get first name from database
$_SESSION['firstName']= $row['firstName'];
//get last name from database
$_SESSION['lastName']= $row['lastName'];
//save username into session
$_SESSION['username']= $row['userID'];
//save password into session (only really useful if user wants to change password)
$_SESSION['userPassword']= $row['userPassword'];
//get user's email address from database
$_SESSION['userEmail']= $row['userEmail'];
//get GP from database
$_SESSION['gpoints']= $row['userGloryPoints'];
//get user join date from database
$_SESSION['userJoinDate']= $row['userJoinDate'];
//get user rank
$_SESSION['userRank']= $row['userRank'];

header('Location: http://www.glorygamer.com/account_home.php');
}
else
{
    $loginFailed= TRUE;
    setcookie("incorrectLogin", $loginFailed, time()+20);
    header('Location: http://www.glorygamer.com/shibboleth.php');
}
?>

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Если сеанс работает с перерывами, то я бы сказал, что происходит одна из двух вещей:

  • Ваш сеанс не настроен в браузере правильно
  • Ваш сеанс нене сохраняются на сервере вовремя.

Одна вещь, которая может произойти (особенно при тестировании на localhost), это то, что аутентифицированный сеанс не записывается на диск вовремя для следующегозапрос, следовательно, следующий запрос кажется не прошедшим проверку подлинности (помните, что apache является многопроцессорным; ваш второй запрос может быть обработан другим процессом, который не знает, что делает первый).Вот одно из возможных решений:

$_SESSION['userRank']= $row['userRank'];
session_write_close();
header('Location: http://www.glorygamer.com/account_home.php');

Вызов session_write_close() должен означать, что ваш аутентифицированный сеанс готов ко времени следующего запроса.

HTH.

1 голос
/ 14 мая 2011

Первое, что я вижу, это отсутствие одинарных кавычек.Кроме того, вам определенно следует избегать их, чтобы никто не мог выполнить SQL-инъекцию для вас.

$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];

должно быть:

$usernameSubmission = mysql_real_escape_string($_POST['usernameField']);
$passwordSubmission = mysql_real_escape_string($_POST['passwordField']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...