2011-02-01 3 views
1

최근 PDO를 구현하고 쿼리 결과에 첫 번째 행이 부족하다는 사실을 알았습니다. 그 이유는 fetchColumn()이 첫 번째 행을 검색하고 포인터를 두 번째 행으로 이동시켜 while() 루프가 두 번째 행에서 시작하기 때문일 것입니다. 맞습니까? 그렇다면 어떻게 피할 수 있으며 다음 코드 블록을 개선 할 수 있습니까?PDO : fetchColumn이 반환 된 결과 집합의 포인터를 이동합니까?

$STH = $DBH->prepare("SELECT * FROM users"); 
$result = $STH->execute(); 

if (!$result) 
    { 
    return false; 
    } 
elseif($STH->fetchColumn()>0)//counterpart of mysql_num_rows() 
    { 
    while ($row = $STH->fetch()) 
     { 
     ... 
     } 
    } 
} 

답변

1

맞습니까?

예. 또한 fetchColumn()mysql_num_rows()와 (과) 일치하지 않습니다. 대신 fetchColumn()은 현재 행의 인덱싱 된 열 값 (인덱스 0으로 기본 설정 됨)을 검색하고 가정 할 때 커서를 앞으로 이동합니다.

쿼리에서 반환되는 행 수를 계산하려면 fetchColumn()을 사용하여 동일한 조건의 SELECT COUNT(1) ... 쿼리를 먼저 발행하는 것이 좋습니다.

는 는

페이지의이 매뉴얼 페이지 예 # 2 -이 솔루션을 함께했다 예를 들어 http://www.php.net/manual/en/pdostatement.rowcount.php


$stmt = $DBH->query('SELECT COUNT(1) FROM users'); 
// using a straight PDO::query() call as a prepared statement would be 
// overkill for these queries 

if ($stmt->fetchColumn() == 0) { 
    return false; 
} 

$stmt = $DBH->query('SELECT * FROM users'); 
while ($row = $stmt->fetch()) { 
    ... 
} 
+0

참조 평균,하지만 이것은 이상한 것과는 거리가 멀어 모든 쿼리가 두 배가됩니다 ... – bart

+0

@bart thems the breaks. 확실하게 행 수를 얻을 수있는 다른 방법이 없습니다. – Phil

+0

부끄럽지만 부끄럽습니다. ( – Phil

1

주위에 인터넷 검색 후 : 난 당신이 무엇을

$STH = $DBH->prepare("SELECT * FROM users"); 

if(!$STH) 
    { 
    $error = $DBH->errorInfo(); 
    } 
else 
    { 
    $result = $STH->execute(); 

    if($result===false) 
     { 
     return false; 
     } 
    else 
     { 
     $rows = $STH->fetchAll(PDO::FETCH_ASSOC); 

     if(count($rows) > 0) 
      { 
      foreach ($rows as $row) 
       { 
       ... 
       } 
      } 
     } 
    } 
} 
+0

'PDOStatement :: fetchAll()'을 사용할 때 큰 결과 집합에 대해주의하십시오. – Phil

관련 문제