我偶然发现我的用户遇到了用户阻止功能的问题。
我不知道如何撰写我的SELECT
以获得正确的结果。当User1阻止user2时,两个用户都无法看到彼此的个人资料,但是当我登录时,我可以看到自己的帐户。我正在使用开关来执行此操作。
我的BLOCK
表包含ID
,USER1_ID
,USER2_ID
和STATUS
。 0
可以查看'并且1
被阻止了#39;
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;
}
}
SWITCH
<?
$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
<? } ?>
答案 0 :(得分:5)
看起来您要求提供示例查询。
看起来您需要一个查询来测试block
表中是否存在一行,其中status
对于给定的一对用户设置为“已阻止”(1)。根据您的问题的措辞,看起来user_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值匹配的任何行: / p>
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
另请注意,如果表中存在冲突的行,即一个表示用户对被“阻止”的原始行,另一行表示该对未被阻止,则“阻止”状态将优先。< / p>
请注意,我们甚至不需要返回status
列,我们可以返回一个文字值(使用适当的别名来提供代码期望的结果集元数据。)
看起来您的代码中没有任何问题,但我可能会对它进行一些不同的编码。重要的是它是可以理解的,而且它是有效的。
更新:
抱歉,这不适合你。这是我提供的查询的SQL Fiddle演示。我很可能误解了你试图用你的查询完成的事情。我的查询实现的是,如果
然后当传入('foo','bar')
或('bar','foo')
的参数(按任意顺序)时,查询将返回status = 1的行。
否则,即如果两个用户都没有“阻止”另一个,则查询不返回任何行。
在查询中,重要的是两个提供的“user_id”参数中的每一个都在正确的位置提供两次。 (可以重写查询,以便每个参数只需要提供一次,但该查询对我来说并不那么容易理解。)
答案 1 :(得分: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;
}
}
答案 2 :(得分: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;
}
但我不认为你的问题在于如何构建Query。它位于Switch
;
由于您希望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;
}
?>
答案 3 :(得分: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;
}
}
享受并祝你好运!