簡體   English   中英

PHP:必須先登錄兩次,直到設置了會話變量

[英]PHP : Must login twice until session variables are set

解決方案:經過幾個小時的搜索后,當我訪問我的網站而沒有添加“www”時,似乎出現了這個問題。 在域名之前。 所以實際發生的事情是,我正在使用example.com/login.php登錄設置會話,我的成員控件無法識別,因此它將我重定向回www.example.com/login.php,我登錄一切正常。

當我從www.example.com/login.php(使用www。)登錄時,它會從第一次嘗試正確登錄。

所以我添加了一個代碼,以確保我在URL中始終有www:

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('Y-m-d 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...

登錄表單(帶有action =“”)和方法發布)。

注意:我使用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頁面。 我再次登錄(我第一次使用相同的登錄頁面。但是第二次登錄時,它確實設置了會話值,一切正常。

非常感謝您的幫助!

解決方案:經過幾個小時的搜索后,當我訪問我的網站而沒有添加“www”時,似乎出現了這個問題。 在域名之前。 所以實際發生的事情是,我正在使用mydomain.com/login.php登錄某個地方設置會話,我的會員控制無法識別,所以它將我重定向回www.mydomain.com/login.php,那時候我登錄一切正常。

當我從www.mydomain.com/login.php(使用www。)登錄時,它會從第一次嘗試正確登錄。

所以我添加了一個代碼,以確保我在URL中始終有www:

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會話將寫入會話處理程序。 在您的情況下,第一個腳本啟動會話並更新會話變量'username'和'lastactivity',然后重定向到另一個頁面。 但是會話值仍在內存中 - 未注冊以在第二個腳本中使用。

解決問題的一種方法是打電話

session_write_close();

sleep(2) (或之后) sleep(2) ;

有關更多信息,請參閱此處

在session_start()之前嘗試session_set_cookie_params(0, '/', '.domain.com') );

我有完全相同的問題,在我的情況下我登錄后重定向到網站地址:

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

甚至在重定向之前手動關閉會話也無濟於事。

我通過改為重定向到特定頁面來修復它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM