У меня есть функция для получения пути в данных древовидной структуры.
Согласно моей таблице в БД, 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 (*).