Php pdo:是否可以在递归中重用prepare语句

时间:2014-07-29 15:19:22

标签: php recursion pdo

尝试浏览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已经消失,因为它已被用于其他一代的查询(第一个孩子的后代)第二代)谢谢。

1 个答案:

答案 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);
    }   
}
相关问题