0

我登录时有一个登录页面,进程页面设置了一个 cookie,我想使用这个 cookie 下次自动登录。Cookie 设置在浏览器上,我可以看到它,但是当我想在登录页面上使用它时,cookie 是空的(浏览器仍然有它,我可以看到它)

浏览器:Mozilla

目录:

index.php (login page) --> in root /
include-function --> /functions/include-function.php
form-process.php --> /functions/form-process.php

我打开了 php.ini 的输出缓冲

注意:这篇文章在回答后编辑

这是我的登录页面:

<?php
require("./functions/include-function.php");
 ?>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="./style/form.css">
<script type="text/javascript"src="./js/form.js">

</script>
<title></title>
</head>
<body>
<div class="wrapper">
<div class="container">
    <h1>Welcome</h1>

    <form class="form" method="get" action="./functions/form-process.php">
        <input type="text" placeholder="Username" name="username">
    <input type="text" placeholder="Username" name="username" value="<?php print_r($_COOKIE); ?>">

        <input type="password" placeholder="Password" name="password">
        <button type="submit" id="login-button" name="submit" value="submit">Login</button>
    </form>
    </div>

    <ul class="bg-bubbles">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    </ul>
    </div>
     </body>
     </html>

这是我的流程页面:

<?php require("./include-function.php"); ?>
<?php
if (isset($_GET['submit'])) {
$username = $_GET['username'];
$pass = $_GET['password'];
$message = validation_form($_GET);
$value = 45;
$cookieName = "us";
if ($username == "vahid@gmail.com" && $pass == "123456" && empty($message)) {
 $expired = time() + (60 * 60 * 24 * 1);
 setcookie($cookieName,$value,$expired);
 // redirect_to("http://www.youtube.com/");
 print_r($_COOKIE);
}else{
  redirect_to("../index.php");
}
}
?>

这是我的函数文件:

<?php
function redirect_to($location){
header("Location:". $location);
exit;
}

function  validation_form($value=[]){
$message = [];
// Field must not Empty
// trim() so empty space not count
$username =trim($value['username']);
$password =trim($value['password']);
if (!isset($username) || $username==="" || empty($username)
      || !isset($password) || $password==="" || empty($password)) {
      $message['validation'].="Username and Password must not empty";
}

// Length Check
$max = 20;
$min = 3;
if (strlen($username) > $max || strlen($password) > $max) {
  $message['validation'].= "Password Or Username Must not more than 20 character";
}
if (strlen($username) < $min || strlen($password) < $min) {
  $message['validation'].= "Password Or Username Must not less than 3 character";
}

// Type Check
if (!is_string($password)) {
  $message['validation'].= "Password Must be Number";
}

//Preg_match
if (!preg_match("/@/",$username)) {
  $message['validation'].= "Your username is your email ";
}
return $message;
}
?>
4

1 回答 1

0

因此,如果我理解正确,您想在输入用户名和密码值时创建一个登录页面,下次刷新您已经登录的页面时?或者你想让表格变得粘稠并保持之前插入的值?

顺便说一句,如果登录脚本不在操作表单脚本的同一文件夹中,您在登录脚本中看不到 cookie,因为默认情况下,浏览器仅在设置 cookie 的脚本的文件夹或子文件夹中的页面上发送 cookie,在这种情况下,动作表单脚本。

所以首先设置$path = "/"并将其作为 setcookie 参数,告诉浏览器:“在域或子域中的每个脚本中发送 cookie”

另一点是,正如其他人在评论中已经告诉您的那样,setcookie 修改了标头,并且所有标头更改都必须在任何输出之前完成,并且在您的情况下,您在设置 cookie 之前输出一个空格。如果您之前需要输出一些东西,您可以使用输出缓冲区的功能,您可以在标头之前缓冲所有输出并仅在设置标头后发送。在https://www.php.net/manual/en/book.outcontrol.php

上查看更多信息。

很难,我认为您将此页面设置为“try'n”,在实际使用情况下不要实现这样的登录。因为您在可读格式的 http 请求中传递用户名和密码。在数据库中使用php 会话散列字段以更有效和更安全的方式存储客户端数据,
并允许用户更轻松地访问页面,制作一个粘性表单,将存储变量中的值注入字段值,而不是打印整个数组存储它们。

希望这可能会有所帮助!

于 2019-06-29T14:40:36.170 回答