使用Cookie预填充PHP表单

时间:2017-07-29 21:55:17

标签: php mysql forms cookies

使用用户在注册时已经提供的信息(现在在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,所以有时它有点压倒性的。谢谢!

1 个答案:

答案 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进行检查。