>我正在创建一个网站,其中有三种不同的访问级别
- 0 = 正常
- 1 = 员工
- 2 = 管理员
在登录表单中,我设法检查密码(SHA1(是否与数据库中的密码(已加密(匹配,但没有检查用户ID。
当用户或员工/管理员注册时,他们的详细信息将存储在具有更多详细信息的单独表(姓名,出生日期,...(。
问题
-
我将如何在代码中实现这一点?
$result = mysql_query( $qs ) or die( mysql_error() ); while( $row = mysql_fetch_array( $result ) ){ $stored_password = $row['Password']; if( $stored_password == sha1( $pw ) ){ $_SESSION['Status'] = $row['Status']; if( $_SESSION['Status'] == 0 ){ echo "<h1>User Menu Loading...</h1>"; echo"<META HTTP-EQUIV='Refresh' Content='1;URL=http://***/'>"; }else{ echo "<h1>Incorrect Password.</h1>"; echo"<META HTTP-EQUIV='Refresh' Content='1;URL=http://**/login.php'>"; } }
-
有没有办法让这三种类型的用户都通过登录页面登录,并可以从两个不同的表中检索数据?
我已经尝试了很多方法,但总是出现空白屏幕或它说
密码不正确
即使密码正确。
变量
$un = $_POST['User_ID'];
$sf = $_POST['Staff_ID'];
$pw = $_POST['Password'];
$st = $_POST['Status'];
如果没有,那么我认为我应该创建单独的登录区域。
谢谢(我目前正在将mysql更改为mysqli(
编辑
添加了最近一次尝试
$qs$qs="SELECT Cadets.Cadet_ID, Cadets.Password, Cadets.Status,
Staff.Staff_ID, Staff.Password, Staff.Status,
FROM Cadets, Staff
WHERE Cadets.Cadet_ID ='$un' AND Staff.Staff_ID = '$sf'";
Q.1( 要检查用户 ID:首先检查数据库中的用户 ID,然后检查密码
$db=new mysqli("host", "sqlusername","sqlpassword","database");
$stmt = $db->prepare("select * from your_table_name where user_ID = ?");
$stmt->bind_param("s",$un);
$stmt->execute();
$result=$stmt->get_result();
Q.2( 是的。有一种方法可以做到这一点。但是问题有点不完整,添加一些代码。
当您编辑问题以包含更多信息时,我将更新我的答案。
A( 你不应该使用 mysql 库,因为它不安全且已弃用(即将被删除(:为什么我不应该在 PHP 中使用 mysql_* 函数?你应该使用 mysqli 或 PDO 库。
B( sha1不安全,你应该使用 password_hash(( 或 crypt(( 之类的东西,但我想 sha1 对于教育目的来说很好。
C( 问题 1:您无需检查 ID。
您使用while ($row = mysql_fetch_array($result)) {
但由于您正在寻找唯一的用户名/组合,因此应该只有一个结果或没有:
if ($record = mysql_fetch_array($result)) {
您似乎只检查密码是否正确,但您确实应该检查用户名和密码的唯一组合(如果两个用户具有相同的密码怎么办? sha1()
在那里没有帮助你。
所以你应该有这样的东西:
$qs = "SELECT * FROM users WHERE username = '$username' AND password = '" . sha1($pw) ."'"
或者,如果您使用实际员工 ID 作为用户名:
$qs ="从用户名 = '$id' 和密码 = '" 的用户中选择 * "。sha1($pw( ."'">
D(您将无法echo "<h1>User Menu Loading...</h1>";
看到此消息,因为您有重定向
E( 问题 2:您需要澄清更多,是否有 2 或 3 张表(因为您提到有 3 种类型的用户(。