【发布时间】:2014-04-14 00:48:13
【问题描述】:
我为文字墙道歉,但我一直在努力解决这个问题,所以我会尝试提供尽可能多的信息。 我不太确定我遇到的问题是否与用户会话有关(我是 PHP 新手),但在我看来就是这样。
我要求用户在ask_login.php中输入他的登录信息(id和密码)进入系统:
<div class="login_box">
<h1>Login</h1>
<form method="POST" action="login.php">
<p><input type="text" name="username" placeholder="UserID"></p>
<p><input type="password" name="password" placeholder="Password"></p>
<input type="submit" name="submit" value="Login"></p>
</form>
</div>
如果在数据库中找到登录详细信息(ID 和密码),用户将登录到他的用户门户 (login.php),在那里他可以查看他的详细信息、考试日期等。 . 我的问题是每当我登录时,如果我单击详细信息按钮以检查用户详细信息,它会将我重定向到我的 ask_login.php 页面,再次询问我的登录详细信息,说我没有输入任何 ID/密码详细信息。 我尝试删除检查登录表单是否提交为空白的代码,它最终开始工作,我能够单击“详细信息”按钮或任何其他按钮,而不会重定向到 ask_login.php。 但是现在当我单击“详细信息”按钮时,我的“欢迎,用户名”行没有显示用户名,这让我认为它与 php 会话有关。此外,我进行的任何查询都不会显示结果。
这是我的 login.php 代码:
<?php
session_start();
$username = $_POST['username'];
$password = $_POST['password'];
if($username && $password) {
$conn_error = 'Could not connect.';
$mysql_db = '------';
if(!mysql_connect('localhost', '------', '') || !mysql_select_db($mysql_db)) {
die($conn_error);
}
$query = mysql_query("SELECT * FROM users WHERE id='$username' AND password='$password'");
$numrows = mysql_num_rows($query);
if($numrows!== 0)
{
while($row = mysql_fetch_assoc($query))
{
$dbusername = $row['id'];
$dbpassword = $row['password'];
}
if($username==$dbusername && $password==$dbpassword) {
//echo "You are logged in!";
@$_SESSION['id'] = $username;
}
else {
echo "<script>alert('Username/Password are incorrect');</script>";
echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
die();
//die("Wrong username/password!");
}
}
else {
echo "<script>alert('User doesn't exist.');</script>";
echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
die();
//die("That user doesn't exist!");
}
}
else if(empty($username) || empty($password)) {
echo "<script>alert('You didn't enter an ID/Password');</script>";
echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
die();
//die("Please enter an ID and password!");
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Logged in | FCUL</title>
<link rel="stylesheet" href="css/stylesheet_loggedin.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="shortcut icon" href="img/vitor-20130904-favicon.ico"/>
</head>
<body>
<div id="header">
<br/>
<a href="index.php"><img src="/img/fcul_cent_logo_001.png" width="510" height="70"/></a>
</div>
<div id="loggedinas">
<br/>
Welcome,
<?php
$result = mysql_query("SELECT nome FROM users WHERE id='$username'");
while($row = mysql_fetch_assoc($result)) {
echo $row["nome"];
}
?>
( <?php echo $username; ?> )
<br/>
<div id="logout">
<a href="logout.php"><font size="2"><u>[Logout]</u></a></font></a>
</div>
<hr/>
</div>
<?php
//FETCH USER'S BI
if(isset($_POST['username'] )) {
$ID = $_REQUEST['username'];
$query = "SELECT bi FROM users WHERE id='$ID'";
//if query is successful
if($query_run = mysql_query($query)) {
//if it returns 0 rows
if(mysql_num_rows($query_run)==NULL) {
echo "<script>alert('Unexpected Error 004');</script>";
echo "<script language='javascript'>window.location = 'index.php';</script>";
}
while($query_row = mysql_fetch_assoc($query_run)) {
$bi = $query_row['bi'];
//echo $bi;
}
}
}
?>
<br/>
<center>
<div id="buttons">
<form method="POST" action="login.php">
<input type="submit" name="details" value="details">
</form>
<?php
//**print user's BI if he clicks on 'Details' button**
if($_POST['detalhes']){
echo '<div id="content">' . $bi . '</div>';
}
?>
</div>
</center>
</body>
</html>
【问题讨论】:
-
不管这段代码存在什么问题
-
$username 和 $password 的值是什么?无论如何,您应该在表单中使用 id,并注意您的网站很容易注入,因为您没有使用准备好的语句,并且 mysql_* 已被弃用很长时间。
-
在我看来,一旦你超过 $numrows,我们知道用户名和密码至少匹配 1 行,所以我们可以只使用 $username 和 $password。还要研究 SQL 输入卫生。
-
请不要使用 javascript 将用户重定向到 ask_login.php 如果 javascript 被禁用,他们可以访问 javascript 重定向下的所有内容。只需使用 header('location: file.php');退出;