2012-02-24 108 views
2

我正在構建一個微站點,並且在密碼重置行爲時遇到了問題。調試PHP驗證腳本

有一種形式要求用戶輸入兩次密碼。我不是密碼納粹,唯一的要求是密碼超過5個字符。提交時,表單數據被添加到$ _POST數組中,併發送到我的站點範圍的php函數腳本中的setPass函數。

功能是

function setPass(){ 
    $link= connectDB(); 

    $query= "select * from People where Username='" . $_SESSION['name'] . "' Limit 1"; 
    $result= $link->query($query); 

    if ($result->num_rows==0){ 
     $_SESSION['status']= 'invaliduser'; 
     header("location: ../index.php"); 
    } else { 
     $first = $_POST['firstPass']; 
     $second = $_POST['secondPass']; 

     if (($first == $second) && (strlen($first) > 5)){ 
      $password = sha1($first); 
     } 
    } 
} 

我要離開了本例中的數據庫插入代碼。

我的問題是,包含在頁面主體中的此腳本echo $_SESSION['name'] . " and password: " . $first;會輸出用戶名,但會返回unidentified variable: first警告。當我嘗試訪問變量$password時,也會發生這種情況。

早期的測試表明,第一個條件是真實的,因爲頁面沒有重定向。

那麼,在else塊中導致執行失敗的原因是什麼?

+0

我沒有在你的代碼中看到'echo'...你想在哪裏「回聲」?你是在你的'setPass'函數裏面還是在外面? – 2012-02-24 19:17:52

+0

我在setPass函數所在的php頁面中添加了一些HTML標頭和主體標籤。這就是echo標籤所在的位置。 – Jason 2012-02-24 19:21:49

+0

是的,如果你想在'setPass'函數之外訪問這些變量,那麼你就超出了範圍。使用全局變量或$ _SESSION,就像下面的答案一樣。 – 2012-02-24 19:25:12

回答

4

由於您在setPass函數中設置了$first$password,因此它們在相同的主體外部不可用。

如果你想在外面使用它們,你應該使用global關鍵字,或者更好的辦法是從函數返回值。

這個概念被稱爲範圍的變量。這些變量在功能範圍內有本地範圍。請參閱here瞭解PHP中範圍確定的全面描述。

2

你說你在迴應腳本的內容?你在函數中定義了變量,所以除非你把它設置爲全局變量(通常不是一個好主意,請參閱PHP global in functions),否則$第一個實際上不存在。