Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 选择此选项可从user2阻止user1(反之亦然)_Php_Mysql_Sql_Profile_Blocking - Fatal编程技术网

Php 选择此选项可从user2阻止user1(反之亦然)

Php 选择此选项可从user2阻止user1(反之亦然),php,mysql,sql,profile,blocking,Php,Mysql,Sql,Profile,Blocking,我偶然发现我的用户对用户块功能有一个问题 我不知道如何编写我的选择以获得正确的结果。当User1阻止user2时,两个用户都看不到彼此的配置文件,但当我登录时,我可以看到自己的帐户。我用开关来做这个 我的块表由ID、USER1\u ID、USER2\u ID和状态组成0可“查看”且1被“阻止” 函数用户 public function check_block($user1_id,$user2_id){ $check_sql= "SELECT ......"; $check_q

我偶然发现我的用户对用户块功能有一个问题

我不知道如何编写我的
选择
以获得正确的结果。当User1阻止user2时,两个用户都看不到彼此的配置文件,但当我登录时,我可以看到自己的帐户。我用开关来做这个

我的
表由
ID
USER1\u ID
USER2\u ID
状态
组成<代码>0
可“查看”且
1
被“阻止”

函数用户

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
<? } ?>

此用户已阻止您访问其帐户
试试:


祝你好运

我相信这就是你想要的

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; 
    } 
}

与其他答案类似

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;
}
但我认为问题不在于如何构造查询。它位于
开关中
; 因为您希望user1检查user2是否阻止了user1,所以需要颠倒变量传递到函数中的顺序

<?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;
    }
?> 

看起来您需要一个示例查询

看起来您需要一个查询来测试
block
表中是否存在一行,其中对于给定的一对用户,
状态设置为“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_行返回值

也就是说,您可以替换此块:

$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传入,则上面的查询将返回一行。但您指定用户应始终能够查看自己的配置文件

因此,如果要忽略指定用户已从其自己的配置文件中“阻止”自己的条件的任何行,可以在查询中添加另一个谓词,以忽略用户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
选择1作为“状态”`
b区
其中b.user1\u id b.user2\u id
b.状态=1
和((b.user1_id='foo'和b.user2_id='bar'))
或者(b.user2_id='foo'和b.user1_id='bar')
)
限制1
还请注意,如果表中存在冲突行,即一个raw表示用户对“已阻止”,另一行表示该对未被阻止,“已阻止”状态将优先

请注意,我们甚至不需要返回
status
列,我们可以返回一个文本值(使用适当的别名提供代码所需的结果集元数据)

看起来你的代码没有任何问题,尽管我可能会用不同的方式编写。重要的是,它是可以理解的,并且是有效的


更新:

对不起,这对你不起作用。下面是我提供的查询的SQL Fiddle演示。

很可能是我误解了您试图通过查询实现的目标。我的查询实现的是,如果

  • “foo”阻塞“bar”或
  • “bar”阻塞“foo”或
  • 两者都互相阻挡
然后,当传入参数
('foo','bar')
('bar','foo')
(按任意顺序)时,查询返回状态为1的行

否则,也就是说,如果两个用户都没有“阻止”另一个,则查询不会返回任何行


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

这就是我之前的“希望我能帮上忙”。但唯一的问题是..它仍然显示“$userblock==1”中的内容,它隐藏了会话内容而不是数据内容。我需要它来隐藏对方用户的内容..user1阻止user2查看user1内容,您想阻止user1查看其内容吗?当我会话用户(user1)阻止任何其他特定用户(user2)时,我的内容对user2隐藏,user2的内容对我隐藏(user1)但我刚刚将1改为零,内容隐藏了它现在正在工作的给定区域。但肯定应该是1隐藏。而不是零…因为块表中的状态是默认的零,直到用户点击块并将其设置为1。它仍然会阻止我页面上的内容,而不是我阻止的用户上的内容。我不明白我做错了什么。我用USER1\u ID编辑了你的foo,用USER2\u ID编辑了你的酒吧。感谢你抽出时间和诚实的“spencer7593”,感谢你的技能、知识和热情好客。我会采纳你的建议,并在船上提出建议。你应该得到你所拥有的代表。因此,如果我是user2的朋友并阻止他们..我将如何在此基础上扩展以从阻止他们的朋友中删除该用户?我会在插入块的同时在blockuser.php中执行此操作吗<代码>如果($_GET['uid']){$que
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