我正在尝试将MySQLi代码转换为PDO代码,但没有成功

时间:2019-06-11 19:39:21

标签: php function mysqli pdo multi-level

我有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.'---');
        }
    }
}

错误:

  

致命错误:未被捕获的错误:在null中调用成员函数prepare()

p.s。我已经将config.php与pdo db连接包括在内,可以正常连接。

请帮助我,我尝试了几种方法但没有成功。

对不起,我的英语:)

2 个答案:

答案 0 :(得分:0)

我认为您正在尝试遍历错误的结果集。而且我不确定属性num_rows是否在fetchAll中设置。

您可以将ifwhile部分替换为单个while / foreach。 如果要使用fetchAll函数,则可以简单地foreach在结果集上循环。但是,如果您进行大型查询,则会占用大量内存,因此并非总是首选。

对于fetchAll解决方案,您将得到以下结果:

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

如果您想使用fetch函数,它对内存/资源更加友好,则可以像在MySQLi中一样使用while循环:

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

编辑:

我刚刚注意到您直接在查询中插入变量,这是错误的做法,因为它允许sql-injection。如果仍然使用PDO,请查看prepared statements,您可以将变量替换为占位符,例如。 :parent_id,然后在您的执行调用中传递一个包含parent_id值的数组,并执行一些SQL注入防护。

这看起来像:

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

答案 1 :(得分:0)

现在此代码有效,但仅显示父类别而不显示子类别:

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.'---');

    }
}