【问题标题】:How to get a cookie in php without refreshing the page?如何在不刷新页面的情况下在 php 中获取 cookie?
【发布时间】:2012-10-30 21:35:54
【问题描述】:

我目前有这个代码和两个问题:

我使用 Javascript 获取用户时区,并通过 ajax 将其发布到 timezone.php,该 ajax 使用用户时间设置 cookie。如果未设置 cookie,例如在第一次访问时,则必须刷新页面才能显示 cookie 值。我目前正在使用 javascript 执行此操作,但必须有另一种方式。此外,如果没有 cookie,页面会刷新,禁用 cookie 的用户会出现刷新循环。

对如何解决这些问题有什么建议吗?

谢谢你, 马库斯


index.php:

<!DOCTYPE html>
<html>
<head>
<style>
    .night {
        background: #000;
        color: #fff;
    }
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<?php

        if(isset($_COOKIE["time"])) {
            $time = $_COOKIE["time"];
            if($time < 5.5 || $time > 19) {
                $night = true;
            }
        } else {
            echo("
            <script>
              var timezone = new Date().getTimezoneOffset()/60;

              $(document).ready(function() {
                $.post('timezone.php',{timezone: timezone}, function(data){location.reload(true)});
              });
            </script>
            ");
        }
?>

</head>
<body class="<?php echo $night ? "night" : "day"; ?>">
<?php if($night) {
    echo "It's nighttime! ($time)";
} else {
    echo "It's daytime! ($time)";
} ?>
</body>
</html>

timezone.php:

<?php

$timezone = $_POST["timezone"];

if(isset($timezone)) {
    date_default_timezone_set('Etc/GMT'.($timezone <= 0 ? '' : '+').$timezone);
    $time = date("G") + (date("i")/60);
    setcookie("time", $time);
}

?>

【问题讨论】:

    标签: php javascript ajax cookies time


    【解决方案1】:

    PHP 脚本仅在向服务器发出请求时运行。您可以使用 JS 和 AJAX,或者,如果合适,可以使用 iframe。

    【讨论】:

      【解决方案2】:

      用JavaScript设置类,不需要服务器。

      【讨论】:

      • 我可以,但是如果我在设置 cookie 后在服务器上执行它,性能不是更好吗?
      • 另外,当使用 PHP 时,我只需在会话中为每个 Javascript 请求一次时区。
      【解决方案3】:

      您可以使用 JQuery Plugin https://github.com/carhartl/jquery-cookie 并检查 cookie 是否设置在您的 $.post 方法中

       $.post('timezone.php',{timezone: timezone}, function(data){
           if ($.cookie("time") != null) 
               location.reload(true);
      });
      

      【讨论】:

      • 你不能做一些类似发布参数到当前文件(本例中为 index.php)的事情吗?
      【解决方案4】:

      你可以更改 index.php:

       $.post('timezone.php',{timezone: timezone}, function(data){ 
          if(data=='success'){
              location.reload(true)
          }
       });
      

      在 timezone.php 中:

      <?php
      
      $timezone = $_POST["timezone"];
      
      if(isset($timezone)) {
          date_default_timezone_set('Etc/GMT'.($timezone <= 0 ? '' : '+').$timezone);
          $time = date("G") + (date("i")/60);
          setcookie("time", $time);
          echo "success";
      }
      
      ?>
      

      【讨论】:

      • 好的,这是否意味着如果设置了 cookie,它只会回显“成功”?否则这不会有任何区别。
      • 如果请求没有返回“成功”,则表示从用户获取时区时出错,您可以尝试获取 agian 或执行其他操作: if(data=='success'){ location.reload (true) }else{ // 设置时区不成功,我们将尝试重新获取时区或将用户重定向到允许选择时区的其他页面 }
      • 但时区与 cookie 没有任何关系。如果没有设置 cookie,我只是不想创建刷新循环。
      • 是的,我们有两件事: + 首先是在 cookie 中设置时区的时候。一切都会安好的。 + 秒是当 cookie 中没有设置时区时,你可以发出警报或做其他事情,它永远不会循环,因为我们只调用 ajax 1 次。
      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2013-08-20
      • 2017-05-11
      • 2019-11-25
      • 2017-12-21
      • 2011-06-15
      相关资源
      最近更新 更多