2012-06-15 3 views
2

그래서 저는 PDO를 배웠습니다. 지금까지는 작은 작업을 수행하는 데 필요한 많은 양의 코드로 인해 솔직히 감명 받았습니다. 그러나 코드를 효율적으로 재사용 할 수 있다면 변환 할 수 있습니다.MySQL PDO 행 수 - 더 효율적으로 만들 수 있습니까?

내 질문은 이것입니다.이 코드를 더 효율적으로 만들 수 있습니까? 효율적으로 말하자면, A) 줄을 줄이고 B) 빨리 달리는 것입니다. 나는이 모든 잘못에 대해 걱정하고있다. 그러나 num_rows() 기능이 없기 때문에 더 나은 방법을 생각할 수 없습니다.

try 
{ 
    $sth = $dbh->prepare("SELECT * FROM table_name"); 
    $sth->execute(); 

    if (count($result = $sth->fetchAll())) 
    { 
     foreach ($result as $value) 
     { 
      // Rows returned! Loop through them. 
     } 
    } 
    else 
    { 
     // No rows returned! 
    } 
} 
catch (PDOException $e) 
{ 
    // Exception! 
} 

제대로 작성 되었습니까?

답변

1

나의 연구가 보여주는 한, 아니오. 이 코드를 더 간결하게 또는 논리적으로 다시 작성할 수있는 방법은 없습니다. :) 사용하기가 쉽기 때문에 나쁜 것은 아닙니다!

-1

아니요, PDO의 rowCount 메소드를 사용해야합니다.

try 
{ 
    $sth = $dbh->prepare("SELECT * FROM table_name"); 
    $sth->execute(); 

    if ($sth->rowCount() > 0) 
    { 
     while ($result = $sth->fetch()) 
     { 
      // Rows returned! Loop through them. 
     } 
    } 
    else 
    { 
     // No rows returned! 
    } 
} 
catch (PDOException $e) 
{ 
    // Exception! 
} 
+0

PHP 설명서에서 설명한대로 SELECT 문이있는 모든 데이터베이스에서 작동하지 않습니다. http://php.net/manual/en/pdostatement.rowcount.php – Nathanael

+0

물론 사실입니다. 데이터베이스 자체가 rowCount를 지원하지 않으면, 당신이하는 방법은 불가피합니다. – Ananth

+0

mysqli_num_rows()는 MySQL이 지원하기 때문에 작동합니다! – Ananth

0

사용 PDO::query()

$sql = "SELECT COUNT(*) FROM table_name"; 
if ($res = $conn->query($sql)) 
{ 
/* Check the number of rows that match the SELECT statement */ 
$res->fetchColumn(); //This will give you the number of rows selected// 
} 

가 확인 반환되는 행의 수를 검색 할 의도 SELECT 문 다음

, 사용 PDOStatement::fetchColumn()과 동일한 조건으로 SELECT COUNT(*) 성명을 발표하기 이를 수행하는 일반적인 기능이며 사용자의 필요에 따라 select count을 보내면됩니다. 좀 더 일반적으로 $ select를 더 많은 변수로 나눠서 만들 수 있습니다.

function countRows($select) 
{ 
    if ($res = $conn->query($select)) 
    { 
    /* Check the number of rows that match the SELECT statement */ 
    return $res->fetchColumn(); //This will give you the number of rows selected// 
    } 
} 
+0

이렇게하면 두 개의 쿼리를 실행해야합니다. 맞습니까? 하나는 COUNT (*)에, 다른 하나는 실제로 루프합니다. – Nathanael

+0

예, 두 번째 쿼리를 사용하면 실제 결과를 처리 할 수 ​​있습니다. –

+0

변경 사항이있을 경우 두 가지 쿼리를 모두 수정해야하기 때문에 훨씬 많은 코드가 필요하고 유지 관리 시간이 오래 걸립니다. 나는 확실히 내 응용 프로그램에서 그렇게하고 싶지 않을거야! – Nathanael

관련 문제