尝试浏览DB
中的树结构数据表格有点像这样
main_id sub_id
------------------------
1 2
1 3
2 4
3 5
我的功能如下:
$sql="Select * from info_map where main_id= ? ";
$stmt=$conn->prepare($sql);
if(!$stmt){ throw new Exception ( implode(' ',$conn->errorInfo()),0); }
search_child($stmt,215);
function search_child($stmt,$mom){
$res=$stmt->execute(array($mom));
if(!$res){ throw new Exception( implode(' ',$stmt->errorInfo()),1); }
$rc=$stmt->rowCount();
if($rc>0){
while($row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){
$nextMom=$row['sub_id'];
echo $mom.'->'.$nextMom.'<br>';
search_child($stmt,$nextMom);
}
}
$stmt=$conn->prepare()
在函数内部,我得到了我想要的结果(返回所有的孩子和他们的孙子......等等)
但它没有重用prepare语句,因为我们运行相同的sql。
所以我将$stmt=$conn->prepare()
移出函数,就像上面的代码一样,但是这样它只返回一个孩子及其孙子。
我可以在递归函数中重用这样的语句对象吗?或者我只是做错了什么?
更新: @Barmar你的回复帮我理解为什么我只得到一行家谱,因为当循环回到第二代的第二个孩子时,语句obj已经消失,因为它已被用于其他一代的查询(第一个孩子的后代)第二代)谢谢。
答案 0 :(得分:2)
正如@Barmar暗示的那样,php和mysql服务器之间可能存在一些冲突。我通常会毫无问题地为我的递归函数传递准备好的语句,但是通过这样的fetchAll()
得到结果:
function search_child($stmt,$mom){
$res=$stmt->execute(array($mom));
if(!$res){ throw new Exception( implode(' ',$stmt->errorInfo()),1); }
foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row){
// PDO fetch orientation is next by default. no need to specify it.
$nextMom=$row['sub_id'];
echo $mom.'->'.$nextMom.'<br>';
search_child($stmt,$nextMom);
}
}