如何使用PHP和MySQL创建JSON嵌套子父树(PDO方法)

时间:2015-10-25 02:35:50

标签: php mysql json angularjs tree

我正在尝试使用PHP和MySQL构建嵌套的父子JSON树。 我的目标是从我的MySQL数据库创建一个JSON树,并使用AngularJS在前端显示一个树。创建树很重要。
我的数据库结构是:

╔═══════╦═══════════════════╦═════════╗
║  id   ║       name        ║parent_id║
╠═══════╬═══════════════════╬═════════╣
║   1   ║       Parent      ║    0    ║
║   2   ║       Child-1     ║    1    ║
║   3   ║       Child-2     ║    1    ║
║   4   ║   Grand Child-1   ║    2    ║
║   5   ║   Grand Child-2   ║    2    ║
║   6   ║   Grand Child-3   ║    3    ║
║   7   ║   Grand Child-4   ║    3    ║
╚═══════╩═══════════════════╩═════════╝

我需要树看起来像:

Parent
    |--Child-1
    |    |--Grand Child-1
    |    |_ Grand Child-2
    |--Child-2
    |    |--Grand Child-3
    |    |_ Grand Child-4

我做了这样的事情:

function hasChild($id){
    $sql = "SELECT count(*) FROM `myTable` WHERE parent_id=".$id;
    $stmt = $this->db->prepare($sql);
    $stmt->execute($a);
    $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $row[0] > 0 ? true : false;
}//function hasChild($id)

// create an index on id
$index = array();
foreach($rows as $i =>$row)
{
    if (hasChild($i)) {
        $index[$row['id']] = $row;
    }
}

// build the tree
foreach($index as $id => $indexRow)
{
    if ($id === 1) continue;
    $parent = $indexRow['parent_id'];
    $index[$parent]['children'][] = $indexRow;                    
}
unset($indexRow);

echo json_encode($index);

但它显然没有给我正确的json树:(

我已经看过嵌套json和数组解决方案了,有些东西不是为了点击我,所以我希望有人可以帮我解决这个问题。我可以使用其他方式,只要我可以拥有相同/相似的功能。

希望我能够很好地描述这种情况,但如果您需要更多数据,请告诉我。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

$a未定义。您也没有在查询中使用任何占位符,所以我认为这会失败。

尝试:

function hasChild($id){
    $sql = "SELECT count(*) as da_count FROM `myTable` WHERE parent_id = ?";
    $stmt = $this->db->prepare($sql);
    $stmt->execute(array($id));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row['da_count'] > 0 ? true : false;
}//function hasChild($id)

对准备好的陈述进行更长时间的写作:http://php.net/manual/en/pdo.prepared-statements.php