2016-04-25 56 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