2016-04-25 44 views
0

我有3個表,其中我問的第一個表(用戶)得到這樣的結果:修正錯誤

$String_users='19,20,21,22,25,26,27,28,29,30,31,32,33,34'; 

,我想通過其他兩個朋友來過濾和freinds_request和刪除IDS在這些數字讓我CUD做一些事情以後,但我不太瞭解它返回此錯誤:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\cebs\include\functions.php on line 825 

然後我試圖運行從SQL命令查詢 - phpMyAdmin來看看什麼是錯的:

SELECT id FROM users WHERE id NOT IN 
(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34')) 
    OR (user_one IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND user_two='18')) 
    AND id NOT IN(SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') OR (to_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND from_user='18')) 
              ) 
              ) 

但MySQL表示:

#1241 - Operand should contain 1 column(s) 
下面

是我的PHP代碼也:

function somepeopleyoumayknow(){ 


global $dbc_conn, $IsLoggIn,$table_name,$friend_request_table,$friends_table ; 
$cu_school = getuser($IsLoggIn,'cell_group'); 

//assuming $IsLoggIn is equal to 18... 

$peopleids= mysqli_query($dbc_conn,"SELECT id FROM $table_name WHERE id !='$IsLoggIn'"); 
$sql_num_rows = mysqli_num_rows($peopleids); 
if($sql_num_rows > 0){ 
while($run_peopleids= mysqli_fetch_array($peopleids)){ 

    $users_ids[] = $run_peopleids['id']; 

} 
$string_users = implode(',',$users_ids); 

$sql = "SELECT id FROM $table_name WHERE id NOT IN 
(SELECT user_one,user_two FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) 
OR (user_one IN($string_users) AND user_two='$IsLoggIn')) 
AND id NOT IN(SELECT to_user,from_user FROM $friend_request_table WHERE (to_user='$IsLoggIn' AND from_user IN($string_users) OR (to_user IN($string_users) AND from_user='$IsLoggIn')) 
             )"; 
    $filter_id_query = mysqli_query($dbc_conn,$sql); 
    $fnrows = mysqli_num_rows($filter_id_query); 

    if($fnrows > 0){ 
     while($run_fiq=mysqli_fetch_array($filter_id_query)){ 
      $uid[] = $run_fiq['id']; 
     } 

     echo $filtered_id_users = implode(',',$uid); 

    } 



} 



} 
下面

存儲表和數據:

用戶usersTable

朋友freidnstable

friend_request firendRequesttable

我該如何解決這個問題?謝謝。

+1

迴應您的查詢並直接運行到phpmyadmin並檢查您的查詢錯誤 – Saty

+0

也許您需要使用'left join'或'inner join'來獲取結果...您可以顯示結構數據庫。 – Naumov

+0

**警告**:使用'mysqli'時,您應該使用參數化查詢和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)來添加用戶數據到您的查詢。 **不要**使用手動轉義和字符串插值或串聯來實現此目的,因爲如果您忘記正確地轉義某些內容,您將創建嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 – tadman

回答

0

修訂: OK,那麼您的SQL語句應該是這樣的:

SELECT * FROM (
    SELECT user_one as id 
    FROM friends 
    WHERE user_one != :loggedInId 
    UNION 
    SELECT user_two as id 
    FROM friends 
    WHERE user_two != :loggedInId 
) 
WHERE id NOT IN (
    SELECT from_user as id 
    FROM friend_request 
    WHERE to_user = :loggedInId 
    UNION 
    SELECT to_user as id 
    FROM friend_request 
    WHERE from_user = :loggedInId 
) 

附:而且,當然,請使用準備好的語句。我建議使用PDO。如果您沒有可能,請使用mysqli::prepare方法。 它會使你的代碼看起來像這樣(只是改變:loggedInId?):

if ($stmt = $mysqli->prepare($sql)) { 
    $stmt->bind_param('i', $loggedInId); 
    $stmt->execute(); 
    $stmt->fetch(); 
    $stmt->close(); 
} 
+0

感謝您的回答,但它不適合我。有另一種方法可以達到這個目的嗎? –

+0

請給我們所有的表格說明,以瞭解存儲的字段。似乎你需要這樣的東西:select_to_user from friend_request UNION select from_user FROM friend_request WHERE ... – freeek

+0

請問我已經更新了表格和描述的問題。 @freeek –

0

有喜歡刪除single quote裏面(一期),否則將考慮一個字符串:

(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34')) OR (user_one IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND user_two='18')) AND id NOT IN(SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') OR (to_user IN('19,20,21,22,25,26,27,28,29,30,31,32,33,34') AND from_user='18')))) 

請如下更新:

(SELECT user_one,user_two FROM friends WHERE (user_one='18' AND user_two IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34)) OR (user_one IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) AND user_two='18')) AND id NOT IN(SELECT to_user,from_user FROM friend_reqest WHERE (to_user='18' AND from_user IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) OR (to_user IN(19,20,21,22,25,26,27,28,29,30,31,32,33,34) AND from_user='18')))) 
0

您的查詢不正確的邏輯,當你做where子句+蘇b選擇像:

WHERE <columnX> NOT IN (SELECT <columnX from table x) 

您應該只選擇1個操作數/列,即在子查詢中的columnX。 請參見下面的boldded:

$sql = "SELECT id FROM $table_name WHERE **id** NOT IN 
(SELECT **id** FROM $friends_table WHERE (user_one='$IsLoggIn' AND user_two IN($string_users)) 
OR (user_one IN($string_users) AND user_two='$IsLoggIn')) 
AND id NOT IN(SELECT **id** FROM $friend_request_table WHERE (to_user='$IsLoggIn' AND from_user IN($string_users) OR (to_user IN($string_users) AND from_user='$IsLoggIn')) 
+0

什麼是操作數?...試過了你的幫助,但它沒有奏效。我仍然有相同的錯誤信息。 @Dimitrii –

+0

請參閱本手冊頁面:http://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries。HTML 你在哪裏(子查詢)條款是不正確的,應該像其中,操作數IN(從選擇操作數...) – Dimitrii

0

在抓我的頭讀什麼Dimitiri貼我重新思考和重新編寫下面的SQL語句是我的回答:

$sql = "SELECT id FROM $table_name WHERE id NOT IN 

(SELECT user_one FROM $ friends_table WHERE(user_one ='$ IsLoggIn'AND user_two IN($ string_users)) 或 (user_one IN($ string_users)AND user_two ='$ IsLoggIn'))AND ID NOT IN(SELECT user_two FROM $ friends_table WHERE(user_one ='' $ IsLoggIn'和user_two IN($ string_users))或 (user_one IN($ string_users)AND user_t WO = '$ IsLoggIn'))

和ID NOT IN (SELECT FROM_USER FROM $ friend_request_table WHERE(FROM_USER = '$ IsLoggIn' AND to_user IN($ string_users))OR(FROM_USER IN($ string_users)和to_user = '$ IsLoggIn'))

和ID NOT IN (SELECT to_user FROM friend_request_table $ WHERE(FROM_USER = '$ IsLoggIn' AND to_user IN($ string_users))OR(FROM_USER IN($ string_users)和to_user ='$ IsLoggIn'))「;

這將過濾並刪除這兩個表中的所有id。 以前在我的朋友表我有5個IDS表示一旦運行這些ID上面這個查詢被刪除的朋友:

下面

是照片來證明這一點:

$ String_users = '19,20,21,22, 25,26,27,28,29,30,31,32,33,34' ;

$ filtered_id_users = 19,25,27,28,29,31,32,34

解釋:

這意味着我已經是朋友IDS:21,22,26,30(友表)

我不得不這暗示着ID 33(friend_requst_table 1個朋友請求)

profe