【问题标题】:setcookie isn't working设置cookie不工作
【发布时间】:2012-11-07 22:22:07
【问题描述】:

我看到很多人都问过类似的问题,所以如果我重复但我在其他帖子中找不到答案,请原谅。

这只是一个测试页面,在 localhost 上运行。我有一个 HTML 登录页面,将表单数据发送到 PHP 脚本,该脚本正在检查 MySQL 数据库中的详细信息。尝试设置带有结果的 cookie,但无法正常工作。

$user = $_POST['USER'];
$pass = $_POST['PASS'];

$res = $con->query("SELECT * FROM users WHERE username = '".$user."' AND password = '".$pass."'");
$row_no = $res->num_rows;
if ($row_no > 0) {
    $row = $res->fetch_assoc();
    $username = $row['username'];
    $password = $row['password'];

    setcookie('cookie1', $user, time() + 3600);

    if (isset($_COOKIE['cookie1'])) {
        echo "cookie set";
    }
    else {
        echo 'cookie not set';
    }

    echo "Hello " . $username . ', your password is ' . $password;
}
else {
    echo "Sorry, either your username or password is wrong";
}

我想我知道 cookie 在设置它的页面上不可用,但即使我重新加载页面,$_COOKIE 变量也是空的。 脚本中isset 部分的结果始终是“cookie not set”。我还尝试将 cookie 上的域设置为“/”。

感谢您的帮助。

(ps MySQL 部分工作正常)

【问题讨论】:

  • 强制:您的代码容易受到SQL injection的攻击
  • 如果用户将密码发布为:“”;'从用户中删除;' ???
  • 您的 cookie 寿命只有 1 小时。检查服务器是否比客户端浏览器晚 1 小时。有关详细信息,请参阅下面的帖子。
  • 感谢注射提醒。这是本地主机上的测试页面。如果我让它活着,我当然会消毒。

标签: php cookies setcookie


【解决方案1】:

另外,检查客户端和服务器上的时间。您的服务器将 cookie 设置为距当前时间一小时。 cookie 的生命周期由客户端决定——如果客户端浏览器上的时间比服务器提前一个多小时,浏览器可能会立即丢弃 cookie。您可以通过将 cookie 设置得更长一些来测试这一点,例如 time() + 36000(10 小时)。

cookie 在请求的下一页的 $_COOKIE 数组中可用,而不是在您调用 setcookie() 后的当前页面中。

【讨论】:

  • 我想使用会话变量会起作用,而不会重写他的代码。
  • Op 明确表示,“我想我知道该 cookie 在设置它的页面上不可用,但即使我重新加载该页面,$_COOKIE 变量也是空的。 "
【解决方案2】:

这不起作用的原因是,正如 Ray 指出的那样,cookie 在请求的下一页上可用。这样做的原因是因为 cookie 信息是在 HTTP 标头中传输的。所以你的代码基本上是这样做的:

-嘿,当我将此页面发送给用户时,告诉他创建此 cookie。

-(在将页面发送给用户之前)嘿,使用用户拥有的cookie。

但他还没有那个 cookie,因为你还没有将页面发送给他(因此还没有发送 HTTP 标头告诉他创建 cookie)

【讨论】:

    【解决方案3】:

    Click here for PHP Documentation on setcookie();

    setcookie() 定义了一个 cookie 与其余的 HTTP 标头一起发送。与其他标头一样,必须在脚本的任何输出之前发送 cookie(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。

    一旦设置了 cookie,就可以在 下一页加载 中使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。注意,像 $_COOKIE 这样的超全局变量在 PHP 4.1.0 中可用。 Cookie 值也存在于 $_REQUEST 中。

    【讨论】:

      【解决方案4】:

      做类似的事情

      setcookie(...);
      var_dump($_COOKIE[...]);
      

      总会失败。

      在处理用户请求的默认状态下,$_COOKIE 超全局表示与请求一起从浏览器发送的所有 cookie 的数据数组。 setcookie() 函数不会为当前正在处理的请求更改此数组。

      但它应该在用户的下一个请求中显示。

      如果出于某种原因,您希望当前的请求处理逻辑“理解”已设置回送的带有响应标头的 cookie,您可以手动设置 $_COOKIE 数组中的值,例如:

      setcookie(...);
      $_COOKIE[...] = 'some value';
      var_dump($_COOKIE);
      

      在使用setcookie() 之前,您还需要验证您没有向浏览器发送任何输出。如果您使用display_errorserror_reporting(E_ALL) 进行开发,您应该会看到一个警告。您还可以查看浏览器的基本 Web 开发工具,以检查响应标头以查看是否正在发送 cookie。

      【讨论】:

      • 感谢您的回答。我实际上是在重新加载同一页面以强制对 cookie 进行新请求。我将 JS 更改为重定向到域上的另一个页面,它开始工作。但你的回答让我更好地理解了为什么会这样。
      【解决方案5】:

      来自http://php.net/manual/en/function.setcookie.php

      一旦设置了 cookie,就可以使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组在下一页加载访问它们。注意,像 $_COOKIE 这样的超全局变量在 PHP 4.1.0 中可用。 Cookie 值也存在于 $_REQUEST 中。

      【讨论】:

        猜你喜欢
        • 2017-09-28
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        相关资源
        最近更新 更多