Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 我应该如何存储每周投票数据?_Php_Mysql - Fatal编程技术网

Php 我应该如何存储每周投票数据?

Php 我应该如何存储每周投票数据?,php,mysql,Php,Mysql,我正在写一个排名前十的投票系统。民意测验者每周投票选出前十名。我应该如何存储他们每周的民意测验?也就是说,我如何控制投票是在存储(mySQL)还是在PHP(5.x+)计算中进行的 (系统#1)我之前在服务器上设置了一个文件“week.txt”,将其设置为0,然后每周运行一次cron作业来更新+1。当我在数据库中存储民意测验数据时,我只需加载该文件,就可以知道这是几周。我在找更优雅的东西 系统必须: 可以在一年中的任何时候开始 能够跳过几个星期 在计算过程中不需要对周数进行洗牌 除了一次性事件(比

我正在写一个排名前十的投票系统。民意测验者每周投票选出前十名。我应该如何存储他们每周的民意测验?也就是说,我如何控制投票是在存储(mySQL)还是在PHP(5.x+)计算中进行的

(系统#1)我之前在服务器上设置了一个文件“week.txt”,将其设置为0,然后每周运行一次cron作业来更新+1。当我在数据库中存储民意测验数据时,我只需加载该文件,就可以知道这是几周。我在找更优雅的东西

系统必须:

  • 可以在一年中的任何时候开始
  • 能够跳过几个星期
  • 在计算过程中不需要对周数进行洗牌
  • 除了一次性事件(比如说“这是开始日期”,“这是结束日期”,千载难逢的一次),由人免费维护
  • 使用PHP、mySQL、文件或其他“标准”服务器项(其他编程语言或数据库除外)
  • 不需要其他软件(例如“安装软件X,它可以这样做!”)
  • 民意调查人员可能是非技术人员,因此除了“输入前10名”或“编辑前10名”之外,不允许要求他们做任何事情
  • 能够顺利完成日历年的结束(如11月开始,3月结束)
  • 其他资料:

  • 民意调查人员只能在一天内投票
  • 我将同时进行多个民意调查,这些调查相互之间没有关系,因此可能会有不同的跳过周
  • 我以前使用过的系统无法工作,因为为了跳过几周,它需要交互并违反#4,否则无法跳过几周,从而违反#2

    我想到了两个系统,但它们都有上述部分的故障:
    (系统#2)在民意测验者投票时使用PHP的日期(“W”)。因此,第一周他们都得到第48周(例如),第二周得到第49周,所以很容易判断哪一周是什么。问题是,一些民意调查将在日历年内进行,因此我最终会得到48、49、50、51、52、1、2、3、4和上面的第3项。此外,如果我们跳过几周,我们可能会得到48、49、50、1、2、3,这违反了上面的第2和第8条

    (系统#3)然后,我想到只存储他们进入投票的日期。我会设置一个日期,从第一次投票前的一周开始计算,因此,只需要计算两周之间的差值,我就知道了周数。但是,要想跳过违反第二条的几周,没有简单的方法,除非我们把违反第三条的日子重新安排

    (系统4)我当时的想法是,当一位民意测验者第一次投票时,我们只需将其记录为他们第一周的投票。当他们下次投票时,是第2周,以此类推。如果他们想编辑他们的投票(同一天),他们只需使用编辑按钮,我们不会记录新的投票,因为他们会发出编辑的信号。唯一的问题是,如果一个民意调查者忘记了一周,这意味着我必须去更正数据(添加一个空白周或更改他们投票的周数,但违反了#4)。这可以很好地处理跳过周。也许cron工作可以解决这个问题?如果有人忘记了,投票结束后运行的cron作业将在空白周内进入。可以通过编程查看输入的最大周数,如果任何用户ID没有该周数,只需输入空白数据

    如果您可以调整上述任何系统以满足所有标准,那么也可以。我正在寻找一个简单、优雅、免提的解决方案


    请询问任何其他澄清信息。

    在处理周数时,您应该记住2012年1月1日是第52周(而不是第1周)。问题是,您是否希望将投票固定在日历周,或者从投票开始日期起7天的偏移量。考虑一下你的投票在星期五开始,正好在7天后结束。您将跨越日历周障碍,因此有2个“周”供您的用户投票

    我可能更喜欢偏移方法,因为严格的日历绑定通常没有任何帮助。您想回答“第34个日历周的投票数是多少”或“第三个投票周的投票数是多少”的问题吗

    计算偏移量非常简单:

    // 0-based
    $week_offset = floor(time() - strtotime("2011-11-02") / 7);
    
    我不知道你的投票算法。我将通过加权投票(1-3颗星,3颗星为最佳)进行演示:

    运行类似以下内容的查询

    SELECT 
      poll_id, 
      week_offset, 
      SUM(vote) as `value`,
      COUNT(user_id) as `count`,
      AVG(vote) as `average`
    FROM votes_table
    WHERE poll_id = 7
    GROUP BY poll_id, week_offset
    ORDER BY poll_id, week_offset;
    
    我会给你一些

    | poll_id | week_offset | value | count | average |
    |       7 |           0 |     6 |     3 |       2 |
    |       7 |           1 |     4 |     2 |       2 |
    |       7 |           2 |     3 |     1 |       3 |
    |       7 |           5 |     1 |     1 |       1 |
    
    到现在为止,您可能已经注意到间隙0、1、2、[3]、[4]和5

    当从MySQL获取数据时,无论如何都必须迭代结果。那么,为间隙填充扩展该循环的问题在哪里

    <?php
    // your database accessor of heart (mine is PDO)
    $query = $pdo->query($above_statement);
    $results = array();
    $previous_offset = 0;
    foreach ($query as $row) {
      // calculate offset distance
      $diff = $row['week_offset'] - $previous_offset;
    
      // make sure we start at 0 offset
      if ($previous_offset === 0 && $row['week_offset'] > 0) {
        $diff++;
      }
    
      // if distance is greater than a single step, fill the gaps
      for (; $diff > 1; $i--) {
        $results[] = array(
          'value' => 0,
          'count' => 0,
          'average' => 0,
        );
      }
    
      // add data from db
      $results[] = array(
        'value' => $row['value'], 
        'count' => $row['count'],
        'average' => $row['average'],
      );
    
      // remember where we were
      $previous_offset = $row['week_offset'];
    }
    // 0 based list of voting weeks, enjoy
    var_dump($results);
    

    因为为间隙填充扩展该循环比只显示“这是X周数据”的内容更为复杂。如果周标签在显示期间由其他内容控制,而不是实际周数/偏移量,那么这可能并不重要?只要所有的民意测验者都在数据库中存储了相同的周/偏移量,在计算过程中合并就很容易了。要回答rodneyrhem,投票算法是#1=10分,#2=9分,以此类推到#10得1分。投票也只允许在1天内进行,所以问题是“投票的第三周的选票是多少?”
    
    <?php
    // your database accessor of heart (mine is PDO)
    $query = $pdo->query($above_statement);
    $results = array();
    $previous_offset = 0;
    foreach ($query as $row) {
      // calculate offset distance
      $diff = $row['week_offset'] - $previous_offset;
    
      // make sure we start at 0 offset
      if ($previous_offset === 0 && $row['week_offset'] > 0) {
        $diff++;
      }
    
      // if distance is greater than a single step, fill the gaps
      for (; $diff > 1; $i--) {
        $results[] = array(
          'value' => 0,
          'count' => 0,
          'average' => 0,
        );
      }
    
      // add data from db
      $results[] = array(
        'value' => $row['value'], 
        'count' => $row['count'],
        'average' => $row['average'],
      );
    
      // remember where we were
      $previous_offset = $row['week_offset'];
    }
    // 0 based list of voting weeks, enjoy
    var_dump($results);