Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 登录时使用或进行MySQL内部连接_Php_Mysql - Fatal编程技术网

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
。有MySQL
JOIN
这样的东西吗?我以为它们是内部的、左侧的、右侧的和完整的?@MatthewPeckham-MySQL
JOIN
internal-JOIN
(尽管显式编写总是更好)结果证明我的问题实际上是密码本身的问题。在注册脚本上,我有
$password=hash('sha256',$salt,$hash)
而不是
$password=hash('sha256',$salt.$hash)所以他们不匹配!谢谢你确认我所做的是正确的。奇怪的是它在那里工作,但不是在我现在的位置。让我尝试在查询语法之外使用()并重试。注册表单设置为每个电子邮件地址只能使用一次,
UID_1
UID_2
都是从自动递增的
UID
中提取出来的,因此无法复制。他也在使用一个
JOIN
而不是
内部JOIN
。有MySQL
JOIN
这样的东西吗?我以为它们是内部的、左侧的、右侧的和完整的?@MatthewPeckham-MySQL
JOIN
internal-JOIN
(尽管显式编写总是更好)结果证明我的问题实际上是密码本身的问题。在注册脚本上,我有
$password=hash('sha256',$salt,$hash)
而不是
$password=hash('sha256',$salt.$hash)所以他们不匹配!谢谢你确认我所说的是正确的。