2011-08-04 179 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():)