使用用户在注册时已经提供的信息(现在在SQL数据库中),当用户登录然后单击以转到表单时,我希望某些表单已经预先填充。登录表格如下:
<?php
session_start();
// check for required fields from the form
if ((!isset($_POST['email'])) || (!isset($_POST['password']))) {
header("Location: userlogin.html");
exit;
}
//connect to server and select database
$mysqli = mysqli_connect("localhost", "user", "password", "database")
or die(mysqli_error());
// use mysqli_real_escape_string to clean the input
$email = mysqli_real_escape_string($mysqli, $_POST['email']);
$password = mysqli_real_escape_string($mysqli, $_POST['password']);
// Create and issue the query
$sql = "SELECT username FROM frmak_form_1 WHERE
email = '".$email."' AND
password = '".$password."'";
$result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));
//get the number of rows in the result set; should be 1 if a match.
if (mysqli_num_rows($result) == 1 ) {
// if authorized, get value of username
while ($info = mysqli_fetch_array($result)) {
$username = stripslashes($info['username']);
}
$_SESSION['user']= $info['username'];
$_SESSION['login_until'] = time() + 60 * 60; // login expires in 1 hour
$display_block = "<p>Welcome, ".$username."!</p>
<br /> <br />
<a href='submitReview.php'>Click Here to Submit a Review!</a>";
}
else {
header("Location: userlogin.html");
exit;
}
mysqli_close($mysqli);
?>
<!DOCTYPE html>
<html>
<head>
<title>User Login REDIRECT!!!</title>
</head>
<body>
<?php echo $display_block; ?>
</body>
</html>
然后“submitReview.php”文件是:
<?php
session_start();
$s = &$_SESSION; // Login status is ON and has NOT yet expired
$isLoggedIn = isset($s['login_until']) && $s['login_until'] > time();
if($isLoggedIn):
$username = $s['user'];
$s['login_until'] = time() + 60 * 60; // extend login expiration to an hour from now.
else
unset($s['login_until'], $['user']);
$username = null;
endif;
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>
<label>username</label>
<br />
<input name="usrnm" id="usrnm" type="text" value="<?php echo $username; ?>"/>
<br />
</p>
</form>
</body>
</html>
在上面的示例中,我只是尝试在表单中显示用户名,因为这是我想要预先填充为文本字段的唯一部分。其他的是一个单选按钮和一个复选框字段,我知道那些会带来更复杂的争论,所以我只是想让最简单的一个先工作。
如果我所做的事情远远不是应该做的事情,那么有人可以指导我做一些有关此类事情的好教程吗?我正在尝试自学PHP和MySQL,所以有时它有点压倒性的。谢谢!
答案 0 :(得分:0)
在第二个文件中,$username
并不代表任何内容,因此不会预先填充任何内容。此外,您不应该使用面值来确定用户是否已登录。任何人都可以创建cookie auth=1
并将其发送到您的PHP服务器。
最简单的学习方法是依靠PHP Sessions。
在每个脚本的顶部,(或在每个脚本顶部包含的文件中),执行:
session_start();
如果这是一个新用户,这将告诉PHP设置SESSION cookie,或者读取现有的SESSION cookie并检索匹配的,先前保存的会话信息。
用户提供登录凭据后,请将状态保存在会话中:
$_SESSION['user']= $info['username'];
$_SESSION['login_until'] = time() + 60 * 60; // login expires in 1hr
现在要检查用户是否从任何脚本登录,您只需:
session_start();
$s = &$_SESSION; // $s is now an alias of $_SESSION
// Login status is ON and has not yet expired
$isLoggedIn = isset($s['login_until']) && $s['login_until'] > time();
if($isLoggedIn):
$username = $s['user'];
// extend the login expiration to an hour from now
$s['login_until'] = time() + 60 * 60;
else:
// user is unknown or login has expired
unset($s['login_until'], $['user']);
$username = null;
endif;
如果您在所有页面上方都包含此块(未经测试的代码),那么您始终可以信赖:
$username
准确无误,或NULL
为未知用户isLoggedIn
告诉您这是否是登录用户。您也可以在$ _SESSION中存储其他内容,并在其他页面上重复使用它们。只需记住在执行任何需要身份验证的操作之前检查登录状态。
同样重要的是要理解会话依赖于cookie,因此如果用户清除其浏览器cookie,即使他在2分钟之前登录,PHP服务器也无法识别她,start_session()
将创建一个全新的会话对她来说。
在您进入并使用会话之前,read this page
PS:这与您的问题无关,但从不在您的数据库中存储纯文本密码。使用password_hash
存储并password_verify
进行检查。