2010-07-27 8 views
0

Je fais un système d'enregistrement avec un vérificateur de courrier électronique. Votre type typique "utiliser ce code pour vérifier" type de chose. Je veux qu'une variable de session soit stockée, de sorte que lorsque les gens complètent leur enregistrement de compte sur la page d'inscription et retournent d'une manière ou d'une autre sur la page accident, cela leur rappelle qu'ils doivent activer leur compte avant utilisation.PHP: Remarque: Indéfini où la variable de session est définie

Ce qui rend ce problème si difficile à diagnostiquer, c'est que j'ai utilisé de nombreuses autres variables de session de manière similaire, mais celle-ci ne fonctionne pas du tout. Voici mon approche:

/* This is placed after the mail script and account creation within the same if 
statement. Things get executed after it, so I know it's placed correctly. */ 

$_SESSION['registrationComplete'] = TRUE; 

// I've tried integer 1 and 'Yes' as alternatives. 

Maintenant, pour vérifier la variable, j'ai placé cela en haut de la page.

echo $_SESSION['registrationComplete']; // To see if it's setting. This gives the 
             // undefined index notice. 

if (isset($_SESSION['registrationComplete'])) { 

// Alternatively, I have nested another if that simply tests if it's TRUE. 

    echo $_SESSION['registrationComplete']; // When echo'd here, it displays nothing. 

    echo '<p>Congratulations, Foo! Go to *link to Bar*.</p>'; 

} 

Maintenant, j'avais l'habitude d'avoir la page rediriger vers une nouvelle page, mais je l'ai sorti pour le tester. Lorsque la page se recharge de submit, mon message dans l'instruction if ci-dessus apparaît et puis j'obtiens un Notice: Undefined index: registrationComplete blah blah de l'écho de la session var! Puis, si jamais je retourne à la page, il ignore l'instruction if tous ensemble.

J'ai testé pour les fautes de frappe et tout, en effaçant les variables de session au cas où les anciennes des tests interféraient, mais je n'ai pas de chance. Beaucoup de Google montre juste les gens supprimant ces erreurs, mais cela semble fou! Non seulement cela, mais je n'obtiens pas la même persistance des variables de session ailleurs sur mon site. Quelqu'un peut-il signaler si je fais quelque chose de flagrant? Aidez-moi! Merci! Pour info, j'ai lu plusieurs questions connexes et je suis aussi un débutant, donc je ne sais pas comment utiliser certains conseils sans explication.

Comme demandé, plus de code, largement annoté pour le garder bref

var_dump($_SESSION); 

// It's here to analyze that index message. I guess it's not important. 
echo $_SESSION['registrationComplete']; 

if (isset($_SESSION['registrationComplete'])) { 

    // The golden ticket! This is what I want to appear so badly. 
    echo 'Congratulations, Foo! Go to *link to Bar*.'; 

} 


// Explanation: I don't want logged in users registering. 
// The else statement basically executes the main chunk of code. 

if (isset($_SESSION['user_id'])) { 

    echo 'You are logged in as someone already.'; 

} 

else { 

    if (isset($_POST['submitRegister'])) { 

     // Code: Database connection and parsing variables from the form. 

     if (!empty($email) && !empty($email2) && $email == $email2 && !empty($displayName) && !empty($password) && !empty($password2) && $password == $password2) { 

      // Code: Query to retrieve data for comparison. 

      if (mysqli_num_rows($registrationData) == 0) { 

       // Code: Generates the salt and verification code. 

       // Code: Password hashing and sending data to verify database. 

       // E-mail the verification code. 

       $_SESSION['registrationComplete'] = 'yes'; 

      } 

      else { 

       // Some error handling is here. 
       $registerError = 'The e-mail address you entered is already in use.'; 

      } 

     } 

     // the elseif, elseif, and else are more error handling. 

     elseif ($email != $email2) { $registerError = 'Your e-mails did not match'; } 

     elseif ($password != $password2) { $registerError = 'Passwords didn\'t match.'; } 

     else { $registerError = 'Filled out completely?'; } 

     // If the registration was submitted, but had errors, this will print the form again. 

     if (!isset($_SESSION['registrationComplete'])) { require_once REF_DIR . REF_REGISTERFORM; } 


     // IMPORTANT! it turns out my code did not work, I forgot I had the same statement elsewhere. 
     else { echo 'Congratulations, Foo! Go to *link to Bar*.'; } 
    } 

    // Creates form. 

    else { require_once REF_DIR . REF_REGISTERFORM; } 

} 
+1

Assurez-vous que session_start est appelée en haut de la page pour continuer la session? http://php.net/manual/en/function.session-start.php –

+0

Combien de données stockez-vous dans les variables de session? –

+0

@Jack: Oui. Un gros morceau du site qui contient session_start() est ajouté au contenu via require_once. Si quelque chose n'allait pas, il me manquerait aussi la moitié de mon site, donc je pense qu'il peut être sûr de l'exclure. – Tarik

Répondre

3

Cela s'est traduit par les bases du débogage/dépannage. Comprendre autant que possible sur la technique/bibliothèque/fonction/tout ce que vous essayez d'utiliser.

  • Inspectez les parties saillantes et assurez-vous qu'elles répondent à vos attentes ou à ce qu'elles devraient être. (Il y a une légère différence entre les deux, selon la situation.)
  • Si cela ne vous amène pas vers une solution, prenez du recul et assurez-vous de bien comprendre la situation. Cela peut signifier simplifier les choses afin que vous ne traitiez que du problème en question, c'est-à-dire créer un cas de test distinct, plus simple, qui expose le même problème. Ou, cela peut simplement signifier que vous arrêtez de coder et que vous travaillez à travers le flux de votre code pour vous assurer qu'il fait vraiment ce que vous pensez qu'il est en train de faire.Un problème typique avec les sessions qui ne fonctionnent pas est d'oublier d'utiliser session_start() (près ou en haut) de n'importe quelle page qui utilise des sessions.

    Un de mes extraits préférés de code PHP, pour le débogage:

    print '<pre>'; 
    var_dump($some_variable); 
    print '</pre>'; 
    

    J'essaie d'utiliser print pour le débogage et echo pour la sortie régulière. Il est plus facile de repérer le code de débogage, une fois qu'il dépasse quelques bits de sortie triviaux.

    Pendant ce temps, var_dump va imprimer un peu plus d'informations sur la variable, comme son type et sa taille. Il est important de l'entourer de <pre></pre> afin qu'il soit plus facile de lire la sortie.

  • 0

    Essayez

    if (!empty($_SESSION['registrationComplete'])) { 
    
    +0

    Pas de chance, mais merci d'avoir essayé. Cela me donne exactement le même résultat que isset. Donc, je peux conclure qu'il se met en place comme quelque chose, je ne sais pas pourquoi il perd sa persistance. Et s'il est défini avant que la variable ne soit référencée, pourquoi devrais-je obtenir une erreur Undefined Index? Hmm. – Tarik

    +0

    @Tarik pouvez-vous confirmer à 100% que c'est la bonne ligne et le bon fichier dans le message d'erreur? –

    +0

    Oui. L'avis d'index indéfini apparaît partout où j'essaie d'écrire $ _SESSION ['registrationComplete'] à l'exception de l'instruction isset if. Je n'arrive pas à comprendre pourquoi il ne se couche pas ou ne reste pas réglé? – Tarik

    0

    Si vous obtenez l'avertissement après que le message est imprimé, ce ne peut pas venir de la variable faisant écho parce que selon votre code il serait jeté avant d'imprimer ce message. Êtes-vous sûr de ne pas utiliser $ _SESSION ['registrationComplete'] au-delà de l'instruction if? Essayez d'ajouter exit ou die() avant le crochet de fermeture du if et voyez si la notification disparaît.

    +0

    Désolé, mon erreur. J'obtiens l'erreur si je la référence avant if (isset ['registrationComplete']). Je l'ai sorti pour que je puisse voir si la variable avait une valeur. Lorsque je place l'écho dans l'instruction if mentionnée précédemment, le message d'erreur n'apparaît pas, mais le problème de sa persistance subsiste. – Tarik

    Questions connexes