【问题标题】:Storing User Preferences in Cookie在 Cookie 中存储用户偏好
【发布时间】:2015-06-24 21:11:08
【问题描述】:

我正在使用 php 创建一个网站,它允许用户过滤通过复选框显示的内容。我想保存他们的偏好。我正在使用 jquery.mmenu 并按如下方式生成复选框

<form id="menu-right method="post" action="">
<li>
<a href="">'. $sportArray[$ids]["Event"] . '</a>
<input type="checkbox" class="Toggle" name="sportList[]" value="'.$sportArray[$ids]["Event"].'" />
</li>'
</form>

我可以通过以下代码收集数组并打印数组的值,但我无法设置 cookie、检索 cookie,甚至还没有开始在复选框中添加复选以恢复加载复选框时的“已检查”值。我已经通过 javascript 和 php 尝试了多种方法,但都没有成功。我理解 CSS 中有一些伪元素破坏了 javascript 的几个选项

<?
if(isset($_POST['sportList'])) { 
for ($i=0; $i<=count($_POST['sportList']); $i++){
    echo $_POST['sportList'][$i];
    setcookie('userSportList[$i]', $_POST['sportList'][$i], time()+60*60*24*365, '/');
} 
}
?>

欢迎任何解决方案.. 在这个阶段这可能是愚蠢的,因为我现在尝试了很多选择。也欢迎使用 localstorage 之类的替代方案,最好的解决方案是什么

<?php
            if(isset($_POST['sportList'])) { 
                session_start();
                $_SESSION['sesUserPrefs'] = $_POST['sportList'];

                $serUserPrefs = serialize($_SESSION['sesUserPrefs']);
                $bcSerUserPrefs = base64_encode($serUserPrefs);

                $expire = 2000000000;
                setcookie("cUserPrefs", $bcSerUserPrefs, time()+$expire);

            }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />

        <title>test
        </title>

        <link type="text/css" rel="stylesheet" href="css/main.css" />
        <link type="text/css" rel="stylesheet" href="css/mmenu.5.3.css" />


        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
        <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/hammer.js/1.0.5/jquery.hammer.min.js"></script>
        <script type="text/javascript" src="js/umd.all.js"></script>
        <script src="http://cdn.jsdelivr.net/jquery.cookie/1.4.0/jquery.cookie.min.js"></script>

        <script type="text/javascript">

            //  The menu on the left
            $(function() {
                $('nav#menu-left').mmenu();
            });


            //  The menu on the right
            $(function() {

                var $menu = $('form#menu-right');

                $menu.mmenu({
                    offCanvas: {
                       position : "right"
                    },
                    classes     : 'mm-light',
                    dragOpen    : true,
                    counters    : true,    
                     searchfield: {
                        add: true,
                        search: false
                    },
                    labels      : {
                        fixed       : !$.mmenu.support.touch
                    },
                    navbars: {
                        position:   "top",
                         content: [
                                    '<a href="javascript:document.getElementById(\'menu-right\').submit();">Save</a>'
                            ]
                         }

                });

            });
        </script>
    </head>
    <body>
    <?php
    // DB Configuration
$config = parse_ini_file('config/config.ini'); 


    //Timezone dropdown
function timezone() {    
    $list = DateTimeZone::listAbbreviations();
    $idents = DateTimeZone::listIdentifiers();

    $data = $offset = $added = array();
    foreach ($list as $abbr => $info) {
        foreach ($info as $zone) {
            if ( ! empty($zone['timezone_id'])
                AND
                ! in_array($zone['timezone_id'], $added)
                AND
                  in_array($zone['timezone_id'], $idents)) {
                $z = new DateTimeZone($zone['timezone_id']);
                $c = new DateTime(null, $z);
                $zone['time'] = $c->format('h:i a');
                $data[] = $zone;
                $offset[] = $z->getOffset($c);
                $added[] = $zone['timezone_id'];
            }
        }
    }

    array_multisort($offset, SORT_ASC, $data);
    $options = array();
    foreach ($data as $key => $row) {
        $options[$row['timezone_id']] = $row['time'] . ' - '
                                        . formatOffset($row['offset'])
                                        . ' ' . $row['timezone_id'];
    }

    return $options;
}
function formatOffset($offset) {
        $hours = $offset / 3600;
        $remainder = $offset % 3600;
        $sign = $hours > 0 ? '+' : '-';
        $hour = (int) abs($hours);
        $minutes = (int) abs($remainder / 60);

        if ($hour == 0 AND $minutes == 0) {
            $sign = ' ';
        }
        return 'GMT' . $sign . str_pad($hour, 2, '0', STR_PAD_LEFT)
                .':'. str_pad($minutes,2, '0');

}
?>
        <div id="page">
            <div id="header">
                <a href="#menu-left"></a>
                        <!-- Sub Header -->
                    <form id="tzForm" method="POST" action="">
                    <select name="userTZ" >
                    <?php foreach(timezone() as $key => $tz) { ?>
                    <option value="<?php echo $key; ?>"<?php if ($_POST['userTZ'] == $key) { echo ' selected>';} else { echo '>';} //keep tz as last selected 
                     echo $tz; ?></option>
                    <?php } ?>
                    </select> <input type="submit" value="Set">

                    </form>
                <a href="#menu-right" class="friends right"></a>
            </div> <!-- Close Header -->
            <div id="content">


                <?php


                                //Collect Selected Sport/Category/Event values from right menu

                    if (isset($_COOKIE["cUserPrefs"])) {
                    echo "<script type='text/javascript'>alert('ding ding ding');</script>";
                    } elseif (isset($_SESSION['sesUserPrefs'])) {

                            $sportListItem = $_SESSION['sesUserPrefs'];

                        //update array with selected toggles
                while ($row = $result->fetch_array()) {
                    if ($row['SportCategory'] == $sportListItem OR $row['Sport'] == $sportListItem OR $row['Event'] == $sportListItem)  {
                    $gameArray[ $row['PK_ID'] ] = array(
                                'GameDate' => $row['GameDate'],
                                'Timezone' => $row['Timezone'],
                                'TeamOne' => $row['TeamOne'],
                                'TeamTwo' => $row['TeamTwo'],
                                'urlTeamOne' => $row['urlTeamOne'],
                                'urlTeamTwo' => $row['urlTeamTwo'],
                                'FK_SportData' => $row['FK_SportData']
                                );
                                } //end inside if

                                }; 

                } 


                ?>

            </div>

        <div id="page">

            <div id="content">
                <p id="confirmation"></p>
            </div>
            <nav id="menu-left">
                <?php
                foreach ($sportArray as $ids=>$vals) {

                    //First List Item
                if ($ids == 1) {
                    echo '<ul><li>
                            <a href="?SportID='.$sportArray[$ids]["SportCategory"].'">'. $sportArray[$ids]["SportCategory"]. '</a>
                            <ul class="Vertical">'; 
                         }  
                            //All others check if different to one before
                         elseif ($sportArray[$ids]["SportCategory"] != $sportArray[($ids - 1)]["SportCategory"]) {
                                echo '</ul></li></ul></li><li>
                                        <a href="?SportID='.$sportArray[$ids]["SportCategory"].'">'. $sportArray[$ids]["SportCategory"] . '</a>
                                        <ul class="Vertical">';  //opening thse UL without an event could cause issues
                            }

                    //Check the previous sport is not the same
                if  ($sportArray[$ids]["Sport"] != $sportArray[($ids - 1)]["Sport"]) {
                    echo '<li>
                            <a href="?SportID='.$sportArray[$ids]["Sport"].'">'. $sportArray[$ids]["Sport"] . '</a>
                            <ul class="Vertical">'; 
                        }
                        //Print Event
                    echo '<li>
                            <a href="?SportID='.$sportArray[$ids]["Event"].'">'. $sportArray[$ids]["Event"] . '</a>
                            </li>';


                }

                ?>
                </ul></li></ul></li></ul>   
            </nav>
            <form id="menu-right" method="post" action="">
            <?php
                foreach ($sportArray as $ids=>$vals) {
                    //First List item
                if ($ids == 1) {
                    echo '<ul class="Vertical"><li>
                            <a href="">'. $sportArray[$ids]["SportCategory"]. '</a>
                            <input type="checkbox" class="Toggle" name="sportList[]" value="'.$sportArray[$ids]["SportCategory"].'" />
                            <ul class="Vertical">';
                         }  
                            //All others check if different to one before
                         elseif ($sportArray[$ids]["SportCategory"] != $sportArray[($ids - 1)]["SportCategory"]) {
                                echo '</ul></li></ul></li><li>
                                        <a href="">'. $sportArray[$ids]["SportCategory"] . '</a>
                                        <input type="checkbox" class="Toggle"  name="sportList[]" value="'.$sportArray[$ids]["SportCategory"].'" />
                                        <ul class="Vertical">'; //opening thse UL without an event could cause issues
                            }

                    //Check the previous sport is not the same
                if  ($sportArray[$ids]["Sport"] != $sportArray[($ids - 1)]["Sport"]) {
                    echo '<li>
                            <a href="">'. $sportArray[$ids]["Sport"] . '</a>
                            <input type="checkbox" class="Toggle" name="sportList[]" value="'.$sportArray[$ids]["Sport"].'" />
                            <ul class="Vertical">';
                        }
                        //Print Event
                    echo '<li>
                            <a href="">'. $sportArray[$ids]["Event"] . '</a>
                            <input type="checkbox" class="Toggle" name="sportList[]" value="'.$sportArray[$ids]["Event"].'" />
                        </li>';


                }

                ?>
                </ul></li></ul></li></ul>   
            </form>
        </div>
    </body>
</html>

【问题讨论】:

    标签: javascript php jquery cookies


    【解决方案1】:

    您应该为此使用会话数组。首先将值存储到会话中。然后你需要:

    序列化您的会话数组并应用 base64_encode。把这个值 进入 cookie。

    在开始时检查 cookie 是否存在,然后应用 base64_decode 并反序列化该数据并推送到会话数组中。

    如果您了解序列化、反序列化、base64_encode 和 base64_decode 那么你就可以轻松完成这个任务了。

    希望你能轻松做到这一点。

    【讨论】:

    • 此链接擅长基本会话和 Cookie:link
    • 还是有问题,不明白为什么要有会话和cookie?无论有没有会话,我都无法设置 cookie。 '代码' $userPrefs = $_POST['sportList']; //session_start(); $serUserPrefs = 序列化($userPrefs); $bcSerUserPrefs = base64_encode($serUserPrefs); $过期 = 2000000000; setcookie("userPrefs", $bcSerUserPrefs, time()+$expire);
    • 因为这是最好的方法。要创建 cookie,您需要使用 session_start().........不要将 $_POST['sportList'] 放入 userPrefs ......将会话数组放入 $userPrefs。假设您有名称为 test 的会话,那么它将是: $userPrefs=$_SESSION['test'];现在使用你的代码.....给我看你的整个代码......这样我就可以完成你的代码......
    • 已更新以包含上面的代码。我也将 setcookie 移到了文件的顶部,因为我在某处看到这解决了其他人的问题。我可以获取代码来检测已设置的会话值,但在控制台中看不到它,仍然看不到 cookie。我想使用首选项为用户过滤数组的结果。感谢您提供序列化和编码建议,这将有助于创建用户和保存他们的数据库首选项。
    • 在setcookie之前有没有使用start_session()?
    猜你喜欢
    • 2020-07-22
    • 2014-03-01
    • 2014-09-29
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多