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