Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查Cookie是否已启用_Php_Javascript_Session Cookies - Fatal编程技术网

Php 检查Cookie是否已启用

Php 检查Cookie是否已启用,php,javascript,session-cookies,Php,Javascript,Session Cookies,我正在处理一个需要javascript和会话的页面。如果禁用javascript,我已经有了警告用户的代码。现在,我想处理禁用cookie的情况,因为会话id存储在cookie中 我只想到了几个想法: 在链接和表单中嵌入会话id 警告用户,如果禁用Cookie,则必须启用Cookie(如果禁用Cookie,则需要帮助检测) 最好的方法是什么?谢谢 编辑 根据链接的文章,我提出了我自己的方法,并认为我会分享,其他人可能会使用它,也许我会得到一些评论。(假设您的PHP会话存储在名为PHPSESSID

我正在处理一个需要javascript和会话的页面。如果禁用javascript,我已经有了警告用户的代码。现在,我想处理禁用cookie的情况,因为会话id存储在cookie中

我只想到了几个想法:

  • 在链接和表单中嵌入会话id
  • 警告用户,如果禁用Cookie,则必须启用Cookie(如果禁用Cookie,则需要帮助检测)
  • 最好的方法是什么?谢谢

    编辑

    根据链接的文章,我提出了我自己的方法,并认为我会分享,其他人可能会使用它,也许我会得到一些评论。(假设您的PHP会话存储在名为
    PHPSESSID
    的cookie中)

    内容在这里
    抱歉,但是Javascript是必需的
    
    JavaScript 在JavaScript中,您可以对该属性进行简单的测试,所有主要浏览器都支持该属性。如果您使用的是较旧的浏览器,则可以设置cookie并检查它是否存在。(借用自):

    PHP 在PHP中,它相当“复杂”,因为您必须刷新页面或重定向到另一个脚本。在这里,我将使用两个脚本:

    somescript.php


    JavaScript

    function showCookiesMessage(cookiesEnabled) {
        if (cookiesEnabled == 'true')
            alert('Cookies enabled');
        else
            alert('Cookies disabled');
    }
    
    $(document).ready(function() {
        var jqxhr = $.get('/cookiesEnabled.php');
        jqxhr.done(showCookiesMessage);
    });
    
    您可以使用JavaScript创建cookie并检查它是否存在:

    //Set a Cookie`
    document.cookie="testcookie"`
    
    //Check if cookie exists`
    cookiesEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false`
    
    或者你可以用一个

    Php

    setcookie("testcookie", "testvalue");
    
    if( isset( $_COOKIE['testcookie'] ) ) {
    
    }
    
    <?php
        setcookie('CookieEnabledTest', 'check', time()+3600);
    ?>
    
    <script type="text/javascript">
    
        CookieCheck();
    
        function CookieCheck()
        {
            $.post
            (
                'ajax.php',
                {
                    cmd: 'cookieCheck'
                },
                function (returned_data, status)
                {
                    if (status === "success")
                    {
                        if (returned_data === "enabled")
                        {
                            alert ("Cookies are activated.");
                        }
                        else
                        {
                            alert ("Cookies are not activated.");
                        }
                    }
                }
            );
        }
    </script>
    
    $cmd = filter_input(INPUT_POST, "cmd");
    
    if ( isset( $cmd ) && $cmd == "cookieCheck" )
    {
        echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
    }
    

    不确定Php是否能工作,因为我无法测试它。

    很容易检测到cookie是否已启用:

  • 放一块饼干
  • 拿饼干
  • 如果可以获取设置的cookie,则启用
    cookie
    ,否则不启用

    顺便说一句:
    在链接和表单中嵌入会话id是个坏主意,这对SEO不利。
    
    在我看来,人们不想启用COOKIE的情况并不常见。

    但要检查是否使用isset($\u COOKIE[“COOKIE”])启用了COOKIE,必须刷新。 我就是这样做的(基于cookies的会话:)


    您不能在同一页面的加载集中检查是否设置了Cookie,您必须执行重新加载页面:

    • PHP在服务器上运行
    • 客户端的cookies
    • 仅在加载页面期间发送到服务器的Cookie
    • 刚刚创建的cookie尚未发送到服务器,将仅在下一次加载页面时发送

      • 回答一个老问题,这篇新帖子发布于2013年4月4日

        为了完成@misza的回答,这里有一个高级方法来检查cookie是否在不重新加载页面的情况下启用。@misza的问题在于,当php ini设置
        session.use\u cookies
        不正确时,@misza并不总是起作用。此外,解决方案不会检查会话是否已启动

        我制作了这个函数,并在不同的情况下对它进行了多次测试,并且做得很好

            function suGetClientCookiesEnabled() // Test if browser has cookies enabled
            {
              // Avoid overhead, if already tested, return it
              if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
               { return SU_CLIENT_COOKIES_ENABLED; }
        
              $bIni = ini_get( 'session.use_cookies' ); 
              ini_set( 'session.use_cookies', 1 ); 
        
              $a = session_id();
              $bWasStarted = ( is_string( $a ) && strlen( $a ));
              if( !$bWasStarted )
              {
                @session_start();
                $a = session_id();
              }
        
           // Make a copy of current session data
          $aSesDat = (isset( $_SESSION ))?$_SESSION:array();
           // Now we destroy the session and we lost the data but not the session id 
           // when cookies are enabled. We restore the data later. 
          @session_destroy(); 
           // Restart it
          @session_start();
        
           // Restore copy
          $_SESSION = $aSesDat;
        
           // If no cookies are enabled, the session differs from first session start
          $b = session_id();
          if( !$bWasStarted )
           { // If not was started, write data to the session container to avoid data loss
             @session_write_close(); 
           }
        
           // When no cookies are enabled, $a and $b are not the same
          $b = ($a === $b);
          define( 'SU_CLIENT_COOKIES_ENABLED', $b );
        
          if( !$bIni )
           { @ini_set( 'session.use_cookies', 0 ); }
        
          //echo $b?'1':'0';
          return $b;
            }
        
        用法:

        if( suGetClientCookiesEnabled())
         { echo 'Cookies are enabled!'; }
        else { echo 'Cookies are NOT enabled!'; }
        
        重要提示: 函数在没有正确设置时临时修改PHP的ini设置,并在未启用时恢复该设置。这仅用于测试Cookie是否已启用。当您启动会话并且php ini设置会话时,它可能会出错。use_cookies的值不正确。为确保会话正常工作,请在启动会话之前检查和/或设置会话,例如:

           if( suGetClientCookiesEnabled())
             { 
               echo 'Cookies are enabled!'; 
               ini_set( 'session.use_cookies', 1 ); 
               echo 'Starting session';
               @start_session(); 
        
             }
            else { echo 'Cookies are NOT enabled!'; }
        

        一种透明、干净、简单的方法,使用PHP检查cookie可用性,并利用AJAX透明重定向,因此不会触发页面重新加载。它也不需要会话

        客户端代码(JavaScript)

        (JQuery AJAX调用可以替换为纯JavaScript AJAX调用)

        服务器端代码(PHP)

        第一次调用脚本时,会设置cookie,脚本会告诉浏览器重定向到自身。浏览器可以透明地执行此操作。不会重新加载页面,因为它是在AJAX调用范围内完成的

        第二次,通过重定向调用时,如果收到cookie,脚本将响应HTTP 200(字符串为“true”),因此调用
        showCookiesMessage
        函数


        如果第二次调用脚本(由“reload”参数标识),但未收到cookie,它将用字符串“false”响应HTTP 200,并调用
        showCookiesMessage
        函数。

        这里有一个非常有用的轻量级javascript插件来完成此任务:

        Cookies.set('cookieName','Value');
        setTimeout(函数(){
        var cookieValue=Cookies.get('cookieName');
        if(cookieValue){
        log(“设置了测试Cookie!”);
        }否则{
        document.write(“抱歉,但必须启用cookies

        ”); } Cookies.remove('cookieName'); }, 1000);
        适用于所有浏览器,可接受任何字符。

        您可以进行Ajax调用(注意:此解决方案需要JQuery):

        example.php

        setcookie("testcookie", "testvalue");
        
        if( isset( $_COOKIE['testcookie'] ) ) {
        
        }
        
        <?php
            setcookie('CookieEnabledTest', 'check', time()+3600);
        ?>
        
        <script type="text/javascript">
        
            CookieCheck();
        
            function CookieCheck()
            {
                $.post
                (
                    'ajax.php',
                    {
                        cmd: 'cookieCheck'
                    },
                    function (returned_data, status)
                    {
                        if (status === "success")
                        {
                            if (returned_data === "enabled")
                            {
                                alert ("Cookies are activated.");
                            }
                            else
                            {
                                alert ("Cookies are not activated.");
                            }
                        }
                    }
                );
            }
        </script>
        
        $cmd = filter_input(INPUT_POST, "cmd");
        
        if ( isset( $cmd ) && $cmd == "cookieCheck" )
        {
            echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
        }
        

        结果会出现一个警报框,显示cookie是否已启用。当然,您不必显示警报框,从这里您可以采取其他步骤来处理停用的Cookie。

        Cookie是客户端,无法使用PHP进行正确测试。 这是基线,每个解决方案都是这个问题的总结

        这意味着如果你正在寻找解决你的饼干问题的方法,你就走错了路。不要使用PHP,使用Javascript之类的客户端语言

        你能用PHP使用cookies吗?是的,但是必须重新加载才能使PHP的设置“可见”

        例如:是否可以测试浏览器是否可以使用普通PHP设置cookie。唯一正确的答案是“不”


        您是否可以读取已设置的Cookie:“是”使用预定义的$\u Cookie(启动PHP应用程序之前设置的副本)。

        在链接中嵌入会话id是可能的,但很麻烦。
        function showCookiesMessage(cookiesEnabled) {
            if (cookiesEnabled == 'true')
                alert('Cookies enabled');
            else
                alert('Cookies disabled');
        }
        
        $(document).ready(function() {
            var jqxhr = $.get('/cookiesEnabled.php');
            jqxhr.done(showCookiesMessage);
        });
        
        if (isset($_COOKIE['cookieCheck'])) {
            echo 'true';
        } else {
            if (isset($_GET['reload'])) {
                echo 'false';
            } else {
                setcookie('cookieCheck', '1', time() + 60);
                header('Location: ' . $_SERVER['PHP_SELF'] . '?reload');
                exit();
            }
        }
        
        Cookies.set('cookieName', 'Value');
              setTimeout(function(){
                var cookieValue =  Cookies.get('cookieName');
                if(cookieValue){
                   console.log("Test Cookie is set!");
                } else {
                   document.write('<p>Sorry, but cookies must be enabled</p>');
                }
                Cookies.remove('cookieName');
              }, 1000);
        
        <?php
            setcookie('CookieEnabledTest', 'check', time()+3600);
        ?>
        
        <script type="text/javascript">
        
            CookieCheck();
        
            function CookieCheck()
            {
                $.post
                (
                    'ajax.php',
                    {
                        cmd: 'cookieCheck'
                    },
                    function (returned_data, status)
                    {
                        if (status === "success")
                        {
                            if (returned_data === "enabled")
                            {
                                alert ("Cookies are activated.");
                            }
                            else
                            {
                                alert ("Cookies are not activated.");
                            }
                        }
                    }
                );
            }
        </script>
        
        $cmd = filter_input(INPUT_POST, "cmd");
        
        if ( isset( $cmd ) && $cmd == "cookieCheck" )
        {
            echo (isset($_COOKIE['CookieEnabledTest']) && $_COOKIE['CookieEnabledTest']=='check') ? 'enabled' : 'disabled';
        }