2011-08-04 173 views
0

我是新來的PHP。PHP - 未定義的變量

目前在 '輔導階段'。

我被塔克先生做從初學者PHP MySQL的&一些練習。

在他的榜樣,一切工作正常,但我的電腦上有一個錯誤:

Notice: Undefined variable: passwordRetrieved in C:\wamp\www\loginForm.php on line 39

這個例子

完整PHP代碼: - 請注意表確實存在,密碼,連接到數據庫等...都是正確的

<?php 


{  // Secure Connection Script 
     include('htconfig/dbConfig.php'); 
     $dbSuccess = false; 
     $dbConnected = mysql_connect($db['hostname'],$db['username'],$db['password']); 

     if ($dbConnected) {  
      $dbSelected = mysql_select_db($db['database'],$dbConnected); 
      if ($dbSelected) { 
       $dbSuccess = true; 
      } 
     } 
     // END Secure Connection Script 
} 

$thisScriptName = "loginForm.php"; 

echo '<h2>Login Form </h2>'; 

    $username = $_POST['username']; 

    if(isset($username)) { 
     $password = $_POST['password']; 
     echo "username = ".$username."<br />"; 
     echo "password = ".$password."<br />"; 

     { //  SELECT password for this user from the DB and see it it matches 
      $tUser_SQLselect = "SELECT password FROM tUser "; 
      $tUser_SQLselect .= "WHERE username = '".$username."' ";  

      $tUser_SQLselect_Query = mysql_query($tUser_SQLselect);  
      while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
       $passwordRetrieved = $row['password']; 
      } 
      mysql_free_result($tUser_SQLselect_Query); 

      echo "passwordRetrieved = ".$passwordRetrieved."<br />"; 

      if (!empty($passwordRetrieved) AND ($password == $passwordRetrieved)) { 

        echo "YES. Password matches.<br /><br />"; 
        echo '<a href="'.$thisScriptName.'">Logout</a>';    
      } else { 
       echo "Access denied.<br /><br />";  
       echo '<a href="'.$thisScriptName.'">Try again</a>';   
      } 
     } 

    } else { 

     echo '<form name="postLoginHid" action="'.$thisScriptName.'" method="post">'; 
       echo ' 
        <P>User name: 
        <INPUT TYPE=text NAME=username value=""></P> 
        <P>Password: 
        <INPUT TYPE=password NAME=password value=""></P> 
        <input type="submit" value="Login" /> 
       '; 
     echo '</form>'; 

    } 

echo '<h2>--------- END Login Form --------</h2>'; 

?> 

回答

1

之前,而在其中設置變量$ passwordRetrieved聲明它,所以它應該是這樣的

$tUser_SQLselect_Query = mysql_query($tUser_SQLselect);  
$passwordRetrieved = ""; 
      while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
       $passwordRetrieved = $row['password']; 
      } 
+0

它不意味着我的$ passwordRetrieved是一個空字符串?它應該從表格中獲取這個值? – Iladarsda

+0

沒有,你的價值將在while循環分配 –

1

那是因爲你的查詢返回的任何操作,

while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) {

沒有填寫

$passwordRetrieved

您可以禁用E_NOTICE通知,因爲它不是東西會傷害之前

或者添加

$passwordRetrieved = ""; 

while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
1
while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
    $passwordRetrieved = $row['password']; 
} 

這是唯一的地方,一個價值可能是分配給變量$passwordRetrieved
如果結果集中沒有記錄,則while循環的主體永遠不會執行,因此沒有值分配給$passwordRetrieved,因此$passwordRetrieved不存在/未定義在第39行 - >Notice: Undefined variable: passwordRetrieved in C:\wamp\www\loginForm.php on line 39

1

您正在嘗試還沒有被賦予一個值來訪問變量$passwordRetrieved。訪問都是在這裏完成:

echo "passwordRetrieved = ".$passwordRetrieved."<br />"; 

變量也只是上面的設置:

while ($row = mysql_fetch_array($tUser_SQLselect_Query, MYSQL_ASSOC)) { 
    $passwordRetrieved = $row['password']; // VARIABLE SET HERE 
} 

重要的是,如果該查詢返回匹配行(即該變量只被設置在成功登錄)。如果登錄無效,則該變量未設置。

要檢查變量是否設置爲未通知,您可以使用issetempty(有細微的差異,但作爲一個經驗法則,您可以在大多數情況下使用)。你的代碼實際上已經這樣做了:

// Checking if $passwordRetrieved has been set using empty() 
if (!empty($passwordRetrieved) AND ($password == $passwordRetrieved)) { 
1

如果你的查詢沒有返回任何結果,那麼$ passwordRetrieved是未定義的(就像消息說的那樣)。當你無法找到與用戶名= $的用戶名的任何用戶(這也是一個無效的登錄)

1

您只需使用一個未定義的變量,如果你的while循環沒有工作,你的可變鋼不確定的,所以你獲得你應該拋出一個錯誤錯誤:)

1

做用mysql_num_rows($result),以確保你真正得到的東西進行檢查。

1

你應該使用它之前定義$passwordRetrieved。此通知完全不起作用。 爲了避免這種定義它:

$thisScriptName = "loginForm.php"; 

$passwordRetrieved; 
1

由於這個問題已經回答了,我還要補充,而不是使用mysql_fetch_array與MYSQL_ASSOC參數,你可以使用mysql_fetch_assoc():)