MySQL INNER JOIN在登录时使用OR

时间:2013-12-04 11:23:36

标签: php mysql

我的表格结构如下:

~ MEMBERS ~
UID (a-i)
NAME
EMAIL

~ COUPLES ~
UID_1
UID_2
PASSWORD
SALT

当一对夫妇注册时,他们的UID会被插入到情侣表中,以及他们的联合密码(及其盐)。现在,登录时,我需要加入表格,以便我可以检查任一用户的密码。

即。查找电子邮件地址>看看他们在哪个夫妇>检查密码

这是我目前的查询:

$query = "SELECT * FROM MEMBERS m 
INNER JOIN COUPLES c ON ((c.UID_1 = m.UID) OR (c.UID_2 = m.UID)) 
WHERE EMAIL = '$email'";

(我现在只使用*因为我无法弄明白我需要选择INNER JOIN才能工作。)

login-script.php上的其余代码如下:

$result = mysqli_query($con, $query);

if(mysqli_num_rows($result) == 0) {
    header('Location: index.php?msg=error4');
    exit();
}

$data = mysqli_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $data['SALT'] . hash('sha256', $password));

if ($hash != $data['PASSWORD']) {
    header('Location: index.php?msg=error5');
    exit();
}
else {
    echo "Logged in.";
}

>

如果我尝试登录,则会抛出错误消息?msg=error5,这意味着密码不匹配,但我在代码的那部分中看不到问题。我相信它告诉我他们不匹配,因为它没有找到正确的表/正确的数据,这对我的INNER JOIN来说一定是错的。

非常感谢任何帮助。

编辑:我现在意识到,只要将密码和盐放入MEMBERS两个记录就更有意义,所以我只从一个表中选择,但是契约已经完成,我很想知道这是否可行。

1 个答案:

答案 0 :(得分:1)

实际上,我在http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all上尝试了你的结构和代码,这对我有用:

SELECT * from members M JOIN couples C ON uid_1=Uid or uid_2=uid
WHERE email='youremail';

也许问题是表中有一对人实际上有多于一对? 像:

uid_1, uid_2, pass
1       2     xxx
1       3     yyy

您应该将数据库端限制为唯一列或更改代码,因为如果不这样做,结果可能会超过1行,您需要根据特定UID检查每对密码。