[php] PDO로 행 수

주위에 많은 상충되는 진술이 있습니다. PHP에서 PDO를 사용하여 행을 계산하는 가장 좋은 방법은 무엇입니까? PDO를 사용하기 전에 그냥 사용했습니다 mysql_num_rows.

fetchAll 때로는 큰 데이터 세트를 처리 할 수 ​​있기 때문에 원하지 않는 것이므로 사용하기에 좋지 않습니다.

의견 있으십니까?



답변

$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn(); 

가장 우아한 방법은 아니며 추가 쿼리가 필요합니다.

PDO는 MySql에서 작동 PDOStatement::rowCount()하지 않는 것으로 보입니다 . 얼마나 아파요?

PDO 문서에서 :

대부분의 데이터베이스에서 PDOStatement :: rowCount ()는 SELECT 문의 영향을받는 행 수를 리턴하지 않습니다. 대신 PDO :: query ()를 사용하여 원하는 SELECT 문과 동일한 술어를 사용하여 SELECT COUNT (*) 문을 발행 한 다음 PDOStatement :: fetchColumn ()을 사용하여 리턴 될 행 수를 검색하십시오. 그런 다음 응용 프로그램이 올바른 조치를 수행 할 수 있습니다.

편집 : 위의 코드 예제는 준비된 명령문을 사용하는데, 대부분의 경우 행 수를 계산하는 데 불필요합니다.

$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;


답변

이전에 비슷한 질문대한 답변 에서 썼 듯이 , 유일한 이유 mysql_num_rows()는 내부적으로 모든 행을 가져 와서 정보가 보이지 않는 경우에도 해당 정보를 제공하기 때문입니다.

따라서 PDO에서 옵션은 다음과 같습니다.

  1. MySQL의 FOUND_ROWS()기능을 사용하십시오 .
  2. PDO의 fetchAll()함수를 사용 하여 모든 행을 배열로 가져온 다음 사용 count()하십시오.
  3. SELECT COUNT(*)karim79가 제안한대로에 추가 쿼리를 수행하십시오 .

답변

종종 발생하는 것처럼,이 질문은 지옥과 혼동됩니다. 사람들은 두 가지 다른 작업 을 염두에두고 여기에옵니다 .

  1. 테이블에 몇 개의 행이 있는지 알아야합니다.
  2. 쿼리가 행을 반환했는지 여부를 알아야합니다.

그것은 공통점이 없으며 동일한 기능으로 해결할 수없는 완전히 다른 두 가지 작업입니다. 아이러니하게도 이들어느 것도 실제 PDOStatement::rowCount()기능을 사용 하지 않아야합니다 .

왜 보자

테이블에서 행 개수

PDO를 사용하기 전에 그냥 사용했습니다 mysql_num_rows().

이미 잘못 했음을 의미합니다 . 사용 mysql_num_rows()또는 rowCount()테이블의 행 수를 계산하는 것은입니다 실제 재해 서버 자원을 소모의 측면이다. 데이터베이스는 디스크에서 모든 행을 읽고 데이터베이스 서버의 메모리를 소비 한 다음이 힙을 모두 PHP로 전송하여 PHP 프로세스의 메모리를 소비하므로 서버는 아무 이유없이 서버에 부담을줍니다.
게다가, 행을 세는 행만 선택하는 것은 의미가 없습니다. count(*)쿼리 대신 실행해야합니다. 데이터베이스는 인덱스 중, 레코드를 계산합니다 실제 행을 읽지 않고 다음 만 하나 행이 돌아왔다.

이를 위해 허용 된 답변에 제안 된 코드 는 공정합니다.

리턴 된 행 수를 계산합니다.

두 번째 사용 사례는 무의미한 것이 아니라 비참한 것이 아닙니다. 쿼리가 데이터를 반환했는지 여부를 알아야 할 경우 항상 데이터 자체가 있습니다!

하나의 행만 선택한다면 말하십시오. 페치 된 행을 플래그로 사용할 수 있습니다.

$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
    echo 'No data found';
}

많은 행을 가져와야 할 경우을 사용할 수 있습니다 fetchAll().

fetchAll() 때로는 큰 데이터 세트를 처리 할 수 ​​있기 때문에 원하지 않는 것입니다.

물론, 첫 번째 사용 사례의 경우 두 배나 나쁩니다. 그러나 우리가 이미 배운 바로 하지 않는 행을 선택에서만도, 그들을 계산하는 rowCount()fetchAll() .

그러나 실제로 선택한 행을 사용하려는 경우을 사용하는 데 아무런 문제가 없습니다 fetchAll(). 웹 응용 프로그램에서는 절대로 많은 행을 선택해서는 안됩니다. 실제로 웹 페이지에 사용됩니다 만 행을 따라서 당신이 사용에있어, 선택해야합니다 LIMIT, WHERE또는 SQL에서 비슷한 절. 그리고 적당한 양의 데이터에 대해서는 사용하는 것이 좋습니다 fetchAll(). 그리고이 조건 에서이 함수의 결과를 사용하십시오.

$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
    echo 'No data found';
}

물론 두 개의 상위 답변에서 제안한 것처럼 다른 쿼리가 행을 반환했는지 여부를 알려주기 위해 추가 쿼리 를 실행하는 것은 절대적으로 광기 입니다.

큰 결과 집합에서 행 수 계산

드문 경우이지만 실제 대량의 행을 선택해야하는 경우 (예 : 콘솔 응용 프로그램에서) 사용되는 메모리 양을 줄이려면 버퍼되지 않은 query 를 사용해야합니다 . 그러나 이것은 실제로 사용할 수없는 경우 rowCount() 입니다 없는 경우 이므로이 기능을 사용하지 않습니다.

따라서 선택한 행 수에 대한 가까운 추정치를 알아야 할 경우 추가 쿼리를 실행해야 할 경우에 유일하게 유스 케이스입니다.


답변

이것은 매우 늦었지만 문제가 발생 하여이 작업을 수행합니다.

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

정말 간단하고 쉽습니다. 🙂


답변

나는 이것을 사용하여 끝났다.

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}


답변

이 게시물은 오래되었지만 PDO로 PHP에서 행 수를 얻는 것은 간단합니다.

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();


답변

이것은 오래된 게시물이지만 대안을 찾는 데 좌절하고 있습니다. PDO에이 기능이없는 것이 유감입니다. 특히 PHP와 MySQL이 서로 밀접한 관계가 있기 때문입니다.

fetchColumn ()이 바늘을 다음 행으로 이동함에 따라 더 이상 결과 집합을 효과적으로 사용할 수 없으므로 fetchColumn ()을 사용하면 불행한 결함이 있습니다. 예를 들어,

  1. 과일-> 바나나
  2. 과일-> 애플
  3. 과일-> 오렌지

fetchColumn ()을 사용하면 3 개의 과일이 반환된다는 것을 알 수 있지만 이제 결과를 반복하면 두 개의 열만 있습니다. fetchColumn ()의 가격은 찾을 첫 번째 결과 열의 손실 리턴 된 행 수 이로 인해 조잡한 코딩이 발생하고 구현되면 완전히 오류가 발생합니다.

이제 fetchColumn ()을 사용하면 새로운 작업 결과 세트를 얻기 위해 완전히 새로운 호출 및 MySQL 쿼리를 구현해야합니다. (마지막 쿼리 이후로 변경되지 않았기를 바랍니다), 가능성은 낮지 만 발생할 수 있습니다. 또한 모든 행 수에 대한 이중 쿼리의 오버 헤드가 확인됩니다. 이 예제는 작지만 결합 된 쿼리에서 2 백만 행을 구문 분석하는 것은 유쾌한 가격이 아닙니다.

저는 PHP를 좋아하고 개발에 관여하는 모든 사람과 커뮤니티를 매일 PHP를 사용하여 크게 지원하지만 앞으로 릴리스에서이 문제가 해결되기를 바랍니다. 이것은 PHP PDO에 대한 나의 유일한 불만이며, 그렇지 않으면 훌륭한 클래스입니다.