2010-08-04 7 views
0

Je suis en train d'écrire un script de connexion. Mon db.php ne fait pas écho/imprime quoi que ce soit, alors pourquoi ne pas en-tête ("Location: index.php"); rediriger en cas de connexion réussie? les informations de connexion sont correctes. Je sais que j'ai besoin d'assainir l'entrée, mais ce n'est pas un problème pour le moment.Pourquoi ma redirection php ne fonctionne-t-elle pas?

<?php 
     require('db.php'); 
     $username = $_POST['un']; 
     $password = $_POST['pw']; 
     $qry="SELECT uid FROM users WHERE name='$username' AND pass='".md5($password)."'"; 
     $result=mysql_query($qry); 
     if(mysql_num_rows($result) == 1){ 
      session_regenerate_id(); 
      $user = mysql_fetch_assoc($result); 
      $_SESSION['S_UID'] = $user['uid']; 
      session_write_close(); 
      header("Location: index.php"); 
      exit(); 
     }else{ 
      echo "<center><form action='index.php' name='login'>Login failed! Please try again with correct username and password.<br><input type='submit' name='failed' value='Return to Login'></form></center>"; 
      exit(); 
     } 
    ?> 
+0

Essayez de supprimer l'appel 'exit()' et voyez si cela fonctionne. – NullUserException

+0

Que se passe-t-il à la place? – Artefacto

+0

@NullUserException: pour quelle raison? – zerkms

Répondre

2

l'en-tête de la fonction ne fonctionnera que si aucune sortie n'a été envoyé par le script avant que la fonction est appelée. Vérifiez si les codes ci-dessus ont fait écho quelque chose. Si ce n'est pas le cas, vérifiez que les fichiers d'inclusion ci-dessus n'ont pas d'espace supplémentaire ou de retour à la ligne après la balise de fermeture "?>". Sinon, cet espace ou nouvelle ligne sera envoyé au navigateur avant votre en-tête.

+0

Je n'ai même pas pensé à un espace après ma balise/closing/php .... j'en avais un. – Dacto

+0

Désolé, si ma mémoire ne me manque pas ... si des sorties ont été envoyées, et que vous essayez de modifier l'en-tête, cela provoquera une exception de php ... Je pense que ça doit être quelque chose avec l'URL qu'il est rediriger vers ... –

+0

Une pratique courante que je fais maintenant est de supprimer la dernière fermeture de PHP "?>" du tout. les scripts seront toujours exécutés, et il n'y a aucun danger de cet espace supplémentaire. Une autre façon consiste à activer la mise en mémoire tampon de sortie tout en haut du fichier. Cela empêchera que des éléments ne soient envoyés au navigateur jusqu'à la fin du traitement (ou au moins jusqu'à ce que ob_flush soit appelé). – iWantSimpleLife

0

Etes-vous sûr qu'aucune sortie n'est produite quelque part dans le script (ou db.php)? Pas même quelques espaces étrangers?

+0

Il/elle devrait avoir des erreurs (c.-à-d.: En-têtes déjà envoyées par) si c'était le cas. Activer le rapport d'erreurs (ie: 'error_reporting (E_ALL)') – NullUserException

0

Essayez d'utiliser l'URL complète par exemple:

header("Location: http://www.mysite.com/index.php"); 

Certains navigateurs (IE grâce) ne comprend pas le code 301 redirect avec URI inachevés.

Ce comportement de l'emplacement d'en-tête en PHP est un bon outil, mais facile à mettre en œuvre dans le scénario incorrect ... à cet effet j'envisager d'utiliser require() au lieu de header(location)

comme:

if (!imLoggedIn()){ 
    require('loginForm.php'); 
    exit; 
} 
Questions connexes