Php PDO rowCount () возвращает неверный результат

У меня есть функция для получения пути в данных древовидной структуры.

Согласно моей таблице в БД, root не должен получать результат, когда я запрашиваю sub_id='root_id'

Когда я просто передаю корень, rowCount возвращает правильный результат, равный 0 . Однако, когда я передаю узел из нижнего ранга (3-й), в конце рекурсивного, который является корнем, 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 

Зачем?

Вы не должны полагаться на PDOStatement :: rowCount (), чтобы получить количество строк, на которые влияет инструкция SELECT, см. Руководство PHP, PDOStatement :: rowCount :

DOStatement :: rowCount () возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполняемым соответствующим объектом PDOStatement.

Если последний оператор SQL, выполняемый связанным с ним PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения.

[…]

Пример # 2 Подсчет строк, возвращаемых оператором SELECT

Для большинства баз данных PDOStatement :: rowCount () не возвращает количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query () для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.

Вероятно, это связано с этим из PDO rowCount Docs :

«Если последний оператор SQL, выполняемый связанным с ним PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения».

Другими словами rowCount работает только с DML, и я считаю, что это так в MySQL.

Вы должны подсчитать полученные результаты, чтобы получить гарантированное количество строк.

Например, правильный ответ @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"; } ?> 

Примечание. Вам нужно будет снова запустить «реальный» SQL-запрос, за исключением без COUNT (*).