我有一个在树结构数据中获取路径的函数。
根据我在DB中的表格,当我查询sub_id='root_id'
当我刚刚传递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
为什么?
答案 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查询。