2012-04-03 61 views
1

請告訴我通過單一登錄控件爲用戶和管理員創建登錄代碼的PHP代碼。管理員以及用戶的單一登錄窗口

我使用下面的代碼,但我認爲這是不這樣做的正確方法...

<form action="" method="post"> 
<input type="text" name="id"/> 
<input type="password" name="pswd"/> 
<input type="Submit" name="submit" value="Submit"/> 
</form> 

<?php 
if(isset($_POST['submit']) { 
ob_start(); 
$id=$_POST['id']; 
$pswd=$_POST['pswd']; 

$sql="SELECT * FROM admin WHERE id=........." 
$query=mysql_query($sql); 
$count=mysql_num_rows($query); 
if($count==1) { 
    header('location: admin/index.php'); 
} else { 
    $sql="SELECT * FROM user WHERE id=........." 
    $query=mysql_query($sql); 
    $count=mysql_num_rows($query); 
    if($count==1) { 
    header('location: user/index.php'); 
    } else { 
    echo 'Invalid id-password combination'; 
} 
} 
} 
?> 

回答

0

這也可以工作,但是你需要遵循某種約定,如管理員用戶標識必須以admin開頭,例如admin_XXX,用戶不能在其用戶標識中使用admin,因此您可以在驗證登錄表單時對其進行過濾。

+0

有在這種情況下,一個問題是,如果用戶鍵入管理員在資源管理器的地址欄中的URL,然後他可以輸入管理員的面板......這是嚴格的錯... – 2012-04-03 07:59:08

+0

你不能讓訪問管理面板只需輸入url,系統必須驗證用戶會話,並且當前用戶必須獲得他已評估的頁面,否則重定向到某個通用頁面或顯示相同的msg。它完全符合你的編程模式,無論你如何實現它,它都必須符合邏輯,除非它適用於程序員並且方便。希望它是有道理的! – bhupesh 2012-04-03 12:50:01

0

首先,您應該驗證$_POST-數據是否來自用戶。你不知道是否有人想惹你的數據庫(請閱讀這裏瞭解更多信息:http://php.net/manual/de/security.database.sql-injection.php)。

確定後,輸入並非惡意,您可以將查詢發送到您的數據庫。我假設你開啓了與MySQL-DB的正確連接?如果是這樣,第一個電話是
$query = mysql_query($sql);而不是$query=mysql_fetch_array($sql);

此外,您應該設置有關會話中用戶登錄狀態的信息。如果不這樣做,則無法確定用戶是否登錄。

如果您在發送管理員或用戶頁面之前無法確定檢查用戶名是否有意義。

+0

感謝您的回覆......我得到了你所說的......但我的問題是,用戶可以通過更改網址後通過他的ID和密碼成功登錄管理面板 – 2012-04-03 08:12:53

+0

這就是爲什麼我提到會議。你應該閱讀關於PHP會話[這裏](http://php.net/manual/en/features.sessions.php)。當您的登錄驗證用戶爲管理員時,您可以將此信息存儲在會話中,例如, '$ _SESSION ['admin] = true;'。在其他頁面中,您必須從會話中查詢此信息,並在用戶不允許查看內容時限制訪問。 'if($ _SESSION ['admin]!= true)header(「Location:/login.php」);' – fragmentedreality 2012-04-03 08:18:53

0

更簡單的解決方案是將所有用戶放在一個表中,併爲它們賦予權限。例如管理員通常爲0級(或具有標誌稱爲根或東西),以及一個簡單的用戶級別1.

所以,當你做你的登錄信息提交,該代碼將檢查這樣的事情:

// $db is your mysql connection 
$user = array(); 
if (isset($_POST) && !empty($_POST)) { 
$sql = "SELECT id, level FROM users WHERE username='".mysql_real_escape_string($_POST['username'])."' AND password=MD5('".mysql_real_escape_string($_POST['password'])."'"; 
$rs = mysql_query($sql, $db); 
if (mysql_num_rows($rs)>0) { 
    $user['username'] = $_POST['username']; 
    $user['login_time'] = time(); 
    // user found, let's see his rights 
    while ($row = mysql_fetch_assoc($rs)) { 
    $rights = $row['level']; 
    $user['id'] = $row['id']; // keep the id for references 
    if ($rights = 0) { 
    $user['admin'] = true; // is admin 
    } else { 
    $user['admin'] = false; // is normal user 
    } 
    } 
    // user array is now full of the data we want, so put it in a session, cookie 
    // or anything else and then go to login area or whatever. 
    header("location: /login-area.php"); 
} else { 
    header("location: /user-login-failed.php"); // Send him to a user not found page 
} 
} else { 
    // The post here is empty. Someone is trying to do something or something went really 
    // wrong. It's up to you. 
} 
1

如果多數民衆贊成你的需要,你可以縮短一個查詢。

<form action="" method="post"> 
.......... 
</form> 

<?php 

    if(isset($_POST['submit'])) { 
     $result = mysql_fetch_array("SELECT user.*, \"user\" as t FROM user WHERE id=".$_POST['id']." UNION SELECT admin.*, \"admin\" as t WHERE id=".$_POST['id']." FROM admin"); 
     if(is_array($result)) foreach($result as $i) { 
      if($i['id']==$_POST['id'] && $i['passwd']==$_POST['passwd']) { 
       // also here you should set cookie to be checked in user/index.php and admin/index.php to prevent user to get into admin space by directly typing the url 
       if($i['t']=="admin") { 
        header('location: admin/index.php'); 
       } else { 
        header('location: user/index.php'); 
       } 
      } 
     } 
    } 
    echo("Invalid id-password combination"); 

?>