2017-10-14 4 views
0

Je redirige la page précédente après la connexion mais à l'intérieur de la fonction de connexion, ma session ne fonctionne pas.Session de travail lors de la redirection sur la page précédente

Explication en détail

Je suis sur ma contactus la page et je mets en haut de la page

session_start(); 
include('db/connection.php'); 
echo $_SESSION['url'] = $_SERVER['REQUEST_URI'];//here I am getting the name of page like /contactus.php 

maintenant de mon page contactez-nous, je clique sur le bouton de connexion et page réoriente sur la page de connexion. Là, je reçois le nom de mon onglet précédent. J'ai vérifié comme ça.

session_start(); 
echo $url = $_SESSION['url'];//getting name of previous tab like /contactus.php 

login.php

<?php 
$error_msg=""; 
$error_msg=isset($_SESSION['password_failed'])?$_SESSION['password_failed']:''; 
//server side session ,dispaying the error messgage if found any issue 
?> 
     <div class="text-center"><span class="server_side_error"><?php echo $error_msg; ?></span></div> 

    <form action="process?key=login" method="post" name="login" class="login_submit" autocomplete="off"> 
     <input type="email" class="form-control" id="email" name="email"> 
     <input type="password" class="form-control" id="pwd" name="password"> 
     <button type="submit" class="btn-reg btn-default">Login</button> 
    </form> 
<?php 
session_destroy(); 
?> 

Après avoir cliqué sur la page bouton de connexion est redirect à la page de processus, mais je ne reçois pas la valeur de la session

process.php

function login($conn) 
{ 
$username=$conn->real_escape_string(trim($_POST['email'])); 
$password =$conn->real_escape_string(trim($_POST['password'])); 

$sql_login="SELECT * FROM register WHERE email='$username'"; 
$run_user = mysqli_query($conn, $sql_login); 
if (mysqli_num_rows($run_user)>0) { 
    $row=mysqli_fetch_array($run_user); 
    $password_hash=$row['password']; 
    if (password_verify($password, $password_hash)) { 
     $_SESSION['email']=$row['email']; 
     $_SESSION['name']=$row['name']; 
     echo $_SESSION['url']//here I am not getting the session value 
     if(isset($_SESSION['url'])) { 
     echo $url = $_SESSION['url']; //here I am not getting the session value 
     } 
    header('Location: http://example.com/$url'); 
    } 
    else{ 
    $_SESSION['password_failed']="Email & Password does not match"; 
    header('location:login'); 
    } 
} 
else{ 
    $_SESSION['password_failed']="TThis email is not register with us"; 
    header('location:login'); 
} 

} 
+1

ajouter session_start(); dans votre process.php –

+0

@BarclickFloresVelasquez, j'ai déjà ajouté cela mais je ne l'obtiens toujours pas –

+0

Est-ce (session_start) avant que la fonction ne soit définie, ou à l'intérieur de celle-ci? – IncredibleHat

Répondre

0

Le problème principal, vous êtes face est due vous avez utilisé session_destroy() vous devez appliquer une condition sur elle comme

if(notlogin){ 
     session_destroy(); 
    } 

quelque chose de similaire comme ça ..

+0

Vous voulez dire que je dois utiliser quelque chose comme si (! $ _ SESSION ['email']) { session_destroy(); } –

+0

Je ne sais pas quel est votre état mais je veux seulement dire détruire la session quand vous en avez besoin car dès que vous détruisez la session il détruit complètement votre session c'est pourquoi vous ne pouvez pas obtenir l'URL si vous besoin de l'URL alors vous n'avez pas à le détruire .. – interntseekho

+0

mais que dois-je mettre là? Parce que je dois détruire la session –

0

Je vois maintenant l'énigme que vous faites face, et pourquoi vous avez un session_destory() en bas du login.php. Vous dites, "s'ils sont connectés, la session doit être effacée, car ils ne sont pas encore connectés".

Cela peut être vrai, mais vous effacez TOUT de la variable de session php.

considèrent donc ceci: (méthode 1, moins de changement de code)

contactus.php reste le même.

login.php changements avec:

<?php 
$error_msg=""; 
$error_msg=isset($_SESSION['password_failed'])?$_SESSION['password_failed']:''; 
$last_url=isset($_SESSION['url'])?$_SESSION['url']:''; 
?> 
    <div class="text-center"><span class="server_side_error"><?php echo $error_msg; ?></span></div> 
    <form action="process?key=login" method="post" name="login" class="login_submit" autocomplete="off"> 
     <input type="hidden" name="last_url" value="<?PHP echo htmlspecialchars($last_url);?>"> 
     <input type="email" class="form-control" id="email" name="email"> 
     <input type="password" class="form-control" id="pwd" name="password"> 
     <button type="submit" class="btn-reg btn-default">Login</button> 
    </form> 
<?php 
session_destroy(); 
?> 

Puis process.php:

function login($conn) 
{ 
     $last_url=trim($_POST['last_url']); 
     // ... using the now local $last_url variable in place of $_SESSION['url'] 
     ... rest of code ... 
} 

Ce que je fais ici, met la "url" de la session en le formulaire de connexion à transmettre en tant que variable POST normale que vous pouvez ensuite utiliser et traiter pendant la fonction de connexion. Depuis la "url" variable est parti de la session en raison de votre détruire.


Une autre méthode pour obtenir ce que vous voulez faire, mais implique plus de changements de code et la planification de tableau, est de mettre tous « état se connecter et info » réelle de l'utilisateur dans un subvariable du _SESSION $, puis n'utilisez jamais session_destory() ;.Donc, vous avez des variables comme celui-ci:

$_SESSION['user']['email'];// user state info 
$_SESSION['user']['name'];// user state info 

$_SESSION['url'];// to use to determine where they came from 
$_SESSION['password_failed'];// for return error messages on login 

Quand vous allez à détruire les utilisateurs informations de connexion, alors vous au lieu que supprimer l'utilisateur de la session:

unset($_SESSION['user']);// remove ONLY the user state info 

Après avoir affiché cette erreur vous sont le transfert de la session, vous pouvez videz simplement que l'erreur après avoir affiché sur la page:

unset($_SESSION['password_failed']); 

fois PHP des sessions sur son propre après inactivité de l'utilisateur, et nettoie également Sessio n fichiers du serveur après l'heure. Vous n'avez pas vraiment besoin d'appeler session_destroy(), à moins que vous ne souhaitiez vraiment nettoyer l'ensemble de la liste ou transférer la session vers un autre identifiant.

+0

J'utilise session_destory() en bas à cause de la validation côté serveur. J'ai mis le message de validation dans la session. Vous pouvez le vérifier dans ma fonction de connexion. –

+0

Vous pouvez effacer cette erreur de validation après l'avoir affichée à l'utilisateur. 'unset ($ _ SESSION ['password_failed']);' ... parce que si vous faites session_destroy, il ne va pas exister après avoir affiché cette page une fois de toute façon. – IncredibleHat