【问题标题】:Cookie set but not show on another page phpcookie设置但不显示在另一个页面php
【发布时间】:2019-07-04 22:03:53
【问题描述】:

我登录时有一个登录页面,进程页面设置了一个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;
}
?>

【问题讨论】:

  • 您在“用户名”输入中看到了什么值? $_COOKIE 是一个数组,因此 print_r 可能不会输出您期望的用户名值。
  • 启用错误报告,你看到headers already sent,由&lt;?php require("./include-function.php"); ?&gt;Whitespace &lt;?php引起
  • @showdev 我在用户名输入中看到了 array()
  • Lawrence Cherone 有一个很好的观点。 “与其他标头一样,cookie 必须在脚本的任何输出之前发送(这是协议限制)。这要求您在任何输出之前调用此函数,包括 和 标记以及任何空格,”(setcookie @ php.net)。由于您在setcookie 之前有空格,因此可能无法设置。在您的流程脚本中,尝试在 require 之前仅使用一个打开的 php 标记 (&lt;?php),之后不要关闭它 (?&gt;)。
  • @showdev 我在我的 php 上打开了输出缓冲...谢谢我测试它并说出来:)

标签: php cookies missing-cookies


【解决方案1】:

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

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

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

另一点是,正如其他在 cmets 中已经告诉您的那样,setcookie 修改标头,并且所有标头更改必须在任何输出之前完成,并且在您的情况下,您在设置之前输出一个空格饼干。 如果您之前需要输出某些内容,您可以使用输出缓冲区的功能,您可以在标头之前缓冲所有输出,并仅在标头设置后发送。

请参阅更多关于https://www.php.net/manual/en/book.outcontrol.php

虽然我认为你为“try'n”创建了这个页面,但在实际使用中不要实现这样的登录。 因为您在可读格式的 http 请求中传递用户名和密码。 使用 php session数据库中的散列字段 以更高效、更安全的方式存储客户端数据,
为了让用户更轻松地访问页面,制作一个粘性表单,将存储变量中的值注入字段值,而不是打印存储它们的整个数组。

希望这会有所帮助!

【讨论】:

  • 感谢您的好回答,感谢@Lawrence Cherone 和@showdev 关注我的回答,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多