2014-01-13 53 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