2010-03-24 6 views
1

J'ai écrit un très très très simple !! script en php. redirection d'en-tête ne fonctionne pas. 1- codage: UTF-8 sans nomenclature 2- en ajoutant ob_start() le problème est en cours. Qu'est-ce qui ne va pas dans mon code?header() fonction dans php: Aucune redirection!

login.php:

<?php session_start(); 
    require_once("funcs.php"); 
    db_connection(); 
    $username = $_POST['username']; 
    $password = $_POST['pwd']; 
    $submit = $_POST['login']; 
    if($submit){ 
    if (!filled_out($_POST)) { 
       echo "please fill all fields"; 
      } 
    else{ 
     $query = "SELECT * FROM *** WHERE username ='{$username}' AND password ='{$password}'"; 
     $result = mysql_query($query); 
      if(mysql_num_rows($result) == 1){ 
       $found_user = mysql_fetch_array($result); 
       $_SESSION['id'] = $found_user['id']; 
       $_SESSION['username'] = $found_user['username']; 
       $_SESSION['password'] = $found_user['password']; 
       setcookie(session_name(), '', time()+86400, '/'); 
       header("Location: tst.php"); 
       } 
       else{ 
        echo "incorrect username or password"; 
       } 

      } 
     }  


?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 
<body> 
<form id="form1" name="form1" method="post" action=""> 
    <p> 
    <label for="username"> 
     Username: 
    </label> 
    <input type="text" name="username" id="username" /> 
    </p> 
    <p> 
    <label for="textfield"> 
     Password 
    </label> 
    <input type="password" name="pwd" id="pwd" /> 
    </p> 
    <p> 
    <input name="login" type="submit" id="login" value="Log in" /> 
    </p> 
</form> 
</body> 
</html> 
<?php 

db_disconnect(); 

?> 

et tst.php:

<?php session_start(); 
    require_once("funcs.php");  
    if (!isset($_SESSION['id'])){ 
      header("Location : login.php"); 
     } 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 
<body> 
<table id="structure"> 
    <tr> 
    <td id="navigation">&nbsp;</td> 
    <td id="page"><?php echo "welcome"."". $_SESSION['username']; ?></td> 
    </tr> 
</table> 
</body> 
</html> 

wthit Oppening tst.php directement, en-tête() doesnot redirigent vers login.php

+3

Il serait utile si vous pouvez formater votre code correctement - faire des retraits et des alignements d'ouverture et de fermeture, etc. –

Répondre

1

Je suppose que la redirection fonctionne, mais vous remplacez le Cookie de session avec une valeur vide. Ainsi, le fichier tst.php crée une nouvelle session vide et redirige vers login.php.

Essayez:

// DELETE this line: setcookie(session_name(), '', time()+86400, '/'); 
header("Location: tst.php?".SID); 

importent: en-tête + session de besoin toujours SID pour ne pas perdre la session!

Corrigé: Merci à @Pekka.

+0

Merci Felix; Son maintenant rediriger! Mais: L'URL demandée /tst.php& n'a pas été trouvée sur ce serveur. J'ai utilisé l'en-tête ("Location: tst.php &". SID); –

+2

@Fixix +1 pour les yeux d'aigle! @jasmine vous devez lancer la requête avec un '?' et non un '&'. –

+0

@Felix, @pekka et tout le monde Je t'aime. Maintenant ça marche. J'ai appris beaucoup de choses de vos réponses. –

4

Essayez ajout de matrice():

header("Location: tst.php"); 
    die(); 

Vous devez toujours ajouter un die() car un en-tête de localisation est juste une requête au navigateur pour changer la page. Si vous n'avez pas die(), le reste de la page atteindra toujours le navigateur, y compris éventuellement des données sensibles que l'utilisateur n'est pas censé voir.

+0

Salut pekka et merci pour l'attention; J'ai ajouté die() mais il n'y a pas encore de redirection. http://lgn.designer-depot.com/login.php utilisateur: yassi pass: 1111 –

+0

J'ai utilisé firebug et vu le html dans l'onglet net de la page sur l'envoi de ce formulaire et il semble qu'il sort trois pages valeur des formulaires de connexion. donc il redirige plusieurs fois, ou simplement l'impression de tout le code de login.php trois fois. vous ne le verrez pas si vous ne voyez que la source car firefox analyse les balises html supplémentaires. – Samuel

+0

Y a-t-il un bug dans mon script? C'est un script très très simple !! Si oui, quel est le problème? Ou y a-t-il des bugs dans le langage php? ... –

0

En plus des autres réponses, l'en-tête Location: doit contenir une URL absolue, un exemple d'en-tête ("Location: http://example.com/");

+1

Toujours bon à faire, mais pas un must. –

3

Essayez de supprimer l'espace après « Localisation »:

header("Location: login.php"); 

S'il vous plaît écouteront ma commentaire sur le formatage de votre code correctement car il est extrêmement difficile de repérer tout ce qui peut être mal.

+0

J'ai édité ceci. S'il vous plaît donnez-moi assez de "temps" pour éditer ceci après avoir commenté !!! –

+0

Merci andy, l'espace supplémentaire entre l'emplacement et colan était la raison pour moi pour aucune redirection. – noobcode

2

Vérifiez les espaces vides avant l'ouverture des étiquettes <?php. Il est difficile de savoir si votre formatage existe, mais les espaces seront envoyés avant que votre code ne s'exécute, évitant ainsi les en-têtes. Vérifiez également l'espace blanc après la fermeture des étiquettes dans les fichiers inclus. (Meilleure pratique consiste à omettre les balises de fermeture au total)

ancienne réponse

Vous utilisez setcookie() qui va envoyer les en-têtes, puis essayer de rediriger. Vous ne pouvez pas rediriger une fois que les en-têtes ont été envoyés. (désolé, c'était incorrect)

+3

Pas vrai AFAIK. Vous pouvez faire une redirection d'en-tête après avoir envoyé d'autres en-têtes - vous ne pouvez rien sortir dans le corps. –

+1

Vous ne pouvez pas définir un en-tête une fois que celui-ci a déjà été envoyé, ce qui correspond à ce que produit le corps. 'setcookie()' n'envoie aucun en-tête, * il les définit juste * quand tous les en-têtes sont envoyés. –

1

En-tête n'est pas seulement une fonction PHP. Il modifie vraiment une partie de l'en-tête http, il est donc impossible d'avoir une partie d'en-tête, puis des données html, puis un autre en-tête. Pour que cela fonctionne, vous devriez mettre votre en-tête au début du fichier, avant que toute sortie html ne soit faite.

1

La redirection peut prendre une URL relative ou absolue. Le problème est avec l'espace AVANT le côlon. Essayez comme ceci:

header("Location: whatever.php"); 
0

vous devez mettre une sortie() ou mourir() après la fonction d'en-tête - sinon le reste du script continuera à exécuter.

+0

rien redirige avec die() ... –

+0

il ne sera pas rediriger avec die() - vous avez besoin de die() (ou de sortie) après l'en-tête(). Dans le cas contraire, vous envoyez simplement du code HTML directement après le contenu de l'en-tête et ce sera affiché au lieu que le navigateur prenne en compte l'en-tête "Location" que vous envoyez au navigateur. – kguest