Php PDO rowCount()返回错误的结果

时间:2014-07-30 10:36:56

标签: php mysql pdo

我有一个在树结构数据中获取路径的函数。

根据我在DB中的表格,当我查询sub_id='root_id'

时,root应该没有结果

当我刚刚传递root时,rowCount返回正确的结果0。但是当我从较低级别(第3个)传递一个节点时,在递归的结尾是root,rowCount返回1?

PS

我使用Mysql作为DB

这是我的表

main_id | sub_id
----------------    
    1   |    2    
    1   |    3    
    2   |    4    
    3   |    5

代码:

$stmt = $conn->prepare("Select * from table where sub_id= ? ");  

function get_path($stmt,$node,&$map){

    $res=$stmt->execute(array($node));

    if(!$res){ throw new Exception( implode(' ',$stmt->errorInfo()),1); }

        echo $node.' found '.$stmt->rowCount().'<br>';

        if($stmt->rowCount()==0){ //root
            $map[]=$node;
        }else{

            foreach($stmt->fetchAll(PDO::FETCH_ASSOC) AS $row){
                $map[]=$node;
                $upper_node=$row['main_id'];
                get_path($stmt,$upper_node,$map);
        }
    }

}

如果我只是通过get_path($stmt,1,$map);(根)

输出:

1 found 0

但是当我举例说明4时 输出成为:

4 found 1
2 found 1
1 found 1 <= it should found 0

为什么?

3 个答案:

答案 0 :(得分:3)

您不应该依赖PDOStatement :: rowCount()来获取受SELECT语句影响的行数,请参阅PHP manual, PDOStatement::rowCount

  

DOStatement :: rowCount()返回受其影响的行数   最后由相应的DELETE,INSERT或UPDATE语句执行   PDOStatement对象。

     

如果关联的PDOStatement执行的最后一条SQL语句是   一个SELECT语句,一些数据库可能会返回行数   由该声明返回。但是,不保证这种行为   适用于所有数据库,不应依赖于便携式数据库   应用

[...]

  

示例#2计算SELECT语句返回的行

     

对于大多数数据库,PDOStatement :: rowCount()不返回   受SELECT语句影响的行数。相反,使用   PDO :: query()发出带有相同的SELECT COUNT(*)语句   将谓词作为预期的SELECT语句,然后使用   PDOStatement :: fetchColumn()来检索将要的行数   被退回然后,您的应用程序可以执行正确的操作。

答案 1 :(得分:0)

这可能与PDO rowCount Docs

有关

&#34;如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。&#34;

换句话说,rowCount只适用于DML,我相信MySQL就是这种情况。

您必须计算获取的结果以获得有保证的行数。

答案 2 :(得分:-1)

例如@VMai的正确答案:

$query = $db->prepare("

  SELECT COUNT(*) FROM table
  WHERE
       whatever
 ");

$query->execute();

$result = $query->fetchColumn();

if ($result > 5)
{
echo "Result is greater than 5";
}
else
{
echo "Result is less than 5";
}
?>

注意:除了没有COUNT(*)之外,您需要再次运行“真正的”SQL查询。