PHP: необходимо дважды войти в систему до тех пор, пока не будут установлены переменные сеанса

РЕШЕНИЕ: после многих часов поиска, похоже, эта проблема возникает, когда я обращаюсь к своему сайту без добавления «www». перед доменом. поэтому то, что на самом деле происходило, я вхожу в систему с example.com/login.php, где-то задает сеанс, что мой элемент управления не распознает, поэтому он перенаправляет меня обратно на www.example.com/login.php, что когда Я вхожу в систему, все работает Хорошо.

когда я вхожу в систему с сайта www.example.com/login.php (с www.), он регистрируется правильно с первого attemp.

Поэтому я добавил код, чтобы убедиться, что у меня всегда есть URL в URL:

if ($_SERVER['HTTP_HOST'] == "example.com") { $url = "http://www." . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; header("Location: $url"); } 

и теперь все работает хорошо. Надеюсь, это поможет кому-то.


Итак, я построил более 3 веб-сайтов, и у всех одинаковые проблемы, я не знаю, почему, мне нужно дважды войти в систему, пока я не войду в систему. (До тех пор, пока не будут установлены переменные сеанса). Помощь очень ценится, пытался исправить это и искать решение с давних времен …

  session_start(); if ((isset($_SESSION['UserName']))&&(isset($_SESSION['LastActivity']))) { header ('Location: http://www.example.com/Account.php'); } if (isset($_POST['username'])) { mysql_connect("localhost","DBuser","pass") or die ("could not connect to mysql"); mysql_select_db("DBNAME") or die ("no database"); $inputUserName = $_POST['username']; $inputPass = $_POST['password']; $datausername = mysql_real_escape_string($inputUserName); $password=md5($inputPass); $sqlCommand = "SELECT * FROM Members WHERE UserName='$datausername' AND Password='$password'"; $result = mysql_query($sqlCommand); if (mysql_num_rows($result) > 0) { $_SESSION['UserName'] = $datausername; $_SESSION['LastActivity']= time(); sleep(2); $LoginDate = date('Ymd H:i:s'); mysql_connect("localhost","DBUPDATEusername","DBuserPass") or die ("could not connect to mysql"); mysql_select_db("databaseName") or die ("no database"); mysql_query("Update Members SET LastLogin='$LoginDate' WHERE UserName='$datausername'"); mysql_close(); echo '<meta http-equiv="Refresh" content="0;url=http://www.example.com/Account.php?p=Login_Success"/>'; } else { mysql_close(); echo '<div id="error_msg">Error: Information entered are not correct. Please check and try again.</div>';} } } ?> <form... 

форма входа в систему (с действием = "") и сообщение метода).

Примечание. Я использую тег обновления html, потому что я не могу использовать перенаправление заголовка. (Я получаю сообщение об ошибке, которое уже отправлено).

и в example.com/Account.php я делаю эту проверку вверху кода:

  session_start(); if ((!isset($_SESSION['UserName']))||(!isset($_SESSION['LastActivity']))) { header('Location: http://www.example.com/?p=Must_Login'); } 

И, кажется, в первый раз я вхожу в систему и перенаправляется на панель account.php. Значения сеанса не заданы и перенаправляются обратно на страницу Must_Login. Я снова вхожу в систему (та же самая страница входа в систему, которую я использую в первый раз, но во второй раз, когда я вхожу в систему, она устанавливает значения сеанса, и все в порядке.

Большое вам спасибо за вашу помощь заранее!

Solutions Collecting From Web of "PHP: необходимо дважды войти в систему до тех пор, пока не будут установлены переменные сеанса"

РЕШЕНИЕ: после многих часов поиска, похоже, эта проблема возникает, когда я обращаюсь к своему сайту без добавления «www». перед доменом. так что произошло на самом деле, я входил в систему с mydomain.com/login.php, где-то меняет сессию, что мой элемент управления не распознает, поэтому он перенаправляет меня обратно на http://www.mydomain.com/login.php, что когда Я вхожу в систему, все работает Хорошо.

когда я вхожу в систему с сайта http://www.mydomain.com/login.php (с www.), он регистрируется правильно с первого attemp.

Поэтому я добавил код, чтобы убедиться, что у меня всегда есть URL в URL:

 if ($_SERVER['HTTP_HOST'] == "mydomain.com") { $url = "http://www." . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; header("Location: $url"); } 

и теперь все работает хорошо. Надеюсь, это поможет кому-то.

Подключайтесь к базе данных до того, как ваши члены выбирают.

Запустите сеанс, если он еще не запущен. Подключитесь к серверу и выберите базу данных перед запросом.

 if (!isset($_SESSION)) { session_start(); } mysql_connect("localhost","DBusername","DBuserPass") or die ("could not connect to mysql"); mysql_select_db("databaseName") or die ("no database"); if ((isset($_SESSION['UserName']))&&(isset($_SESSION['LastActivity']))) header ('Location: http://www.mysite.com/Account.php'); if (isset($_POST['username'])) { $username = mysql_real_escape_string($_POST['username']); $password = md5($_POST['password']); $sqlCommand = sprintf( "SELECT * FROM Members WHERE UserName = %s AND Password = %s", mysql_real_escape_string( $_POST['username'] ), md5( $_POST['password'] ) ); $result = mysql_query( $sqlCommand ); $rowsnr = mysql_num_rows( $result ); if (mysql_num_rows( $result ) > 0) { $_SESSION['UserName'] = mysql_real_escape_string( $_POST['username'] ); $_SESSION['LastActivity']= time(); sleep(2); mysql_query(sprintf("UPDATE Members SET LastLogin = NOW() WHERE UserName = %s", mysql_real_escape_string( $_POST['username'] ))); mysql_close(); echo '<meta http-equiv="Refresh" content="0;url=http://www.mysite.com/Account.php?p=Login_Success"/>'; } else { mysql_close(); echo '<div id="error_msg">Error: Information entered are not correct. Please check and try again.</div>'; } } ?> 

Попробуйте ввести следующий код ПОСЛЕ того, как вы проверите вход в систему?

 session_start(); if ((!isset($_SESSION['UserName']))||(!isset($_SESSION['LastActivity']))) { header('Location: http://www.mysite.com/?p=Must_Login'); } 

Сессии PHP записываются в обработчик сеанса после того, как скрипт, который запустил сеанс, завершил выполнение. В вашем случае первый скрипт запустил сеанс и обновил имя пользователя «имя пользователя» и «lastactivity», а затем перенаправлен на другую страницу. Но все же значения сеанса находятся в памяти – не зарегистрированы для использования во втором скрипте.

Один из способов устранить проблему – позвонить

 session_write_close(); 

до (или после) sleep(2) ;

для получения дополнительной информации см. здесь

попробуйте session_set_cookie_params(0, '/', '.domain.com') перед вашим session_start ();

У меня была такая же проблема, в моем случае я перенаправлялся на адрес веб-сайта после входа в систему:

 header('Location: http://mywebsite.com'); die(); 

Даже ручное закрытие сеанса до перенаправления не помогло.

Я исправил его, перейдя на определенную страницу:

 header('Location: index.php'); die();