PHP mysqli结果只使用一个函数,但不是第二次使用不同的函数

时间:2018-06-07 22:58:55

标签: php mysqli

我有一个php页面,我从一组SQL查询中生成一个json文件。然后将结果发送到构建数组的函数(person_checker和status_indicator是我知道工作的函数)。

function array_builder($result, $id_name, $column_name, $type, $color)
    {
        global $mysqli;

        while ($row = $result->fetch_array())
        {

            $type_construct = $type . $row[$id_name];

            switch ($type)
                {
                case "work":
                    person_checker($row);
                    $url_color = status_indicator($row,$type)[0];
                    $link = status_indicator($row,$type)[1];
                    $new_type = $type;
                    $new_color = $color;
                    break;

                case "other_work":
                    person_checker($row);
                    $url_color = status_indicator($row,$type)[0];
                    $link = status_indicator($row,$type)[1];
                    $new_type = $type;
                    $new_color = $color;
                    break;

                case "person":
                    $url_color = status_indicator($row,$type)[0];
                    $link = status_indicator($row,$type)[1];
                    $new_type = $type;
                    $new_color = $color;
                    break;

                default:
                    $url_color = 'aliceblue';
                    $link = NULL;
                    $new_color = $color;
                    $new_type = $type;
                }

                $item_array= array(
                'id' => $type_construct,
                'name' => $name,
                'type' => $new_type,
                'color' => $new_color,
                'url_color' => $url_color,
                'link' => $link,
                );

                array_push($GLOBALS['array'], $item_array);

         }
}   

一切正常。但是我需要在构建数组后再次运行结果,以生成数组中项目之间的链接,而我这样做的函数不会产生任何结果:

function link_builder($result,$source_type,$target_type,$source_id,$target_id) {

    global $mysqli;
    global $person_color;
    global $multiple_author_color;
    global $otherwork_other_color;
    global $otherwork_lydgate_color;

    while ($row = $result->fetch_array()) {

    var_dump($result);
    echo"<br>";

    $source_location = array_search_multidim($GLOBALS['array'],'id',$source_type . $row[$source_id]);

    $target_location = array_search_multidim($GLOBALS['array'],'id',$target_type . $row[$target_id]);

    $color = $GLOBALS['array'][$target_location]['color'];

        $array = array(
        'color' => $color,
        'source' => $GLOBALS['array'][$source_location]['id'],
        'target' => $GLOBALS['array'][$target_location]['id'],
        'value' => 1);

        if (in_array_r($array,$GLOBALS['link_array']))
        {}
        else
        {
            array_push($GLOBALS['link_array'],$array);
        }
    }
}

我认为它可能是我在其中使用的函数之一,但即使我将所有内容都删除到var_dump,我仍然没有得到任何结果。该对象仍然存在,因为我可以在页面的开头和结尾转储它并在两个地方获得相同的结果:object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(8) ["type"]=> int(0) }我可以看到其他人遇到了这个问题,但建议的解决方案都没有。我做错了什么,或者有什么东西与mysqli有关,我不知道?我宁愿不再制作另一组SQL调用,这就是我当前版本的这个调用。

1 个答案:

答案 0 :(得分:2)

运行第一个函数后,您将遍历整个结果集。当您运行第二个函数并传入相同的mysqli_result对象时,其内部指针已设置为结尾,因此调用$result->fetch_array()将不会产生(更多)结果。

幸运的是,修复很简单:您需要在函数调用之间回放结果集,以便可以再次遍历结果集:

array_builder($result, $id_name, $column_name, $type, $color);
$result->data_seek(0);
link_builder($result, $source_type, $target_type, $source_id, $target_id);

请注意以下the manual

  

注意:

     

此功能只能用于使用mysqli_store_result()mysqli_query()函数获得的缓冲结果。

如果您的结果来自预先准备好的声明,并且您通过致电$result获得$stmt->get_result(),则需要将其更改为使用$stmt->store_result()才能获得缓冲结果集而不是常规结果集(除非您的应用程序在服务器的内存限制附近运行,否则不应该是必需的)之后调用$stmt->free_result()以释放缓冲结果使用的内存。