2011-08-06 6 views
1

Я получаю неопределенную переменную ошибку для $id переменной в строках 15 & 21, может кто-нибудь объяснить, почему? Я не понимаю, в чем проблема.Неопределенная переменная?

<?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; 
    } 
} 

Переменная $id определяется в databaseContainsAuthor($email, $password, $id), затем хранится в сессии $_SESSION['id'] так естественно $id = mysqli_query($link, $sql); должны были пройти, но это не так?

+0

Возможный дубликат ["Примечание: неопределенная переменная" и "Уведомление: Неопределенный индекс"] (http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index) – animuson

ответ

1

некоторые из них вещи переменная $ id должна быть определена (не требуется, но хорошая практика), прежде чем использовать ее

так, например

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

также устанавливающего $ идентификатор внутри функции databaseContainsAuthor не означает, что $ ID изменится за рамки этой функции.

Вы могли бы сделать его глобальным, но это считается плохой практикой

также ваша функция databaseContainsAuthor

содержит этот код

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

которая возвращает значение TRUE или FALSE. но обратите внимание, что после того, как код возвращает значение, ни один из кода после того, как она будет работать

, что означает эта часть может также быть закомментирована, как это после возвращения заявления он никогда не будет выполняться

$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

Спасибо, причина переменной $ id заключается в том, чтобы хранить идентификатор авторов в сеансе(), поэтому я могу связать идентификатор со статьями, которые отправляет автор. Если есть лучший способ сохранить идентификатор текущего пользователя, это текущий зарегистрированный пользователь, в сеансе() я все для него. – rumspringa00

+0

то, что вы пытаетесь сделать, прекрасно, поместите операторы if/return после бит кода, который присваивает $ id = mysqli ..... измените это определение функции на databaseContainsAuthor ($ email, $ password, & $ id) – bumperbox

+0

Я сделал то, что вы предложили, но я все еще получаю неопределенную переменную ошибку для $ id в строках 14, 21. Любые мысли? Op обновляется с измененным кодом. Благодарю. – rumspringa00

2

Переменные, измененные (или определенные) внутри функции, не влияют на остальную часть скрипта. Например:

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

Это можно избежать, передавая переменную по ссылке, например:

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

Вы также можете использовать глобальные переменные, как это:

<?php 
function changeVariabe() { 
    global $person; 
    $person = 'Bob'; 
} 
$person = 'Alice'; 
changeVariable(); 
echo "Hello $person!"; // Outputs: Hello Bob! 
Смежные вопросы