PHP MySQL результат работает один раз с функцией, но не второй раз с другой функцией - PullRequest
0 голосов
/ 08 июня 2018

У меня есть страница php, где я генерирую файл json из набора SQL-запросов.Затем результаты отправляются в функцию, которая создает массив (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) } Я вижу, что у других людей была эта проблема, но ни одно из предложенных решений не работает.Что я делаю не так, или что-то происходит с MySQL, о котором я не знаю?Я бы предпочел не делать другой набор вызовов SQL, как это делает моя текущая версия этой страницы.

1 Ответ

0 голосов
/ 08 июня 2018

Как только вы запустите первую функцию, вы пройдете весь набор результатов.Когда вы запускаете вторую функцию и передаете тот же объект 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);

Обратите внимание на следующее из руководства :

Примечание:

Эта функция может использоваться только с буферизованными результатами, полученными от использования mysqli_store_result () или mysqli_query () functions.

Если ваш результат получен из подготовленного оператора, и вы получаете $result, позвонив по номеру $stmt->get_result(), вам нужно изменить его на $stmt->store_result(), чтобы получить буферизованный результирующий набор вместо обычного результирующего набора и (опционально, не обязательный, если ваше приложение не работает вблизи пределов памяти сервера) вызовите $stmt->free_result() впоследствии, чтобы освободить память, используемую буферизованными результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...