2009-05-26 44 views
3
Notice: Undefined variable: username in C:\xampp\htdocs\test_class.php 
     on line 20 
Notice: Undefined variable: password in C:\xampp\htdocs\test_class.php 
     on line 20 

當我使用這段代碼檢查我的用戶名和密碼與我的數據庫時,我得到上述錯誤。在PHP中未定義的變量錯誤

<?php 
    class test_class { 

     public function __construct() { 

     } 
     public function doLogin() { 

      include("connection.php"); 

      if (isset($_POST['username'])) 
       { 
       $username= $_POST['username']; 
       } 
       if (isset($_POST['password'])) 
       { 
       $password= $_POST['password']; 
       } 

      $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
      $result = mysql_fetch_array(mysql_query($query)); 
      if(!$result) 

      { 

      return 'assa'; 

      }else{ 

      return 'assa112121212'; 

      } 

       } 
     } 
?> 
+14

「小博表格,我們稱他爲「。 ;) – macbirdie 2009-05-26 12:46:25

+1

我認爲那些返回值非常棒! – 2009-05-26 12:49:02

+0

千萬不要做這樣的事情「SELECT * FROM users WHERE username ='$ username'AND password ='$ password'」「! – Gleb 2009-05-26 12:50:37

回答

11

這意味着,很可能您的表單尚未提交。你應該確保你只使用變量,如果它們存在。此外,您應該使用來自用戶的輸入而不驗證它。請嘗試以下,例如:

if (isset($_POST['username']) && isset($_POST['password'])) 
{ 
    $username= $_POST['username']; 
    $password= $_POST['password']; 
    $query = "SELECT * 
         FROM users 
         WHERE username = '".mysql_real_escape_string($username)."' 
         AND password = '".mysql_real_escape_string($password)."'"; 
    $result = mysql_fetch_array(mysql_query($query)); 
    # ... 
} 
else 
{ 
    return NULL; 
} 
10

這僅僅是一個通知,該變量在查詢中引用沒有保護範圍。

在doLogin()的頂部定義$ username和$ password,並將它們初始化爲Null或類似的。然後再檢查它們。

無論是否設置了$ username和$ password,您似乎也在執行查詢。你應該做更像這樣的事情:

if(isset($_POST['username']) && isset($_POST['password'])){ 
    //create vars, do query 
}else{ 
    // Nothing to process 
} 

這兩個錯誤都發生在第20行,我認爲這是查詢字符串插值。這裏的問題是:

  1. 不一致範圍/引用(在PHP它吮吸反正)
  2. 你IFS需要更加有序一些。此錯誤是小,但更爲惡劣會咬你的屁股後,如果你處理的變量這樣:)

另外:逃不出你的變量傾銷他們像熱煤到SQL之前 看到PDO(其我會去)或mysql_escape_string()

祝你好運

0

您將要使用error_reporting(E_ALL^E_NOTICE);從Sam鏈接到的頁面。通知實際上是不必要的,就像使用gcc的WALL和WERROR標誌一樣。

1
<?php 
class test_class { 

    public function doLogin() { 
     include("connection.php"); 

     if (isset($_POST['username']) && isset($_POST['password']) { 
      $username = $_POST['username']; 
      $password = $_POST['password']; 

      $query = "SELECT * ". 
        "FROM users " . 
        "WHERE username = '$username' ". 
        " AND password = '$password'"; 
      $result = mysql_fetch_array(mysql_query($query)); 
      if(!$result) { 
       return 'assa'; 
      } else { 
       return 'assa112121212'; 
      } 
     } else { 
      echo "Missing parameter 'username' and/or 'password'"; 
     } 
    } 
} 

此外,你應該escape$ USERNAME$密碼避免sql injection攻擊。

1

您還正在檢查數據庫是否提供了用戶名和密碼。

也許是這樣的;

public function doLogin() { 

    include("connection.php"); 
    $username = (isset($_POST['username'])) ? $_POST['username'] : NULL ; 
    $password = (isset($_POST['password'])) ? $_POST['password'] : NULL ; 
     if ($username !== NULL && $password !== NULL) { 
        $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
        $result = mysql_fetch_array(mysql_query($query)); 
      /* auth code here */ 

     } else { 
     return false; // no u/p provided  
    } 

    } 

你也應該把它們靠近你的數據庫的任何地方前,逃脫你的投入,無論是使用mysql_real_escape_stringPDO (PHP Data Objects)

3

一個更幸福階級和無bug :)

<?php 
class test_class 
{ 
    private $post = array(); 
    public function __construct() 
    { 
    } 
    public function doLogin() 
    { 
     $this->post = $_POST; 
     include ("connection.php"); 
     if ($this->post['username'] && $this->post['password']) { 
      $username = $this->post['username']; 
      $password = $this->post['password']; 
      $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
      $result = mysql_fetch_array(mysql_query($query)); 
      if (! $result) { 
       return 'assa'; 
      } else { 
       return 'assa112121212'; 
      } 
     } 
    } 
} 
?>