我的count_vote()函数只能工作

时间:2016-06-18 18:41:48

标签: php mysqli

函数count_vote()用于计算从表单收集并存储在数据库中的投票。

function count_vote($result ,$Q_X){
        $res = array(0, 0, 0, 0, 0);
        while ($report = mysqli_fetch_array($result)) {
            if ($report[$Q_X] == 'X1') {
                $res[0] = $res[0] + 1;

            } elseif ($report[$Q_X] == 'X2') {
                $res[1] = $res[1] + 1;

            } elseif ($report[$Q_X] == 'X3') {
                $res[2] = $res[2] + 1;

            } elseif ($report[$Q_X] == 'X4') {
                $res[3] = $res[3] + 1;

            } elseif ($report[$Q_X] == 'X5') {
                $res[4] = $res[4] + 1;
            }
        }
        if (mysqli_num_rows($result) > 1) {
            return $res;
        }
    }

用户回答了四个问题,其中包含五个文本答案。

   text |  very good  |  good  |  works  |  bad  | very bad
   value|  X1         |  X2    |  X3     |  X4   | X5

使用此格式在数据库中收集答案

        |  Q1   |  Q2   |   Q3   |   Q4   |
user1   |  X1   |  X3   |   X5   |   X4   |
user2   |  X2   |  X2   |   X3   |   X2   |
user3   |  X1   |  X1   |   X1   |   X1   |

我期待来自count_vote()

Question     answer   count
Q1           X1       2
Q1           X2       1
Q1           X3       0
Q1           X4       0
Q1           X4       0
Q2           X1       2
Q2           X2       1
Q2           X3       0
Q2           X4       0
Q2           X4       0

表示Q3,Q4也是

我得到的结果

count_vote()函数适用于第一个问题但不适用于其他问题

Question     answer   count
Q1           X1       2
Q1           X2       1
Q1           X3       0
Q1           X4       0
Q1           X4       0
Q2           X1       0
Q2           X2       0
Q2           X3       0
Q2           X4       0
Q2           X4       0

表示Q3,Q4也是

我用来显示结果

list($Q1_1, $Q1_2, $Q1_3, $Q1_4, $Q1_5) = count_vote($result ,"Q1");

  echo $Q1_1 . ',';
  echo $Q1_2 . ',';
  echo $Q1_3 . ',';
  echo $Q1_4 . ',';
  echo $Q1_5 . '<br>';


  list($Q2_1, $Q2_2, $Q2_3, $Q2_4, $Q2_5) = count_vote($result ,"Q2");

  echo $Q2_1 . ',';
  echo $Q2_2 . ',';
  echo $Q2_3 . ',';
  echo $Q2_4 . ',';
  echo $Q2_5 . '<br>';

表示Q3,Q4也是

我如何选择数据

$query="SELECT * FROM `ex`";
$result=mysqli_query($link, $query);

2 个答案:

答案 0 :(得分:1)

请参阅下面问题的解决方法:

<?php

    include '../mysqCode/masterlink.php';
    mysqli_set_charset($link, 'utf8');

    if (mysqli_connect_error()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $query = "SELECT * FROM `ex`";
    $result = mysqli_query($link, $query);
    $rows = [];
    while ($report = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        $rows[] = $report;
    }

    function count_vote($rows, $Q_X)
    {
        $res = [0, 0, 0, 0, 0];
        array_walk($rows, function ($row) use (&$res, $Q_X) {
            switch ($row[ $Q_X ]) {
                case 'X1':
                    $res[0] = $res[0] + 1;
                    break;
                case 'X2':
                    $res[1] = $res[1] + 1;
                    break;
                case 'X3':
                    $res[2] = $res[2] + 1;
                    break;
                case 'X4':
                    $res[3] = $res[3] + 1;
                    break;
                case 'X5':
                    $res[4] = $res[4] + 1;
                    break;
            }
        });

        return $res;
    }


    list($Q1_1, $Q1_2, $Q1_3, $Q1_4, $Q1_5) = count_vote($rows, "Q1");

    echo $Q1_1 . ',';
    echo $Q1_2 . ',';
    echo $Q1_3 . ',';
    echo $Q1_4 . ',';
    echo $Q1_5;


    list($Q2_1, $Q2_2, $Q2_3, $Q2_4, $Q2_5) = count_vote($rows, "Q2");

    echo $Q2_1 . ',';
    echo $Q2_2 . ',';
    echo $Q2_3 . ',';
    echo $Q2_4 . ',';
    echo $Q2_5 . '<br>';

之前的解释和原因尚无法解决

array mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )

返回与获取的行对应的数组,向前移动内部数据指针

所以当你第二次调用函数时,指针向前移动并且再也不会追踪每一行,结果你在第一次运行后总是收到$ res = [0,0,0,0,0]。

答案 1 :(得分:0)

你的函数获得$ result作为第一个参数。 它在进程中修改$ result:

mysqli_fetch_array($result)

所以在第二次运行期间,$ result是在结果集的末尾,如果没有更多的数据......

我认为使用count_vote()函数直接访问数据库是一种不好的做法。你必须分开关注。

或者,如果你不能,重命名你的函数read_resultset_and_count_votes()以避免出现意外错误......