2014-01-13 152 views
0

我希望有人可以幫我解決我的問題。基本上我試圖創建的是一個登錄系統,而客戶可以登錄查看他們的包裹詳細信息(地址,帳單號碼等)。但是我很困惑我如何根據登錄的用戶顯示客戶結果登錄時顯示客戶信息

到目前爲止,我有2個表格,一個叫做userlogin和一個叫做userinfo用戶登陸只包含用戶名和密碼的數據,而用戶信息將包含所有的客戶信息(地址,賬單號等)。這兩個表共用一行具有相同的值,user_id。我嘗試過使用MYSQL內部連接等,但我不確定哪裏出錯,爲什麼我不能返回一個用戶信息,而是顯示所有結果,或者不顯示任何結果。

這是我的2頁的代碼,首先是登錄頁面。

//Login.php 
session_start(); 
if($user_is_valid) { 
    //Store the id in the session 
    $_SESSION['user_id'] = $user_id; 

    //Redirect to the home-page 
    header('Location: home.php'); 
    exit; 
} 
////// Login Section. 
$Login=$_POST['Login']; 
if($Login){ // If clicked on Login button. 
    $username=$_POST['username']; 
    $password=$_POST['password']; // Encrypt password with md5() function. 

    // Connect database. 
    //connect 
    $con = mysql_connect("*****","*****","*****"); 
    if (!$con){ 
     die('Could not connect: ' . mysql_error()); 
    } 
    //datebase 
    mysql_select_db("*****", $con); 

    // Check matching of username and password. 
    $result=mysql_query("select * from userlogin where username='$username' and password='$password'"); 
    if(mysql_num_rows($result)!='0'){ // If match. 
    $_SESSION ['user']['id'] = $result ['id']; 
     session_register("username"); // Craete session username. 
     header("location:home.php"); // Re-direct to main.php 
     exit; 
    } 
    else { // If not match. 
     $message="--- Invalid Username or Password ---"; 
    } 

} // End Login authorize check. 

這裏是主頁(將顯示客戶信息的頁面)。

//Home.php 
if(!strlen(trim($_SESSION['username']))) { 
header("Location:login.php"); 
exit(); 
} 
session_start(); 
echo $_SESSION['user_id']; //This will output the value we set earlier 

$con = mysql_connect("*****","*****","*****"); 
if (!$con){ 
    die('Could not connect: ' . mysql_error()); 
} 
//datebase 
mysql_select_db("*****", $con); 
//select 
$user_id = $_GET['user_id']; 
$result = mysql_query("SELECT userinfo.name as name, userinfo.address as address, userlogin.username as username 
         FROM userinfo 
         INNER JOIN userlogin ON userlogin.user_id = userinfo.user_id 
         WHERE userlogin.user_id = userinfo.user_id"); 

while($row = mysql_fetch_array($result)){ 
    echo $row['name'] . '</br> '; 
    echo $row['username'] . '</br> '; 
    echo $row['address'] . '</br> '; 
} 
在堅果殼

所以,我所要做的是創建一個系統,而用戶可以去到我們的網站,登錄,然後有顯示自己對他們的信息,但我不能確定在哪裏出了問題,老實說我迷惑了自己。

我明白,我可能沒有很好的解釋這一點,或者我的代碼可能不是很乾淨,但是請任何反饋,問題,或者如果你能指出我在正確的方向我會不勝感激!謝謝!

+0

我認爲首先會真正幫助你的是整理你的代碼。這聽起來很迂腐,但在確定代碼流是否是你認爲的是至關重要的。特別是第二個示例的第3 /第4行在你跳出PHP並返回時很容易產生歧義,而且很難確定你的條件語句是否仍在評估中。我知道,也許有一些是它在這個網站上的格式,但它有助於每個人都有一致的編碼標準。我會盡我所能編輯。 – M1ke

+2

在使用您的SQL查詢中未轉義的值之前對請求進行消毒或使用準備好的查詢。 您的第二頁home.php上的user_id變量是從 中檢索到的查詢字符串,但它似乎並未實際傳遞給home.php。怎麼把當前登錄的用戶的ID存儲在會話中? 您還應該考慮任何人(在您當前的設置中)都可以通過更改請求中的user_id來查看任何用戶的詳細信息。您需要聲明當前登錄用戶的身份並確定他們有權訪問哪些資源。 – oens

+0

同意Morteza;在這裏你已經有了一些正確的代碼,但開始開發Web應用程序的方式並不是盲目破解東西 - PHP是一門很好的語言,但是很容易在早期找到壞習慣。還有其他反饋意見我會給你的查詢(你不需要別名或連接),但正確啓動是最好的建議。 – M1ke

回答

0

變化:

$result = mysql_query("SELECT userinfo.name,userinfo.address,userinfo.username 
FROM userinfo 
INNER JOIN userlogin ON userlogin.user_id = userinfo.user_id 
WHERE userlogin.user_id = $user_id;"); 

$result = mysql_query("SELECT userinfo.name,userinfo.address,userinfo.username 
FROM userinfo 
INNER JOIN userlogin ON userlogin.user_id = userinfo.user_id 
WHERE userlogin.user_id = $user_id"); 

你有你的PHP變種後一個分號。

0

你可以把會話存儲 「pageloads」 /請求之間的狀態的地方。在這種情況下,狀態可能是 用戶是否已通過身份驗證,如果是,則用戶具有的身份是什麼。例如,當用戶登錄 並且您已在數據庫/後端 中驗證了他們的身份後,您將初始化一個會話並存儲其用戶標識。這允許您 您在任何以下請求中檢索此ID,直到您 銷燬會話。

//Login.php 
session_start(); 
if($user_is_valid) { 
    //Store the id in the session 
    $_SESSION['userid'] = $userId; 

    //Redirect to the home-page 
    header('Location: Home.php'); 
    exit; 
} 

這允許我們通過簡單的初始化會話和獲取內容的$_SESSION['userid'] ,像這樣來檢索任何後續pageloads 用戶名:

//Home.php 
session_start(); 
echo $_SESSION['userid']; //This will output the value we set earlier 

最後,也許我們還需要一個網頁,清除我們在當前用戶的會話中存儲的內容 在情況下,用戶想要 註銷:

//Logout.php 
session_start(); 
$_SESSION = array(); 
session_destroy(); 

這種設置還可以確保用戶只能看到他們被允許到 信息。即使會話可能被篡改爲 ,但如果人們不小心,他們比 更難以混淆,只需更改查詢字符串中的某個參數即可。

至於實際的數據庫交互,我建議切換 到的mysqli或MySQL PDO爲舊版本的MySQL已經被棄用,請參閱: http://php.net/pdo_mysqlhttp://php.net/mysqli

這也可以讓您輕鬆拍攝準備報表的優勢 避免SQL注入問題的簡單方法。很明顯,有一些開銷和使用準備好的語句相關的問題, ,但在你的情況下,我認爲這對你來說是最簡單的。檢查出MySQL Prepared Statements或做一個快速的計算器搜索。

+1

感謝您的反饋,我已經編輯了相應的代碼(檢查原始帖子)然而,問題仍然存在,因爲在我的主頁上我的數據庫結果仍然顯示,我仍然不明白爲什麼。另外感謝您關於PDO和mysqli的鏈接,您將很高興知道我目前正在嘗試實施這些過程。 – King

+0

@King上面的我的建議並不是一個即插即用的解決方案(您剛剛將它們粘貼到您的代碼中)。變量是佔位符,因此您需要添加實際使其工作的邏輯。關於你的SQL,我相信你在你的WHERE子句中缺少一個限制,就像這樣:SELECT userinfo。* FROM userinfo JOIN userlogin ON userlogin.user_id = userinfo.user_id WHERE userlogin.user_id = $ user_id'其中$ user_id是包含要查找的用戶的ID的變量。 – oens

相關問題