2011-08-06 11 views
1

$id行の変数が未定義です。& 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は、その後$id = mysqli_query($link, $sql);が合格しているはずですので、自然に$_SESSION['id']セッションに保存されているが、それはありません、databaseContainsAuthor($email, $password, $id)で定義されていますか?

+0

[Notice:未定義の変数]と[Notice:未定義のインデックス]の複製が可能です(http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index) – animuson

答えて

1

数:

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

ます。また、このようなグローバル変数を、使用することができます。

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

これは、このように、参照によって変数を渡すことで回避することができます物語 変数$ idを使用する前に定義する必要があります(必須ではありませんが、良い習慣)

はとても例えば

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

もdatabaseContainsAuthor関数内の$ IDを設定すると、$ idはその関数の範囲外に変化することを意味するものではありません。

あなたはそれがグローバル作ることができ

が、それは悪い習慣

考えられても、あなたの関数のdatabaseContainsAuthor

は、このコードTRUEまたはFALSEを返します

if ($row[0] > 0) 
{ 
    return TRUE; 
} 
else 
{ 
    return 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(); 
    }  
を実行することはありませんreturn文の後にあるように、この部分は同様に、コメントアウトされる可能性があります意味

を実行されます後のコードいったん値、コードのどれを返すことに注意してください

+0

ありがとうございます。$ id変数の理由は、authors idをsession()に格納することです。そのため、IDを著者が投稿した記事にリンクすることができます。現在のユーザーのIDを格納するためのより良い方法があれば、それはセッション()内に現在ログインしているユーザーですが、私はそれだけです。 – rumspringa00

+0

あなたがしようとしているものは問題ありません。$ id = mysqliを割り当てるコードの後に​​if/return文を入れてください。.....この関数の定義をdatabaseContainsAuthor($ email、$ password、&$ id) – bumperbox

+0

私はあなたが示唆したことをしましたが、私はまだ行14,21の$ idの未定義の変数エラーを取得しています。 Opは改定コードで更新されています。ありがとう。 – rumspringa00

2

関数内で変更(または定義)された変数は、スクリプトの残りの部分には影響しません。たとえば:

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