Я пытаюсь преобразовать код MySQLi в код PDO, но безуспешно - PullRequest
0 голосов
/ 11 июня 2019

У меня есть рабочий код с MySQLi, но я делаю какой-то новый проект и хочу сделать с PDO, который показывает многоуровневое представление категорий.Я новичок в области PDO и все еще учусь.

Это мой рабочий MySQLi:

function categoryTree($parent_id = 0, $sub_mark = ''){
    global $db;
    $query = $db->query("SELECT * FROM categories WHERE parent_id = $parent_id ORDER BY name ASC");

    if($query->num_rows > 0){
        while($row = $query->fetch_assoc()){
            echo '<tr><td>'.$sub_mark.''.$row['name'].'</td><td><button type="button" name="update" id="'.$row["id"].'" class="btn btn-info btn-sm update"><span class="glyphicon glyphicon-pencil"></span></button></td></tr>';
            categoryTree($row['id'], $sub_mark.'---');
        }
    }
}

Закрытый вариант для PDO, чего я достиг, но сейчас работаю:

function categoryTree($parent_id = 0, $sub_mark = ''){

    $query = "SELECT * FROM ws_categories WHERE parent_id = $parent_id ORDER BY name ASC";
    $statement = $connection->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();

    if($result->num_rows > 0){
        while ($row = $statement->fetch()) {
            echo '<tr><td>'.$sub_mark.''.$row['name'].'</td><td><button type="button" name="update" id="'.$row["id"].'" class="btn btn-info btn-sm update"><span class="glyphicon glyphicon-pencil"></span></button></td></tr>';
            categoryTree($row['id'], $sub_mark.'---');
        }
    }
}

Ошибка:

Неустранимая ошибка: необученная ошибка: вызов функции-члена prepare () со значением NULL в

ps Я включил config.php с подключением ddo db, котороеподключитесь правильно.

Пожалуйста, помогите мне, я пробую несколько способов, но безуспешно.

Извините за мой английский:)

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Теперь этот код работает, но показывают только родительские категории без подкатегорий:

function categoryTree($parent_id = 0, $sub_mark = ''){
    global $connection;
    $query = 'SELECT * FROM ws_categories WHERE parent_id = :parent_id';
    $statement = $connection->prepare($query);
    $statement->execute(['parent_id' => $parent_id]);

        while ($row = $statement->fetch()) {
                echo '<tr><td>'.$sub_mark.''.$row['name'].'</td><td><button type="button" name="update" id="'.$row["id"].'" class="btn btn-info btn-sm update"><span class="glyphicon glyphicon-pencil"></span></button></td></tr>';
                categoryTree($row['id'], $sub_mark.'---');

    }
}
0 голосов
/ 11 июня 2019

Я думаю, что вы пытаетесь перебрать неправильный набор результатов.И я не уверен, установлен ли атрибут num_rows в fetchAll.

Вы можете заменить детали if и while одной while / foreach.Если вы хотите использовать функцию fetchAll , вы можете просто foreach зациклить набор результатов.Однако, если вы выполняете большой запрос, это может занять много памяти, поэтому не всегда предпочтительнее это делать.

Для решения fetchAll вы получите следующее:

$results = $query->fetchAll()
foreach ($results as $result) {
    var_dump($result); // Process data here.
}

Если вы хотите использовать функцию fetch , которая более дружественна к памяти и ресурсам, вы можете использовать цикл while, как вы использовали в MySQLi:

while ($data = $query->fetch()) {
    var_dump($data); // Process data here.
}

edit:

Я только что заметил, что вы напрямую вставляете переменные в запрос, это плохая практика, так как она допускает sql-инъекцию.Если вы все равно используете PDO, взгляните на подготовленные операторы , вы можете заменить переменную на заполнитель, например.:parent_id затем при вызове execute вы передаете массив, который содержит значение parent_id, и он предотвращает некоторые инъекции sql.

Это будет выглядеть так:

$query = 'select * from ws_categories where parent_id = :parent_id';
$statement = $connection->prepare($query);
$statement->execute(['parent_id' => $parent_id]);
...