尝试使用pdo获取多级类别树并获取PHP致命错误:在中调用未定义的函数build_category_tree()
我对OOP非常陌生,多年来没有使用php编程,但实际上我正在尝试的是在CRUD应用程序中显示一个多级类别树。我有一个Category类和一个方法,可以根据父类id显示相应的类别。到目前为止,我的其他尝试显示整个内容,即select语句中的所有类别和子类别。这是我的分类课,你会注意到我尝试了一些东西,但没有成功尝试使用pdo获取多级类别树并获取PHP致命错误:在中调用未定义的函数build_category_tree(),php,mysql,pdo,Php,Mysql,Pdo,我对OOP非常陌生,多年来没有使用php编程,但实际上我正在尝试的是在CRUD应用程序中显示一个多级类别树。我有一个Category类和一个方法,可以根据父类id显示相应的类别。到目前为止,我的其他尝试显示整个内容,即select语句中的所有类别和子类别。这是我的分类课,你会注意到我尝试了一些东西,但没有成功 class Category{ // database connection and table name private $conn; private $table_name = "m
class Category{
// database connection and table name
private $conn;
private $table_name = "menu";
// object properties
public $id;
public $name;
public $parent_id;
public function __construct($db){
$this->conn = $db;
}
//Builds the category tree recursively fetching data
function build_category_tree(&$output, $preselected, $parent=0, $indent=""){
$query = "SELECT id, name FROM menu WHERE parent_id = " . $parent . "
";
while($r = $query->fetch(PDO::FETCH_ASSOC)){
$selected = ($r["id"] == $preselected) ? "selected=\"selected\"" : "";
$output .= "<option value=\"" . $r["id"] . "\" " . $selected . ">" . $indent . $r["name"] . "</option>";
if($r["id"] != $parent){
build_category_tree($output, $preselected, $r["id"], $indent . " ");
}
}
}
// used by select drop-down list
function read(){
//select all data
$query = "SELECT
id, name
FROM
" . $this->table_name . "";
/*$query = "SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4, t5.name as lev5\n"
. "FROM menu AS t1\n"
. "LEFT JOIN menu AS t2 ON t2.parent_id = t1.id\n"
. "LEFT JOIN menu AS t3 ON t3.parent_id = t2.id\n"
. "LEFT JOIN menu AS t4 ON t4.parent_id= t3.id\n"
. "LEFT JOIN menu AS t5 ON t5.parent_id= t4.id\n"
. "WHERE t1.parent_id = 0";*/
$stmt = $this->conn->prepare( $query );
$stmt->execute();
return $stmt;
}
function readName(){
/*$query = "SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4, t5.name as lev5\n"
. "FROM menu AS t1\n"
. "LEFT JOIN menu AS t2 ON t2.parent_id = t1.id\n"
. "LEFT JOIN menu AS t3 ON t3.parent_id = t2.id\n"
. "LEFT JOIN menu AS t4 ON t4.parent_id= t3.id\n"
. "LEFT JOIN menu AS t5 ON t5.parent_id= t4.id\n"
. "WHERE t1.parent_id = ? limit 0,1";*/
$query = "SELECT name FROM " . $this->table_name . " WHERE id = ? ";
$stmt = $this->conn->prepare( $query );
$stmt->bindParam(1, $this->id);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$this->name = $row['name'];
}
}
下一个脚本将使用适当的类别构建select标记。由于我有5个级别的类别,我试图简化选择,使其更易于管理
// read the product categories from the database
include_once 'objects/category.php';
$category = new Category($db);
$stmt = $category->read();
/* //This works fine in a single level that is no subcategories
echo "<select class='form-control' name='category_id'>";
echo "<option>Seleccioná la categoría...</option>";
while ($row_category = $stmt->fetch(PDO::FETCH_ASSOC)){
extract($row_category);
echo "<option value='{$id}'>{$name}</option>";
}*/
// put them in a select drop-down
$category->build_category_tree($locations, 0);
// echo "</select>";
?><select><?php echo $locations ?></select>
<!-- Test other options -->
<select>
<option value="-1">Seleccioná la categoría</option>
<?php echo $locations ?>
这不是一个函数,它是一个方法,所以当你进行递归调用时,你仍然需要将它应用到一个对象,我猜是当前的一个,所以$this->build_category_tree…你是什么意思?我在类中应用它,就好像$r[id]!=$父项{$this->build\u category\u tree$output,$preselected,$r[id],$indent.}它不起作用仍然是相同的错误。。。是否应在其他位置调用?错误消息应告诉您问题所在。您在标题中添加的部分以中的未定义函数build_category_tree的调用结束,但紧接着消息会显示文件名和行号。如果您进入该文件,在该特定行,您将看到您正在调用build_category_tree作为函数,而不是methodPHP致命错误:在第21行的/Applications/MAMP/htdocs/n/objects/category.php中调用成员函数fetch对非对象执行操作,第21行是类方法$category->build_category_tree$locations,0;