【问题标题】:Duplicated data entries in PHP arrayPHP数组中的重复数据条目
【发布时间】:2011-12-02 22:52:28
【问题描述】:

我不确定这里是否合适,因为这更多的是我的理解问题,但我很想知道为什么我会收到此输出:

Response id: 3 Question id: 1 Question: What is my middle name? Title: How Well Do You Know Michael
Array ( [0] => Array ( [0] => 3 [r_id] => 3 [1] => 1 [question_id] => 1 [2] => What is my middle name? [question] => What is my middle name? [3] => How Well Do You Know Michael [title] => How Well Do You Know Michael ) ) 

当我运行这个 PHP 脚本时:

// Grab the response data from the database to generate the form
    $query = "SELECT qr.response_id AS r_id, qr.question_id, q.question, quiz.title " . 
         "FROM quiz_response AS qr " . 
         "INNER JOIN question AS q USING (question_id) " . 
         "INNER JOIN quiz USING (quiz_id) " .
         "WHERE qr.user_id = '" . $_SESSION['user_id'] . "'";
    $data = mysqli_query($dbc, $query) or die("MySQL error: " . mysqli_error($dbc) . "<hr>\nQuery: $query");
    $questions = array(); 
    while ($row = mysqli_fetch_array($data)) {
        echo 'Response id: ' . $row['r_id'] . 'Question id: ' . $row['question_id'] . ' Question: ' . $row['question'] . ' Title: ' . $row['title'] . '<br />';
        array_push($questions, $row);
    }
    print_r($questions);

似乎每条数据都有两个条目。例如,在索引 [0] 和 [r_id] 下有两个“响应 id”条目。两者都等于 3。我担心数组中的重复数据是一种精神错乱的恐惧吗?当我一次执行 10 个查询时,我正在考虑未来,这是否会影响速度或准确性。非常感谢任何输入!

【问题讨论】:

    标签: php mysql database arrays


    【解决方案1】:

    如果您查看mysqli_fetch_array 的文档,您会看到第二个参数$result_type,默认设置为MYSQL_BOTH

    这意味着数字字段索引 (MYSQL_NUM) 和字段名称 (MYSQL_ASSOC) 都用作数组索引。因此,如果您只需要字段名称索引,则必须像这样使用它:

    while ($row = mysqli_fetch_array($data, MYSQL_ASSOC)) {
        // ....
    

    【讨论】:

    • 感谢您的澄清!
    【解决方案2】:

    这种行为是预期的。

    来自http://php.net/manual/en/mysqli-result.fetch-array.php

    mysqli_fetch_array() 是 mysqli_fetch_row() 函数的扩展版本。除了将数据存储在结果数组的数字索引中,mysqli_fetch_array() 函数还可以将数据存储在关联索引中,使用结果集的字段名称作为键。

    【讨论】:

      【解决方案3】:

      直接取自文档:

      返回对应于获取行的字符串数组,如果没有更多行,则返回 FALSE。返回数组的类型取决于 result_type 的定义方式。通过使用 MYSQL_BOTH(默认),您将获得一个包含关联索引和数字索引的数组。使用 MYSQL_ASSOC,您只能获得关联索引(与 mysql_fetch_assoc() 一样),使用 MYSQL_NUM,您只能获取数字索引(与 mysql_fetch_row() 一样)。

      所以改变这个:

       while ($row = mysqli_fetch_array($data)) {
      

      收件人:

       while ($row = mysqli_fetch_array($data, MYSQL_ASSOC)) {
      

      这将只返回字符串键,或者,您可以使用mysqli_fetch_assoc

      【讨论】:

        【解决方案4】:

        阅读http://php.net/manual/en/function.mysql-fetch-array.php,它指出mysqli_fetch_array()(其工作方式与mysql_fetch_array() 相同)的返回值包含数字索引的行数据以及字段名称索引的行数据.如果您只想要字段名称索引数据,请使用mysqli_fetch_assoc()

        【讨论】:

          猜你喜欢
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 2012-10-16
          • 2014-10-12
          • 1970-01-01
          • 2016-04-05
          • 2017-05-08
          • 2013-12-05
          相关资源
          最近更新 更多