2012-11-02 8 views
11

Mam proste PDO przygotowane zapytanie:uzyskać liczbę wierszy z PDO

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->fetch(PDO::FETCH_NUM); 
echo $rows[0]; 

echo zdaje się być zwrócenie wartość identyfikatora rekordu, a nie liczba rekordów zwróconych przez zapytanie?

jakikolwiek pomysł lub wyjaśnienie tego?

Odpowiedz

7

PDO::FETCH_NUM: zwraca tablicę indeksowane przez numer kolumny jako zwrócony w wyniku, począwszy od kolumny 0

Nie jesteś pobierania liczba wierszy w ogóle.

SELECT COUNT(*) FROM coursescompleted where person=:p 

To zapytanie wrócą sumę wierszy w $rows[0];

EDIT: Proszę zobaczyć odpowiedź @ Ray. używanie count(id) jest lepsze niż count(*) dla InnoDB.


Można uzyskać liczbę wierszy w następujący sposób, z wcześniejszego zapytania.

$row_count = $result->rowCount(); 

Ale ostrzegamy:

Jeśli ostatnia instrukcja SQL wykonywane przez związanego PDOStatement był SELECT, niektóre bazy danych mogą zwracać liczbę wierszy zwracanych przez tego oświadczenia. Jednak zachowanie to nie jest gwarantowane dla wszystkich baz danych i nie należy polegać na aplikacjach przenośnych .

+0

Dzięki, działa idealnie. mój problem polega na tym, że w moim ciele pobieram wyniki returmed używając 'while ($ row = $ result-> fetch (PDO :: FETCH_ASSOC))' jak mógłbym wykonać zarówno z pojedynczym zapytaniem mysql, czy też potrzebuję dwóch dla każdej funkcji? Dzięki jeszcze raz. – Smudger

+0

Nie jestem pewien. Czy możesz spróbować '$ row_count = $ result-> rowCount();' ze starym zapytaniem? Niektórzy twierdzą, że sterownik PDO_MySQL pozwala na działanie, pomimo dokumentacji mówiącej inaczej. –

+0

Jeśli to nie zadziała, myślę, że możesz nadal liczyć wiersze w PHP podczas iteracji po wierszach, w 'fetch'. Nie wiem, jak źle to jest. –

2

Wypróbuj echo count($rows); jako $rows jest tablicą.

EDIT:

wykorzystać wyniki

$rows = $result->fetchAll(/* nothing here */); 
if(count($rows) > 0) { 
    // Show results, perhaps using a foreach($rows as $row) 
} else { 
echo "Sorry, no results found"; 
} 
+1

Dałoby mu liczbę kolumn idące, to znaczy 2, za każdym razem. PDOStatement :: fetch() zwraca pojedynczy wiersz. PDOStatement :: fetchAll() zwraca cały zestaw wyników jako tablicę – Stephen

+1

Oto, co to jest pytanie: "echo wydaje się zwracać wartość identyfikacyjną rekordu," a nie liczba zwróconych rekordów "przez zapytanie?" –

+0

Chociaż przypuszczam, że nie wygląda na to, że faktycznie potrzebuje zawartości zapytania, więc preferowana jest funkcja SQL 'count()'. –

16

pan wykonał zapytanie, które zwraca wiersze z bazy danych, pobrane pierwszy wiersz z wyniku do zmiennej i następnie echo'd pierwszą kolumnę tym wierszu.

Jeśli chcesz policzyć, zrobić liczyć SQL()

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rowCount = $result->fetchColumn(0); 
echo $rowCount; 
3

Zakładając id jest użycie klucza podstawowego:

SELECT COUNT(id) FROM coursescompleted WHERE person=:p; 

uniknąć count (*). Jeśli twoim silnikiem pamięci masowej jest InnoDB (prawdopodobnie oprócz MyIsam), osiągniesz trafienie wydajnościowe.

+0

Czy jesteś pewien, że nastąpiło uderzenie wydajności? [Ta odpowiedź] (http://stackoverflow.com/a/1697144/759019) mówi inaczej, dla mysql. –

+1

@ Cululhu Jestem pewien. MyISAM może zliczać (*) i liczyć (id), jeśli id ​​jest PK w tym samym czasie (tabele pamięci też są dobre z count (*)), ale jeśli twój stół to silnik magazynowy Innodb, idziesz strzelać stopą: http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – Ray

-2

Można to wykorzystać

<?php 
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->rowCount(); 
echo $rows; 
?> 

to czasami nie działa na SELECT zapytaniami. Ale w oparciu o osobiste doświadczenia, a ponieważ nie wspomniałeś o przeniesieniu go do innych systemów bazodanowych, powinien działać na MySQL.

Więcej informacji znajduje się w podręczniku PHP here