我有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连接包括在内,可以正常连接。
请帮助我,我尝试了几种方法但没有成功。
对不起,我的英语:)
答案 0 :(得分:0)
我认为您正在尝试遍历错误的结果集。而且我不确定属性num_rows
是否在fetchAll中设置。
您可以将if
和while
部分替换为单个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.'---');
}
}