3 votes

PHP : Doit se connecter deux fois jusqu'à ce que les variables de session soient définies

SOLUTION : Après de nombreuses heures de recherche, il semble que ce problème se produisait lorsque j'accédais à mon site web sans ajouter le "www." avant le domaine. Donc ce qui se passait réellement, c'est que je me connectais avec example.com/login.php qui établit une session quelque part, que mon contrôle des membres ne reconnaît pas, donc il me redirige vers www.example.com/login.php, que lorsque je me connecte tout fonctionne Ok.

Lorsque je me connecte à partir de www.example.com/login.php (avec le www.), il se connecte correctement dès la première tentative.

J'ai donc ajouté un code pour m'assurer que j'ai toujours le www dans l'URL :

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

et tout fonctionne bien maintenant. J'espère que cela aidera quelqu'un.


Donc, j'ai construit plus de 3 sites Web, et tous ont le même problème, je ne sais pas pourquoi, je dois me connecter deux fois jusqu'à ce que je sois vraiment connecté... (jusqu'à ce que les variables de session soient définies). L'aide est vraiment appréciée, j'essaie de résoudre ce problème et je cherche une solution depuis longtemps...

    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...

formulaire de connexion (avec action=""), et méthode post).

Note : J'utilise la balise html refresh, parce que je ne peux pas utiliser la redirection de l'en-tête (j'obtiens l'erreur que l'en-tête est déjà envoyé).

et dans le fichier example.com/Account.php je fais cette vérification en haut du code :

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

Et il semble que la première fois que je me connecte et suis redirigé vers le panneau account.php.. les valeurs de session ne sont pas définies, et me redirige vers la page Must_Login. Je me connecte à nouveau (même page de connexion que la première fois). Mais la deuxième fois que je me connecte, les valeurs de session sont définies et tout est OK.

Merci beaucoup d'avance pour votre aide !

7voto

shadyhossin Points 350

SOLUTION : Après de nombreuses heures de recherche, il semble que ce problème se produisait lorsque j'accédais à mon site web sans ajouter le "www." avant le domaine. Donc, ce qui se passait réellement, c'est que je me connectais avec mydomain.com/login.php qui établit une session quelque part, que mon contrôle des membres ne reconnaît pas, donc il me redirige vers www.mydomain.com/login.php, que lorsque je me connecte tout fonctionne Ok.

Lorsque je me connecte à partir de www.mydomain.com/login.php (avec le www.), il se connecte correctement dès la première tentative.

J'ai donc ajouté un code pour m'assurer que j'ai toujours le www dans l'URL :

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

et tout fonctionne bien maintenant. J'espère que cela aidera quelqu'un.

0voto

Marius Darila Points 873

Connectez-vous à la base de données avant de sélectionner vos membres.

0voto

zkanoca Points 3077

Démarrer la session si elle n'a pas encore été lancée. Connectez-vous au serveur et sélectionnez la base de données avant d'effectuer une requête.

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>';
    }
}
?>

0voto

Naruto Points 1212

Essayez de mettre le code suivant APRÈS avoir vérifié la connexion ?

session_start();

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

0voto

Bere Points 1522

Les sessions PHP sont écrites dans le gestionnaire de session après la fin de l'exécution du script qui a lancé la session. Dans votre cas, le premier script a démarré la session et mis à jour les variables de session 'username' et 'lastactivity' puis a redirigé vers une autre page. Mais les valeurs de la session sont toujours en mémoire - non enregistrées pour être utilisées dans le second script.

Une façon de résoudre le problème est d'appeler

session_write_close();

avant (ou après) sleep(2) ;

pour plus d'informations, voir aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X