2016-06-28 85 views
1

有三個表,我在這個查詢中做錯了什麼?

  • 存儲用戶細節
  • 存儲組的詳細信息
  • 存儲用戶ID和組ID。

我需要檢查,如果用戶已經是一個組的成員。我使用這個查詢來實現這一目標:

SELECT u.id, g.id 
FROM users u, groups g 
INNER JOIN user_groups ug 
ON ug.user_id = u.id AND ug.group_id = g.id 
WHERE ug.user_id = ? AND ug.group_id = ? 

但這扔我一個錯誤:

Call to a member function bind_param() on boolean in 

,如果我有我的查詢拼錯一些詞,一切都還好我已經檢查。

編輯:

這裏是一個函數:

public function isUserMember($user_id, $group_id) { 
     $stmt = $this->conn->prepare(" 
      SELECT u.id, g.id from users u, groups g 
      INNER JOIN user_groups ug 
      ON ug.user_id = u.id AND ug.group_id = g.id 
      WHERE ug.user_id = ? AND ug.group_id = ?"); 
     $stmt->bind_param("ii", $user_id, $group_id); // here i'm getting an error 
     $stmt->execute(); 
     $stmt->store_result(); 
     $num_rows = $stmt->num_rows; 
     $stmt->close(); 
     return $num_rows > 0; 
} 
+1

您可以發佈與查詢相關的PHP代碼。 – Matt

+1

這不是查詢,我想你沒有正確準備聲明.. –

+0

我們需要實際的代碼,從建立數據庫連接到準備/執行查詢。 –

回答

1

嘗試以下變化

去除不必要的使用用戶表連接的,因爲如果你有user_id說明和GROUP_ID你不需要加入吧與用戶

SELECT ug.id, g.id 
from user_groups ug 
inner join groups g 
on ug.group_id = g.id 
WHERE ug.user_id = ? AND ug.group_id = ? 
+1

你做了哪些改變? **編輯**您的答案,並添加一些上下文 – Martin

+0

它給出了第1行PHP解析錯誤。 – Jocelyn

+0

@Jocelyn生病檢查它,請更新查詢 –

1

您的具體問題錯誤語句是:

Call to a member function bind_param() on boolean in

在:

$stmt->bind_param("ii", $user_id, $group_id); 

這意味着,有布爾(true或false)無功能bind_param(),所以這意味着你的$stmt是一個布爾值,這意味着定義線的語句返回FALSE

這樣:

$stmt = $this->conn->prepare(" 
      SELECT u.id, g.id from users u, groups g 
      INNER JOIN user_groups ug 
      ON ug.user_id = u.id AND ug.group_id = g.id 
      WHERE ug.user_id = ? AND ug.group_id = ?"); 

這就是問題的所在。在評論其他人指出,您的SQL查詢不正確,這將導致一個布爾但是失敗,如果這不是你的SQL查詢本身失敗,那麼你就需要建立的是,$this->conn值已成功生成並且它是有效的對象實體。

嘗試輸出錯誤日誌是這樣的:以上

if(!$stmt = $this->conn->prepare($sql)){ 
      $errorDump = ' 
      Error 1 '.date("r").' : 
      '; 
      $errorDump .= $this->conn->error; 
      $errorDump .= "\n\nBacktrace:\n".print_r(debug_backtrace(),TRUE); 
      $errorDump .= " 
      SQL: ".$sql; 
      error_log($errorDump); 
      unset($errorDump); 
      return false; 
     } 
    .... 
    //carry on with the query as it's ok 

有點快速和骯髒但是當你的$stmt返回false這個錯誤報告會告訴你爲什麼。然後,您可以使用該錯誤信息,以解決您的查詢或你的PHP變量結構。

+0

你的回答很好解釋,但我發現我的查詢造成了我這個問題。不管怎麼說,還是要謝謝你! –

+1

我試圖告訴你如何找到未來的錯誤和問題,這次你可能已經發現了你的錯誤,但試着採取我在這裏陳述的內容,當他們再次發生時你可以用更少的時間解決你自己的錯誤: - )@DusanDimitrijevic – Martin

+0

感謝@Martin提供這些技巧:) –