복붙노트

PDO로 행 수 계산

PHP

PDO로 행 수 계산

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

fetchAll은 내가 때때로 큰 데이터 세트를 다루기 때문에 원하지 않을 것입니다. 그래서 제 사용에는 좋지 않습니다.

의견 있으십니까?

해결법

  1. ==============================

    1.

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

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

    PDO에는 PDOStatement :: rowCount ()가 있으며, MySql에서는 작동하지 않습니다. 얼마나 아팠는가.

    PDO Doc에서 :

    편집 : 위의 코드 예제에서는 준비된 문을 사용합니다. 많은 경우 행 수를 계산할 필요가 없을 수 있습니다.

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

    2.

    이전에 비슷한 질문에 대한 답변으로 쓴 것처럼 mysql_num_rows ()가 작동하는 유일한 이유는 내부적으로 모든 행을 가져와 정보를 제공했기 때문입니다.

    PDO에서 선택할 수있는 옵션은 다음과 같습니다.

  3. ==============================

    3.

    이것은 매우 늦었지만 문제가 발생하여 다음과 같이합니다.

    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();
    

    정말 간단하고 쉽습니다. :)

  4. ==============================

    4.

    당신은 처음부터 그것을 사용해서는 안됩니다.

    mysql_num_rows ()와 PDOStatement :: rowCount ()는 이미 데이터를 선택했음을 의미합니다. 이 경우 해당 함수에 대해 가능한 두 가지 유스 케이스 만 있습니다.

    그리고 전자는 결코 전혀 사용되어서는 안됩니다. 반환 된 큰 데이터 세트로 인해 실제로 서버가 중단 될 수 있으므로 행을 계산할 행을 선택해서는 안됩니다.

    게다가, 단지 그들을 셀 수있는 행을 선택하는 것은 말이되지 않습니다. 대신 하나의 행만 리턴 된 계수 (*) 조회가 실행되어야합니다.

    두 번째 유스 케이스는 덜 재앙이 아니라 오히려 무의미합니다. 쿼리에서 데이터를 반환했는지 여부를 알아야 할 경우 항상 데이터 자체가 있습니다.

    한 행만 선택하는 경우 그냥 가져 와서 결과를 확인하십시오.

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

    많은 행을 가져올 필요가있는 경우 fetchAll ()을 사용할 수 있습니다.

    웹 응용 프로그램에서는 엄청난 양의 행을 선택해서는 안됩니다. 웹 페이지에서 실제로 사용되는 행만 선택해야합니다. 어떤 목적으로 SQL에서 LIMIT 또는 유사한 조항을 사용해야합니다. 그리고 적당한 양의 데이터를 얻으려면 fetchAll ()을 사용하는 것이 좋습니다.

    예를 들어 콘솔 애플리케이션에서 엄청난 양의 행을 선택해야하는 드문 경우에는 사용되는 메모리 양을 줄이기 위해 버퍼링되지 않은 쿼리를 사용해야하지만이 경우 rowCount ()는 ' 어쨌든 사용할 수 있으므로이 기능을 사용할 수 없습니다.

    따라서 알 수있는 답변에서 제안 된 것처럼 rowCount ()와이를 대체하는 추가 쿼리에 대한 사용 사례가 없습니다.

  5. ==============================

    5.

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

    $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>";
    }
    
  6. ==============================

    6.

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

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

    7.

    이것은 오래된 게시물이지만 대안을 찾기 위해 좌절하고 있습니다. PDO가이 기능이 부족하다는 것은 불행한 일입니다. 특히 PHP와 MySQL이 함께하는 경향이 있습니다.

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

    fetchColumn ()을 사용하면 반환 된 과일이 3 개라는 것을 알 수 있지만, 결과를 반복 할 경우 두 개의 열만 있습니다. fetchColumn ()의 가격은 검색 할 첫 번째 열의 손실입니다 반환 된 행 수. 이는 코딩이 엉성한 결과를 가져오고 구현시 오류가 거의 발생하지 않습니다.

    이제는 fetchColumn ()을 사용하여 새로운 호출 및 MySQL 쿼리를 구현해야만 새로운 작업 결과 세트를 얻을 수 있습니다. (당신의 마지막 질문 이후로 바뀌지 않았 으면 좋겠다), 나는 알지 만, 그것은 일어날 수있다. 또한 모든 행 개수 유효성 검사에 대한 이중 쿼리의 오버 헤드. 이 예는 규모가 작지만 합류 한 쿼리에서 2 백만 행을 파싱하므로 유료로 지불하지 않아도됩니다.

    나는 PHP를 좋아하고 개발에 참여한 모든 사람들과 PHP를 일상적으로 사용하는 커뮤니티를 지원합니다. 그러나 앞으로의 릴리스에서이 문제가 해결되기를 바랍니다. 이것은 '정말'PHP PDO에 대한 유일한 불만입니다. 그렇지 않으면 훌륭한 수업입니다.

  8. ==============================

    8.

    이것에 대해 지금 내가 알기에 갇혀 있기 때문에 이것에 대답하는 것이 유용 할 수 있습니다.

    결과를 두 번 가져올 수 없다는 점에 유의하십시오. 가져 오기 결과를 배열에 저장하고 count ($ array)로 행 수를 계산하고 foreach를 사용하여 결과를 출력해야합니다. 예 :

    $query = "your_query_here";
    $STH = $DBH->prepare($query);
    $STH->execute();
    $rows = $STH->fetchAll();
    //all your results is in $rows array
    $STH->setFetchMode(PDO::FETCH_ASSOC);           
    if (count($rows) > 0) {             
        foreach ($rows as $row) {
            //output your rows
        }                       
    }
    
  9. ==============================

    9.

    즉 행 (데이터가 아님)의 수를 얻고 싶다면 ie. 준비된 문에서 COUNT (*)를 사용하면 결과를 검색하고 값을 읽는 것만 수행하면됩니다.

    $sql = "SELECT count(*) FROM `table` WHERE foo = bar";
    $statement = $con->prepare($sql); 
    $statement->execute(); 
    $count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
    return reset($count); // Resets array cursor and returns first value (the count)
    

    실제로 모든 행 (데이터)을 검색하여 간단한 계산을 수행하면 리소스가 낭비됩니다. 결과 세트가 크다면 서버가 서버를 압도 할 수 있습니다.

  10. ==============================

    10.

    이 링크를 한번보세요 : http://php.net/manual/en/pdostatement.rowcount.php SELECT 문에서 rowCount ()를 사용하지 않는 것이 좋습니다!

  11. ==============================

    11.

    mysql의 문제인 경우 PHP PDO를 사용하여 테이블의 행 수를 계산하거나 가져 오는 방법입니다.

    // count total number of rows
    $query = "SELECT COUNT(*) as total_rows FROM sometable";
    $stmt = $con->prepare($query);
    
    // execute query
    $stmt->execute();
    
    // get total rows
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $total_rows = $row['total_rows'];
    

    크레딧은 Mike @ codeofaninja.com으로 이동합니다.

  12. ==============================

    12.

    다음은 마지막 쿼리의 "WHERE"조건에 포함 된 행 수를 검색하는 도우미 함수가있는 PDO 클래스의 맞춤형 확장입니다.

    사용하는 명령에 따라 더 많은 '처리기'를 추가해야 할 수도 있습니다. 지금은 "FROM"또는 "UPDATE"를 사용하는 쿼리에서만 작동합니다.

    class PDO_V extends PDO
    {
        private $lastQuery = null;
    
        public function query($query)
        {
            $this->lastQuery = $query;    
            return parent::query($query);
        }
        public function getLastQueryRowCount()
        {
            $lastQuery = $this->lastQuery;
            $commandBeforeTableName = null;
            if (strpos($lastQuery, 'FROM') !== false)
                $commandBeforeTableName = 'FROM';
            if (strpos($lastQuery, 'UPDATE') !== false)
                $commandBeforeTableName = 'UPDATE';
    
            $after = substr($lastQuery, strpos($lastQuery, $commandBeforeTableName) + (strlen($commandBeforeTableName) + 1));
            $table = substr($after, 0, strpos($after, ' '));
    
            $wherePart = substr($lastQuery, strpos($lastQuery, 'WHERE'));
    
            $result = parent::query("SELECT COUNT(*) FROM $table " . $wherePart);
            if ($result == null)
                return 0;
            return $result->fetchColumn();
        }
    }
    
  13. ==============================

    13.

    첫 번째 항목을 얻는 데 필요한 한 가지 빠른 라이너가 반환되었습니다. 이것은 매우 기본적인 쿼리에 유용합니다.

    <?php
    $count = current($db->query("select count(*) from table")->fetch());
    ?>
    

    참고

  14. ==============================

    14.

    나는 $ count = $ stmt-> rowCount ()를 시도했다; 오라클 11.2와 함께 작동하지 않았다. 나는 for 루프를 아래와 같이 사용하기로 결정했다.

       $count =  "";
        $stmt =  $conn->prepare($sql);
        $stmt->execute();
       echo "<table border='1'>\n";
       while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
            $count++;
            echo "<tr>\n";
        foreach ($row as $item) {
        echo "<td class='td2'>".($item !== null ? htmlentities($item, ENT_QUOTES):"&nbsp;")."</td>\n";
            } //foreach ends
            }// while ends
            echo "</table>\n";
           //echo " no of rows : ". oci_num_rows($stmt);
           //equivalent in pdo::prepare statement
           echo "no.of rows :".$count;
    
  15. ==============================

    15.

    특정 행을 원한다면 직선 쿼리의 경우 해당 행을 찾았는지 알고 싶으면 다음과 같이 사용하십시오.

    function fetchSpecificRow(&$myRecord) {
        $myRecord = array();
        $myQuery = "some sql...";
        $stmt = $this->prepare($myQuery);
        $stmt->execute(array($parm1, $parm2, ...));
        if ($myRecord = $stmt->fetch(PDO::FETCH_ASSOC)) return 0;
        return $myErrNum;
    }
    
  16. ==============================

    16.

    함수 count_x ($ connect) {$ query = "SELECT * FROM tbl where id = '0'"; $ 문 = $ 연결 -> 준비 ($ 쿼리); $ 문 -> 실행 (); $ total_rows = $ 문 -> rowCount (); return $ total_rows; }

  17. ==============================

    17.

    mysql 문에서 COUNT (*)를 다음과 같이 만들 때

    $q = $db->query("SELECT COUNT(*) FROM ...");
    

    귀하의 mysql 쿼리가 이미 PHP에서 다시 계산하는 이유는 무엇입니까? 귀하의 MySQL의 결과를 얻으려면

    $q = $db->query("SELECT COUNT(*) as counted FROM ...");
    $nb = $q->fetch(PDO::FETCH_OBJ);
    $nb = $nb->counted;
    

    $ nb에는 mysql 문으로 계산 한 정수가 들어있다. 쓰기는 길지만 실행이 빠르다.

    편집하다: 미안하지만, 잘못된 게시물에 대한 몇 가지 예를 들어보기 쿼리에서 카운트로, 나는 mysql 결과를 사용하는 것이 좋습니다,하지만 만약 당신이 결과를 변수에 저장하면 당신이 원한다면 fetchAll ()에서 카운트를 사용하지 않으면 원 느슨한 선.

    $data = $dbh->query("SELECT * FROM ...");
    $table = $data->fetchAll(PDO::FETCH_OBJ);
    

    count ($ table)은 행의 수를 반환 할 것이고, $ row = $ table [0]과 같은 결과 나 foreach

    foreach($table as $row){
      print $row->id;
    }
    
  18. ==============================

    18.

    가장 좋은 방법을 한 줄 또는 함수로 결합하여 새 쿼리를 자동 생성 할 수 있습니다.

    function getRowCount($q){ 
        global $db;
        return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
    }
    
    $numRows = getRowCount($query);
    
  19. ==============================

    19.

    $qry = "select * from tabel";
    $cmd = $conn->prepare($qry);
    $cmd->execute();
    $cmd->rowCount()
    
  20. ==============================

    20.

    <table>
          <thead>
               <tr>
                    <th>Sn.</th>
                    <th>Name</th>
               </tr>
          </thead>
          <tbody>
    <?php
         $i=0;
         $statement = $db->prepare("SELECT * FROM tbl_user ORDER BY name ASC");
         $statement->execute();
         $result = $statement->fetchColumn();
         foreach($result as $row) {
            $i++;
        ?>  
          <tr>
             <td><?php echo $i; ?></td>
             <td><?php echo $row['name']; ?></td>
          </tr>
         <?php
              }
         ?>
         </tbody>
    </table>
    
  21. ==============================

    21.

    매개 변수 배열 (PDO :: ATTR_CURSOR => PDO :: CURSOR_SCROLL)을 사용하십시오. 그렇지 않으면 -1을 표시하십시오.

    매개 변수 배열 (PDO :: ATTR_CURSOR => PDO :: CURSOR_SCROLL)을 -1없이 출력하십시오.

    예:

    $res1 = $mdb2->prepare("SELECT clave FROM $tb WHERE id_usuario='$username' AND activo=1 and id_tipo_usuario='4'", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $res1->execute();
    
    $count=$res1->rowCount();
    echo $count;
    
  22. from https://stackoverflow.com/questions/883365/row-count-with-pdo by cc-by-sa and MIT lisence