2012-09-25 35 views
0

我試圖使用mysqli-> fetch_row()(或fetch_object(),fetch_array())來獲取結果,但是當我去跑在運行時它給了我下面的錯誤代碼:

致命錯誤:調用一個成員函數fetch_row()在...非對象上線23

在下面的代碼中,這樣做的var是$結果。 $ user和$ password從另一個.php文件中獲取這個文件所包含的值,所以目前並不重要。現在糾正我,如果我錯了,但如果$結果正在設置= $ db-> query($ query)那麼是不是應該繼承$ db的屬性又名mysqli類?

class mySQLHelper{ 

    public function checkPass($user, $pass){ 
     global $db; 
     $db = new mysqli(); 
     $db->connect('localhost', 'root', '', 'mydb'); 
     if (mysqli_connect_errno()){ 
      echo 'Can not connect to database'; 
      echo mysqli_connect_errno(). mysqli_connect_error(); 
      exit; 
      return false; 
     } 


     $query = "SELECT user, password FROM Users WHERE user = $user AND password = $pass " ; 

     echo $query; 

     $results = $db->query($query); 

     while ($row = $results->fetch_row()){ 

      echo htmlspecialchars($row->user); 
      echo htmlspecialchars($row->password); 


     } 

     $results->close(); 

     $url = 'http://'. $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"; 
     if(!$results){ 
     // mysqli_close($db); 
      // header("Location:.$url.login.php&msg=1"); 

     } 

     else{ 
     // mysqli_close($db); 
     // header("Location:.$url.featured.php"); 


     } 

    } 

}

+2

你需要引用你的變量在SQL語句中包含。或者,由於您使用的是mysqli,因此將它們添加爲綁定參數 - 這更安全。 – andrewsi

+0

我以爲是插入語句。 – VinceOmega

+1

$結果可能是錯誤的,因爲查詢中有錯誤。 –

回答

3

您的查詢失敗在這條線:

$results = $db->query($query); 

正因爲如此,$resultsfalse - 而不是一個結果對象如您所願。

要解決這個問題,你需要添加在你的變量引號(或使用準備好的發言):

$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ; 

我建議更新使用prepared statement來防止SQL注入的問題太多,雖然:

$stmt = $db->prepare('SELECT user, password FROM Users WHERE user = ? AND password = ?'); 
$stmt->bind_param('ss', $user, $pass); 
$stmt->execute(); 
$results = $stmt->get_result(); 
+0

嘿,我只是想感謝你的帖子。我用你的方法,雖然我不得不改變一些事情(如$ stmt-> bind_param(「SS」,$用戶,$通行證),你張貼的方式拋出錯誤),我綁定的結果,兩個新我瓦爾終於得到了我想要的結果。再一次感謝你。 – VinceOmega

+0

@Disowned真棒,很高興我能幫助!我已經更新了我的回答對您使用指定所以更新未來的任何引用可以把它撿起來,以及 - 感謝便條(^_^) – newfurniturey

2

如果用戶&密碼字段中的文本或VARCHAR,那麼你需要使用單引號周圍

$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ; 
3

您腳本缺少錯誤檢查,因此錯誤該查詢不處理。

$query = "SELECT user, password FROM Users 
    WHERE user = '$user' AND password = '$pass' " ; 
    //   ^quotes needed  

    echo $query; 

    $results = $db->query($query); 

    // handle a error in the query 
    if(!$results) 
     die($db->error); 

    while ($row = $results->fetch_row()){ 
     echo htmlspecialchars($row->user); 
     echo htmlspecialchars($row->password); 
    } 
0

你爲什麼要檢查if($results)試圖操縱它?

這...

$results->close(); 
//... 
if(!$results){ 
    //... 
} 

應該是...

if(!$results){ 
    //... 
} 
$results->close(); 
+0

我調試,我試圖找出爲什麼它被重定向我的登錄頁面。這是留在那裏的代碼,因爲我正按照你所提到的那樣重新排列它。 – VinceOmega

1

你必須檢查,如果查詢可以正常運行:

if ($result = $mysqli->query($query)) 
{ 
} 

用途:的var_dump($結果)來檢查它包含的內容