Php 登录时使用或进行MySQL内部连接
我的表格结构如下:Php 登录时使用或进行MySQL内部连接,php,mysql,Php,Mysql,我的表格结构如下: ~ MEMBERS ~ UID (a-i) NAME EMAIL ~ COUPLES ~ UID_1 UID_2 PASSWORD SALT $result = mysqli_query($con, $query); if(mysqli_num_rows($result) == 0) { header('Location: index.php?msg=error4'); exit(); } $data = mysqli_fetch_array($res
~ MEMBERS ~
UID (a-i)
NAME
EMAIL
~ COUPLES ~
UID_1
UID_2
PASSWORD
SALT
$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.";
}
当一对夫妇注册时,他们的UID连同他们的联合密码(及其salt)一起被插入到夫妻表中。现在,当登录时,我需要加入表,以便检查任一用户的密码
i、 e.查找电子邮件地址>查看他们所在的夫妇>检查密码
这是我当前的查询:
$query = "SELECT * FROM MEMBERS m
INNER JOIN COUPLES c ON ((c.UID_1 = m.UID) OR (c.UID_2 = m.UID))
WHERE EMAIL = '$email'";
(我现在只使用*
,因为我无法准确地确定需要为内部联接选择什么才能工作。)
login script.php
上的其余代码如下:
~ MEMBERS ~
UID (a-i)
NAME
EMAIL
~ COUPLES ~
UID_1
UID_2
PASSWORD
SALT
$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
,这意味着密码不匹配,但我看不到我代码的这一部分有问题。我相信它告诉我它们不匹配,因为它没有在正确的表中查找正确的数据,这肯定是我的内部连接有问题
任何帮助都将不胜感激
编辑:我现在意识到,对于这两个记录,只要把密码和盐放在成员中就更有意义了,所以我只从一个表中进行选择,但契约已经完成,我很好奇这是否可行。事实上,我尝试了你的结构和代码,这对我有效:
SELECT * from members M JOIN couples C ON uid_1=Uid or uid_2=uid
WHERE email='youremail';
也许问题是,在表格中,一个人实际上有不止一对夫妇?
比如:
您应该在数据库端将其限制为唯一列或更改代码,因为如果不这样做,您可能会得到超过1行的结果,并且您需要根据特定的UID检查每对夫妇的密码。实际上,我尝试了您的结构和代码,这对我很有用:
SELECT * from members M JOIN couples C ON uid_1=Uid or uid_2=uid
WHERE email='youremail';
也许问题是,在表格中,一个人实际上有不止一对夫妇?
比如:
您应该在数据库端将其限制为唯一列或更改代码,因为如果不这样做,您可能会得到超过1行的结果,您需要根据特定的UID检查每对夫妇的密码。实际上,将密码放在MEMBERS表中是没有意义的。从安全角度来说,将用户名和密码分开是个好主意。好吧,很高兴知道,谢谢。我无意中做了一些正确的事情!不过,对于有多重婚外情的淘气夫妇来说,这不是一件好事,他们可能会被锁在系统之外:事实上,把密码放在成员表中是没有意义的。从安全角度来说,将用户名和密码分开是个好主意。好吧,很高兴知道,谢谢。我无意中做了一些正确的事情!不过,对于有多重婚外情的淘气夫妇来说,这并不是一件好事,他们可能会被排除在系统之外:多德希望知道这在那里有效,但在我所在的地方却不行。让我尝试在查询语法之外使用()并重试。注册表单设置为每个电子邮件地址只能使用一次,UID_1
和UID_2
都是从自动递增的UID
中提取出来的,因此无法复制。他也在使用一个JOIN
而不是内部JOIN
。有MySQLJOIN
这样的东西吗?我以为它们是内部的、左侧的、右侧的和完整的?@MatthewPeckham-MySQLJOIN
到internal-JOIN
(尽管显式编写总是更好)结果证明我的问题实际上是密码本身的问题。在注册脚本上,我有$password=hash('sha256',$salt,$hash)
而不是$password=hash('sha256',$salt.$hash)代码>所以他们不匹配!谢谢你确认我所做的是正确的。奇怪的是它在那里工作,但不是在我现在的位置。让我尝试在查询语法之外使用()并重试。注册表单设置为每个电子邮件地址只能使用一次,UID_1
和UID_2
都是从自动递增的UID
中提取出来的,因此无法复制。他也在使用一个JOIN
而不是内部JOIN
。有MySQLJOIN
这样的东西吗?我以为它们是内部的、左侧的、右侧的和完整的?@MatthewPeckham-MySQLJOIN
到internal-JOIN
(尽管显式编写总是更好)结果证明我的问题实际上是密码本身的问题。在注册脚本上,我有$password=hash('sha256',$salt,$hash)
而不是$password=hash('sha256',$salt.$hash)代码>所以他们不匹配!谢谢你确认我所说的是正确的。