3 votes

Mysqli et la connexion avec une identité d'utilisateur de session

Je viens de commencer à apprendre mysqli hier soir et j'ai actuellement un problème avec une fonction que j'ai créée. La fonction doit connecter l'utilisateur. Cependant, lorsque je tape un nom d'utilisateur existant avec le mot de passe authentique ou inventé, la page de connexion se recharge en affichant le message suivant $user_id . Je ne sais pas ce qui ne va pas. Je n'avais pas ce problème lorsque j'avais mysql.

/** 
 * Returns FALSE, if no valid user found
 * Returns user_id of matching user with $username and $password
 */
function login ($mysqli, $username, $password) {

    // not required at all
    // $user_id = user_id_from_username($mysqli, $username);

    // initialize, in case we do not get a mysqli-statement
    $userID = FALSE;
    $password = md5($password);
    $stmt = $mysqli->prepare(
                     "SELECT `user_id`          "
                   . "  FROM `users`            "
                   . " WHERE ( `username` = ? ) "
                   . "   AND ( `password` = ? ) "
            );

    if ( $stmt ) {
        $stmt->bind_param('ss', $username, $password);  
        $stmt->execute();
        $stmt->bind_result($userID);
        if ( TRUE !== $stmt->fetch()) {
            $userID = FALSE;
        }
    }
    $stmt->close();
    return $userID; 
}

Et voici quand j'appelle la fonction login dans la page de connexion. $mysqli est la variable contenant la connexion à la base de données.

// Now, needs to check against FALSE to work [changed by @SteAp]

//   var_dump( $login ); returns with int(1) 
//   and this is what I want, the integer 1

//Sends me to start.php but start.php does not recognize 
//the variable $_SESSION['user_id']
if ( FALSE === ($login = login($mysqli, $username, $password)) ) {  
  $errors[] = 'That username/password combination is incorrect';
} else {
  $_SESSION['user_id'] = $login;
  header('Location: start.php');
  exit();
}

if (empty($errors) === false) {
  echo '<div>'. output_errors($errors) . '</div>';
}

1voto

Eduard Luca Points 1968

Remplacez la ligne suivante :

if ($return == 1) {echo $user_id;} else {return false;}

con

if ($return == 1) {return $user_id;} else {return false;}

Dans votre exemple, vous écrivez le $user_id dans le navigateur, au lieu de la renvoyer à la fonction qui l'appelle.

0voto

SteAp Points 5498

Retourne l'identifiant de l'utilisateur, pas le nombre :

if ($stmt = $mysqli->prepare("SELECT `user_id` FROM `users` WHERE `username` = ? 

Alors utilisez-le comme ceci :

$stmt->bind_result($return);

if ( TRUE !== $stmt->fetch() ) {
  $return = FALSE
}

$stmt->close();

return $return;

Maintenant, $return si l'un ou l'autre FALSE ou le user_id de l'enregistrement trouvé.

Et, certainement, vous devez démarrer une session avant toute l'affectation à $_SESSION est transmise . Exemple de Manuel PHP :

page1.php

session_start();

echo 'Welcome to page #1';

$_SESSION['favcolor'] = 'green';
$_SESSION['animal']   = 'cat';
$_SESSION['time']     = time();

// Works if session cookie was accepted
echo '<br /><a href="page2.php">page 2</a>';

page2.php

session_start();

echo 'Welcome to page #2<br />';

echo $_SESSION['favcolor']; // green
echo $_SESSION['animal'];   // cat
echo date('Y m d H:i:s', $_SESSION['time']);

// You may want to use SID here, like we did in page1.php
echo '<br /><a href="page1.php">page 1</a>';

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