8791 sujets

Développement web côté serveur, CMS

Bonsoir à tous,

Voilà je suis entrain de créer un formulaire "Login" dans lequel l'utilisateur (ici un admin...) saisit son username et son password, il clique ensuite sur le bouton login pour accéder au Panneau d'administration.

Mon problème est : quand je suis en local (je travail avec WAMPServer), ma redirection fonctionne parfaitement. Mais lorsque j'upload mon code via le FTP sur mon serveur en ligne...hé ben la redirection ne fonctionne pas du tout. Pourtant je n'ai aucun message d'erreur.

Je poste ici mes codes (je travaille avec le modèle MVC et donc j'ai séparé mon code en 2):

Code de ma page "vue" : login_vue.php

<div>
	<h1>Login</h1>  
		<div>
		<form name = "login" action="<?php echo $_SERVER["REQUEST_URI"];?>" method="post">
				<label>Username:</label>
					<input type="text" id="username" name="username" value = "<?php if (isset ($_POST["login"])) echo $_POST["login"]?>"/>
				<label>Password:</label>
					<input type="password" id="password" name="password" value = "<?php if (isset ($_POST["password"])) echo $_POST["password"]?>"/>
					<input type="submit" value="Login" name="submit" class="submit" />
		</form>		
		</div>
	<p style="clear:both" /> 
</div> 
<?php
		include 'login_controller.php';
?>


Et voici le code pour ma page "controller" : login_controller.php

<?php
	/*Quand l'utilisateur clique sur le bouton "Se connecter"*/
		if(isset($_POST['submit']))
		{
			/*Vérifier si tous les champs sont remplis*/
			if(empty($_POST['username']) || (empty($_POST['password'])))
			{
				/*Un message d'erreur apparait si tous les champs ne sont pas remplis*/
				echo "<font color='#FF0000'>Vous n'avez pas rempli tous les champs !!</font>";
			}
			else
			{
				header("Location: index.php?p=admin.php");
			}
		}	
?>


PS : Bon pour l'instant je n'ai pas fait de lien avec une base de donnée, je vérifie juste si les champs ne sont pas vides. S'ils sont remplis, j'envoie directement sur la page "admin.php"

Merci de votre temps et de vos réponses Smiley smile
Modifié par manchester_010 (02 Sep 2011 - 18:53)
Les fonctions comme header() et ceux reliés aux cookies entre-autre, ne peuvent être envoyé qu'avant que le moindre bit de donnée public (par exemple html) ne commence à être envoyé par le processeur PHP à Apache.

Pour que ça marche, tu devras remonter ta fonction appelant header() tout au haut de ta page. Il faudra évidemment t'assurer qu'aucun espace blanc (espace, tabulation, retour à la ligne) ne soit présent avant que ta fonction ne soit appelé (et on parle bien d'appelé!!)

Un exemple:

Pas bon ->

<!-- ma page X, ceci est un espace blanc et du contenu HTML généré avant l'appel à header() -->
<?php
 header();
?>


Pas bon->

<?php
  function redirect_to($url){
     header($url);
  }
?>
<html>
  <body>
    <?php redirect_to("http://google.ca"); ?>
  </body>
?>


OK ->

<?php
  function redirect_to($url){
     header($url);
  }

  redirect_to("http://google.ca");
?>
<html>
  <body>
  </body>



Il y a aussi une autre technique qui ralentira le processus de PHP, alors je la déconseille. Mais elle te permettrait de garder ton code tel quel - autant s'y faire avec la manière correct dans ton cas. Mais en cas d'utilisation bien précise tu pourras rechercher là dessus.

Pour le message d'erreur, ces derniers doivent être désactivés sur ton serveur, c'est fréquent.
Modifié par Vaxilart (02 Sep 2011 - 05:34)
Attention.
Ne pas oublier le exit après la redirection, sinon on s'expose à une faille potentielle.

Quand à la solution de la mise en cache, c'est inadapté dans ce cas précis, en effet.
Merci pour vos réponses.

Mais dans mon cas, moi je veux que c'est que lorsque l'utilisateur clique sur le bouton "Login" c'est à ce moment-là que j'utilise la fonction header(). Donc si je fais appel à header() tout en haut de ma page, ca ne servira à rien, non ?

UP : J'ai essayé de modifier mon code :

Tout au sommet de ma page index.php :


<?php
function redirect_to($url){
	
     header("Location:".$url);

  }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
   <head>
     ....
   </head>
   <body>
      .....
   </body>
</html>


Dans mon code de la page "login_controller.php" :


<?php
	/*Quand l'utilisateur clique sur le bouton "Se connecter"*/
		if(isset($_POST['submit']))
		{
			/*Vérifier si tous les champs sont remplis*/
			if(empty($_POST['username']) || (empty($_POST['password'])))
			{
				/*Un message d'erreur apparait si tous les champs ne sont pas remplis*/
				echo "<font color='#FF0000'>Vous n'avez pas rempli tous les champs !!</font>";
			}
			else
			{
				
				[#red]redirect_to("index.php?p=admin.php");[/#]
			}
		}	
?>


Localement ça marche, mais en ligne...nada...Je commence à me douter si c'est pas une erreur du côté de mon hébergeur...mais je pense pas...
Modifié par manchester_010 (02 Sep 2011 - 16:30)
Pourquoi ne pas... faire un lien ?

Ca a beau être en haut de page, tu dois quand même être attentif à n'avoir AUCUNE sortie standard auparavant, qu'il s'agisse d'echo (print et associés), de fermeture de tag php, d'espace ou quoi avant l'ouverture (et ce, compris dans les fichiers inclus), ni même de BOM.

Et attention, encore une fois, au exit. De nombreux sites comportent cette faille, qui, selon le contexte, peut être joliment exploitée.
Comme je te le disais, si tu appelle une fonction qui redirige à partir du corps de ta page (donc avec des balises HTML plus haut dans la page - même si on utilise un include) ça ne fonctionnera pas.

Dès que PHP croise un espace blanc ou une balise HTML, il commence à envoyer ses informations à Apache. Et dès ce moment là, il est alors trop tard pour faire une redirection.

Dans ton cas, comme tu as un formulaire, quand on envoie le formulaire, on reload la page. Tu n'as qu'à capturer ton $_POST en haut de ta page.
Oui merci pour ton aide. Mais finalement, j'ai opté pour un lien. Lorsque les login et le password correspondent avec ce qui existe dans la base de donnée, j'affiche un lien et en cliquant ce lien, l'utilisateur arrive sur le Panneau d'administration. Smiley smile

Merci pour votre aide Smiley smile