选择阻止用户1使用用户2(反之亦然)

3
我遇到了一个与用户阻止功能相关的问题。
我不知道如何编写我的SELECT语句以获取正确的结果。当User1阻止user2时,两个用户都无法看到彼此的个人资料,但是当我登录时,我可以看到自己的帐户。我使用开关来实现这一点。
我的BLOCK表包括IDUSER1_IDUSER2_IDSTATUS。其中0表示“可查看”,1表示“已阻止”。
Function.user
public function check_block($user1_id,$user2_id){ 
    $check_sql= "SELECT ......"; 
    $check_query = mysql_query($check_sql)or die(mysql_error()); 
    $check_num = mysql_num_rows($check_query); 
    if($check_num>0){ 
        $block = mysql_fetch_array($check_query); 
        return $block['status']; 
    }else{ 
        return $check_num; 
    } 
}

开关

<? 
    $user1_id=$_SESSION['id'];
    $user2_id=$data['id'];
    $userblock = function_user_core::check_block($user1_id,$user2_id);
    switch($userblock){
        case 1:
            echo'You Are Blocked From Viewing This Users Profile';
            break;
    }
?> 

用户资料中的字段已被阻止

<? if($userblock==1) { ?> 
    THIS USER HAS BLOCKED YOU FROM THEIR ACCOUNT
<? } ?>
4个回答

5
看起来你需要一个查询示例。
看起来你需要一个查询,它将测试给定一对用户的情况下,在 "block" 表中 "status" 设置��� "blocked" (1) 的行是否存在。从你的问题措辞来看,用户 ID 值的顺序似乎并不重要。无论是 'foo' 阻止了 'bar' 还是 'bar' 阻止了 'foo',或者两者都一样。(如果我理解你的问题正确的话。)这个查询可以实现这一点:
SELECT b.status
  FROM block b
 WHERE ( b.status = 1 AND b.user1_id = 'foo' AND b.user2_id = 'bar' )
    OR ( b.status = 1 AND b.user1_id = 'bar' AND b.user2_id = 'foo' )
 LIMIT 1

注意:此查询未考虑用户已屏蔽自己的特殊情况。请参阅下面的查询,该查询还处理了该条件。
在我的示例查询中,我使用了文字“foo”和“bar”,您当然可以在SQL文本中替换您的(正确转义的)变量。
对于这个检查查询,只有在找到指定一对用户被“屏蔽”的行时,它才需要返回一行。否则,查询不需要返回任何行。使用这个查询,您的代码实际上可以更简单。使用这个查询,您可以简单地从mysql_num_rows返回值。
也就是说,您可以替换这个块:
$check_num = mysql_num_rows($check_query); 
if($check_num>0){ 
    $block = mysql_fetch_array($check_query); 
    return $block['status']; 
}else{ 
    return $check_num; 
}

使用这个:

$check_num = mysql_num_rows($check_query); 
return $check_num;

上述查询并未考虑到(不寻常的?)一种情况,即用户已将自己阻止。

如果表中包含这样一行:

('foo','foo',1)

如果你将“foo”和“foo”作为user_1和user_2传入,上述查询将返回一行。但你指定用户应该总是能够查看自己的个人资料。因此,如果你想忽略任何指定用户已经“封锁”了自己个人资料的条件,可以在查询中添加另一个谓词,以忽略任何user_id值匹配的行。
SELECT 1 AS `status`
  FROM block b
 WHERE b.user1_id <> b.user2_id
   AND b.status = 1
   AND (  ( b.user1_id = 'foo' AND b.user2_id = 'bar' )
       OR ( b.user2_id = 'foo' AND b.user1_id = 'bar' )
       )
 LIMIT 1

请注意,如果表中存在冲突的行,即一行表示用户对被封锁的对象“blocked”,而另一行表示该组合未被阻止,则“blocked”状态将优先。

请注意,我们甚至不需要返回status列,我们可以返回一个字面值(带有适当的别名以提供结果集元数据,您的代码会期望这样做)。

从你的代码中看起来并没有问题,尽管我可能会编写略有不同的代码。重要的是它易于理解,并且它能工作。


更新:

很抱歉它对你没用。这里是我提供的查询的SQL Fiddle演示。
http://sqlfiddle.com/#!2/21120/2

最可能的是我误解了你在查询中想要实现的目标。我的查询实现的是,如果:

  • 'foo' 阻止 'bar' 或者
  • 'bar' 阻止 'foo' 或者
  • 两个人都互相阻止

那么,当传入参数为 ('foo','bar')('bar','foo')(顺序无关紧要)时,查询将返回一个状态为1的行。

否则,即如果没有用户阻止对方,则查询不返回任何行。

在查询中很重要的一点是,必须在正确的位置上两次提供这两个“user_id”参数中的每一个。(可以重写查询,使得每个参数只需要提供一次,但是那个查询对我来说不太容易理解。)


它仍然阻止了我的页面内容,而不是我封锁的用户。我不明白我做错了什么。因为我已经用USER1_ID编辑了你的foo,用USER2_ID编辑了你的bar。 - dave
感谢您的时间和诚实,'spencer7593',我们非常欣赏您的技能、知识和热情款待。我会采纳您的建议和意见。您所获得的声誉是应得的。 - dave
如果我和用户2是朋友,然后又把他们拉黑了...那么我该如何在拉黑时将该用户从我的好友列表中删除?我应该在blockuser.php中同时进行插入和删除操作吗?if ($_GET['uid']) { $query = mysql_query("INSERT INTO block (user1_id, user2_id, status) VALUES('$user1_id','$user2_id', 1)") or die (mysql_error()); } if($query){ echo "You've Blocked This User - See Block list in your profileCp to Unblock this user"; } - dave
@dave:我猜你应该有一个“unfrienduser”函数/例程来处理删除好友的操作。如果你的要求是“屏蔽”用户也会将其从好友列表中移除,那么你的代码可以直接调用这个函数/例程。这就是我会做的方式。 - spencer7593

3
我认为这就是您要找的内容。
SELECT `STATUS` FROM `BLOCK` WHERE `USER1_ID`=X AND `USER2_ID`=Y;

函数将会是

public function check_block($user1_id,$user2_id){ 
    $check_sql= "SELECT `STATUS` FROM `BLOCK` WHERE `USER1_ID`=$user1_id AND `USER2_ID`=$user2_id;"; 
    $check_query = mysql_query($check_sql)or die(mysql_error()); 
    $check_num = mysql_num_rows($check_query); 
    if($check_num>0){ 
        $block = mysql_fetch_assoc($check_query); 
        return (int)$block['status']; 
    }else{ 
        return $check_num; 
    } 
}

它隐藏了会话内容而不是数据内容。我需要它隐藏相反用户的内容。 - dave
用户1阻止用户2查看用户1的内容,您想要阻止用户1查看他自己的内容吗? - Gntem
当我(用户1)在会话中屏蔽任何特定用户(用户2)时,我的内容将从用户2处隐藏,用户2的内容也将从我(用户1)处隐藏。但是我刚刚将1更改为0,其中内容隐藏了给定区域<? if($userblock==0) { ?>现在它正在工作...但肯定应该是1来隐藏...而不是零...因为在块表中的状态默认为零,直到用户点击块并将其设置为1。 - dave

3

与其他答案类似

public function check_block($user1_id,$user2_id){ 
    $check_sql= "SELECT * FROM BLOCK WHERE USER1_ID = '$user1_id' AND USER2_ID = '$user2_id'  AND STATUS = 1"; 
    $check_query = mysql_query($check_sql)or die(mysql_error()); 
    $check_num = mysql_num_rows($check_query); 
    return $check_num;
}

但我不认为你的问题在于如何构造查询,而是在于Switch; 由于您希望用户1检查用户2是否已将用户1阻止,因此您需要反转传递到函数中的变量顺序。

<?php 
    $user1_id=$_SESSION['id'];
    $user2_id=$data['id'];
    $userblock = function_user_core::check_block($user2_id, $user1_id);
    switch($userblock){
        case 1:
            echo'You Are Blocked From Viewing This Users Profile';
            break;
    }
?> 

1

尝试:

public function check_block($user1_id,$user2_id) { 
    $check_sql= "SELECT STATUS FROM BLOCK WHERE USER1_ID = '" . mysql_real_escape_string($user1_id) . "' AND USER2_ID = '" . mysql_real_escape_string($user2_id) . "'"; 
    $check_query = mysql_query($check_sql)or die(mysql_error()); 
    $check_num = mysql_num_rows($check_query); 
    if ($check_num>0) { 
        $block = mysql_fetch_array($check_query); 
        return $block['STATUS']; 
    } else { 
        return $check_num; 
    } 
}

祝你好运并且享受!


那是我之前说的“希望有所帮助”。但唯一的问题是... 它仍然显示在“$userblock==1”内的内容。 - dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接