2011-08-06 7 views
1

Je reçois une erreur variable indéfinie pour $id variable dans les lignes 15 & 21, quelqu'un pourrait-il expliquer pourquoi? Je ne peux pas voir quel est le problème.Une variable indéfinie?

<?php 
function userIsLoggedIn() 
{ 
    if (isset($_POST['action']) and $_POST['action'] == 'login') 
    { 
     if (!isset($_POST['email']) or $_POST['email'] == '' or 
      !isset($_POST['password']) or $_POST['password'] == '') 
     { 
      $GLOBALS['loginError'] = 'Please fill in both fields'; 
      return FALSE; 
     } 
     $password = md5($_POST['password'] . 'chainfire db'); 

     if (databaseContainsAuthor($_POST['email'], $password, $id)) 
     { 
     include 'db.inc.php'; 
      session_start(); 
      $_SESSION['loggedIn'] = TRUE; 
      $_SESSION['email'] = $_POST['email']; 
      $_SESSION['password'] = $password; 
      $_SESSION['id'] = $id; 
      return TRUE; 
     } 
     else 
     { 
      session_start(); 
      unset($_SESSION['loggedIn']); 
      unset($_SESSION['email']); 
      unset($_SESSION['password']); 
      unset($_SESSION['id']); 
      $GLOBALS['loginError'] = 'The specified email address or password was incorrect.'; 
      return FALSE; 
     } 
    } 
    if (isset($_POST['action']) and $_POST['action'] == 'logout') 
    { 
     session_start(); 
     unset($_SESSION['loggedIn']); 
     unset($_SESSION['email']); 
     unset($_SESSION['password']); 
     unset($_SESSION['id']); 
     header('Location: ' . $_POST['goto']); 
     exit(); 
    } 
    session_start(); 
    if (isset($_SESSION['loggedIn'])) 
    { 
     return databaseContainsAuthor($_SESSION['email'], $_SESSION['password'], $_SESSION['id']); 
    } 
} 
function databaseContainsAuthor($email, $password, $id) 
{ 
    include 'db.inc.php'; 

    $email = mysqli_real_escape_string($link, $email); 
    $password = mysqli_real_escape_string($link, $password); 

    $sql = "SELECT COUNT(*) FROM author 
      WHERE email='$email' AND password='$password'"; 
    $result = mysqli_query($link, $sql); 

    if (!$result) 
    { 
     $error = 'Error searching for author.'; 
     include 'error.html.php'; 
     exit(); 
    } 
    $row = mysqli_fetch_array($result); 

    $sql = "SELECT id FROM author 
      WHERE email='$email'"; 
    $id = mysqli_query($link, $sql); 
    if (!$id) 
    { 
     $error = 'Error searching for id.'; 
     include 'error.html.php'; 
     exit(); 
    }  

    if ($row[0] > 0) 
    { 
     return TRUE; 
    } 
    else 
    { 
     return FALSE; 
    } 
} 

La variable $id est définie dans databaseContainsAuthor($email, $password, $id), puis stocké dans la session $_SESSION['id'] si naturellement $id = mysqli_query($link, $sql); aurait dû passer, mais ce n'est pas?

+0

duplication possible de ["Notice: Undefined variable" et "Notice: Undefined Index"] (http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index) – animuson

Répondre

1

quelques choses la variable $ id doit être définie (pas nécessaire mais bonne pratique) avant de l'utiliser

donc par exemple

$id = NULL; 
if (databaseContainsAuthor($_POST['email'], $password, $id)) 

fixeraient également l'id $ dans la fonction databaseContainsAuthor ne signifie pas que $ id change en dehors du champ d'application de cette fonction.

Vous pouvez le rendre global, mais qui est considéré comme une mauvaise pratique

également votre fonction databaseContainsAuthor

contient ce code

if ($row[0] > 0) 
{ 
    return TRUE; 
} 
else 
{ 
    return FALSE; 
} 

qui retournera VRAI ou FAUX. mais notez qu'une fois que le code renvoie une valeur, aucun du code après sera exécuté

ce qui signifie que cette partie pourrait aussi bien être commenté, car il est après la déclaration de retour, il ne sera jamais exécuté

$sql = "SELECT id FROM author 
      WHERE email='$email'"; 

    $id = mysqli_query($link, $sql); 
    if (!$id) 
    { 
     $error = 'Error searching for id.'; 
     include 'error.html.php'; 
     exit(); 
    }  
+0

Merci, la raison de la variable $ id est de stocker l'identifiant des auteurs dans une session() afin que je puisse lier l'identifiant avec les articles soumis par l'auteur. S'il y a une meilleure façon de stocker l'identifiant de l'utilisateur actuel, c'est l'utilisateur actuellement connecté, dans une session(), je suis tout à fait pour. – rumspringa00

+0

ce que vous essayez de faire est bien, mettez les instructions if/return après le bit du code qui assigne $ id = mysqli ..... changez cette définition de fonction en databaseContainsAuthor ($ email, $ password, & $ id) – bumperbox

+0

J'ai fait ce que vous avez suggéré mais je reçois toujours une erreur variable indéfinie pour $ id dans les lignes 14, 21. Des pensées? Op est mis à jour avec le code révisé. Merci. – rumspringa00

2

Les variables modifiées (ou définies) dans une fonction n'affectent pas le reste du script. Par exemple:

<?php 
function changeVariabe($person) { 
    $person = 'Bob'; 
} 
$person = 'Alice'; 
changeVariable($person); 
echo "Hello $person!"; // Outputs: Hello Alice! 

Cela peut être évité en passant la variable par référence, comme ceci:

<?php 
function changeVariabe(&$person) { 
    $person = 'Bob'; 
} 
$person = 'Alice'; 
changeVariable($person); 
echo "Hello $person!"; // Outputs: Hello Bob! 

Vous pouvez également utiliser des variables globales, comme ceci:

<?php 
function changeVariabe() { 
    global $person; 
    $person = 'Bob'; 
} 
$person = 'Alice'; 
changeVariable(); 
echo "Hello $person!"; // Outputs: Hello Bob!