Je construis un site Web qui comprend une page de connexion. J'ai besoin de rediriger l'utilisateur vers sa page de profil une fois qu'il s'est connecté avec succès, mais je ne sais pas comment le faire en PHP (c'est mon premier site).
J'ai fait des recherches sur Internet et on m'a dit que la fonction header() devrait faire l'affaire, mais elle ne fonctionnera que si je n'ai pas sorti d'informations avant de l'utiliser.
C'est là que le bât blesse. J'ai sorti un tas d'informations (y compris le HTML pour construire la page de connexion elle-même).
Alors comment puis-je rediriger l'utilisateur d'une page à l'autre ?
Quelles sont les options dont je dispose ? Par ailleurs, quelle est la meilleure pratique dans ces cas-là ?
EDIT : Voici l'intégralité de ma page login.php
<?php
session_start();
echo "<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Sprout</title>
<link rel='stylesheet' href='stylesheet.css' type='text/css'>
</head>
<body>
<div class='box'>
<form action='login.php' method='post'>
Name<br /> <input type='text' name='username' class='form'/><br />
Password<br /> <input type='password' name='password' class='form'/>
<input type='submit' value='Login' class='button' />
</form>
</div>
</body>
</html>";
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$username = $_POST["username"];
$password = $_POST["password"];
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "root";
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database");
$dbname = "database";
mysql_select_db($dbname);
$query = "SELECT username FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($query) or die ("Failed Query of " . $query);
while($row = mysql_fetch_assoc($result))
{
$_SESSION["user"] = $username;
}
}
?>
Voilà le problème. J'ai sorti un tas d'informations (y compris le HTML pour construire la page de connexion elle-même). Alors comment puis-je rediriger l'utilisateur d'une page à l'autre ?
Cela signifie que la conception de votre application est assez défaillante. Vous ne devriez pas effectuer de sortie alors que votre logique métier est en cours d'exécution. Utilisez un moteur de modèles (comme [Smarty][1]) ou résolvez rapidement le problème en utilisant [output buffering][2]).
Une autre option (qui n'est pas la bonne cependant !) serait d'envoyer du JavaScript pour rediriger :
<script type="text/javascript">location.href = 'newurl';</script>
[1] : http://www.smarty.net/ [2] : http://php.net/manual/en/ref.outcontrol.php
En supposant que vous utilisez des cookies pour la connexion, appelez-le après votre appel setcookie
-- après tout, vous devez aussi l'appeler avant toute sortie.
De toute façon, en général, vous pouvez vérifier la présence du nom du bouton d'envoi de votre formulaire au début du script, faire votre logique, et ensuite produire des résultats :
if(isset($_POST['mySubmit'])) {
// the form was submitted
// ...
// perform your logic
// redirect if login was successful
header('Location: /somewhere');
}
// output your stuff here
Vous pouvez utiliser ob_start();
avant d'envoyer la sortie. Cela indiquera à PHP de garder toute la sortie dans un tampon jusqu'à la fin de l'exécution du script, afin que vous puissiez toujours modifier l'en-tête.
Habituellement, je n’utilise pas le buffer de sortie, pour les projets simples, je garde toute la logique dans la première partie de mon script, puis j’envoie tout le HTML
.