Yura_Mart
@Yura_Mart

Как правильно переписать код из PDO в процедурный стиль?

Добрый вечер!
Есть готовый рабочий код написанный в стиле PDO, его нужно переписать в процедурном стиле.
Суть кода в том, что необходимо вывести все категории и подкатегории из БД и отобразить их с помощью treeview.j

Как выглядит БД:
616f03759795b230377893.png

Вот в PDO:
$connect = new PDO("mysql:host=localhost; dbname=admin", "root", "");

$parent_category_id = 0;
$query = "SELECT * FROM category";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();

foreach ($result as $row) {
    $data = get_node_data($parent_category_id, $connect);
}

echo json_encode(array_values($data), JSON_UNESCAPED_UNICODE);

function get_node_data($parent_category_id, $connect)
{
    $query = "SELECT * FROM category WHERE parent_id = '" . $parent_category_id . "'";

    $statement = $connect->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    $output = array();
    foreach ($result as $row) {

            $sub_array = array();

            $sub_array['text'] = $row['title'];
            $sub_array['type'] = $row['category_type'];
            $sub_array['nodes'] = array_values(get_node_data($row['id'], $connect));

            $output[] = $sub_array;
    }
    return $output;
}


Вот переписанный код в процедурном стиле:
mysqli_fetch_all тоже пробовал вместо mysqli_fetch_assoc
define("DBHOST", "localhost"); //
define("DBUSER", "root");      //
define("DBPASS", "");      //
define("DB", "admin");   //

$connection = mysqli_connect(DBHOST, DBUSER, DBPASS, DB) or die("Нет соединения с БД");
mysqli_set_charset($connection, "utf8") or die("Не установлена кодировка соединения");

    $parent_category_id = 0;
    $query = "SELECT * FROM category";
    $res = mysqli_query($connection, $query);
    $result = mysqli_fetch_assoc($res);

    foreach ($result as $row) {
        $data = get_node_data($parent_category_id, $connection);
    }
    echo json_encode(array_values($data), JSON_UNESCAPED_UNICODE);

    function get_node_data($parent_category_id, $connection)
    {
        $query = "SELECT * FROM category WHERE parent_id = '$parent_category_id'";
        $res = mysqli_query($connection, $query);
        $result = mysqli_fetch_assoc($res);

        $output = array();
        foreach ($result as $row) {

            $sub_array = array();

            $sub_array['text'] = $row['title'];
            $sub_array['type'] = $row['category_type'];
            $sub_array['nodes'] = array_values(get_node_data($row['id'], $connection));

            $output[] = $sub_array;
        }
        return $output;
    }


Но этот вариант не срабатывает, ругаясь на $sub_array['text'] = $row['title'];, пишет "Uncaught TypeError: Cannot access offset of type string on string"

Вот js файл:
fill_treeview();

    function fill_treeview() {
        $.ajax({
            type: "GET",
            url: site_url + tree_url,
            dataType: "json",
            success: function (data) {
                console.log(data);

                $('#tree').bstreeview({
                    data: data,
                    expandIcon: 'feather icon-chevron-down',
                    collapseIcon: 'feather icon-chevron-right',
                    indent: 2,
                    parentsMarginLeft: '1.25rem',
                    openNodeLinkOnNewTab: false,
                });

            },
            error: function (data) {
                console.log(data);
                $('#treeview').append('Ошибка!');
            }
        })
    }

Ajax запрос отрабатывает как надо, тут проблем нет.
Подскажите пожалуйста где допущена лажа в процедурном варианте?
  • Вопрос задан
  • 199 просмотров
Решения вопроса 1
@KingstonKMS
Вот тут
$result = mysqli_fetch_assoc($res)
mysqli_fetch_assoc извлекает по одной строке из результата запроса.
Используйте while, условием которого будет извлечение строки из результата запроса и присвоение переменной $row, а тело цикла из цикла foreach
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы