$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
Nie jest to najbardziej elegancki sposób na to, a ponadto wymaga dodatkowego zapytania.
PDO ma PDOStatement::rowCount()
, który najwyraźniej nie działa w MySql. Co za ból.
Z dokumentu PDO:
W przypadku większości baz danych funkcja PDOStatement :: rowCount () nie zwraca liczby wierszy, na które wpływa instrukcja SELECT. Zamiast tego użyj PDO :: query (), aby wydać instrukcję SELECT COUNT (*) z tymi samymi predykatami, co zamierzona instrukcja SELECT, a następnie użyj PDOStatement :: fetchColumn (), aby pobrać liczbę wierszy, które zostaną zwrócone. Twoja aplikacja może wtedy wykonać prawidłowe działanie.
EDYCJA: Powyższy przykład kodu używa przygotowanej instrukcji, która w wielu przypadkach jest prawdopodobnie niepotrzebna do liczenia wierszy, więc:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
zwraca ciąg „1234” ... twoja EDYCJA maecho count($nRows);
-count()
jest funkcją tablicową: P. Polecam także rzutowanie wynikufetchColumn()
na liczbę całkowitą.$count = (int) $stmt->fetchColumn()
Jak napisałem wcześniej w odpowiedzi na podobne pytanie , jedynym uzasadnionym powodem było
mysql_num_rows()
to, że wewnętrznie pobierało wszystkie wiersze, aby podać te informacje, nawet jeśli ci się to nie wydawało.W PDO masz do wyboru następujące opcje:
FOUND_ROWS()
funkcji MySQL .fetchAll()
funkcji PDO, aby pobrać wszystkie wiersze do tablicy, a następnie użyjcount()
jej.SELECT COUNT(*)
, jak sugerował karim79.źródło
Jak to często bywa, pytanie to jest mylące jak diabli. Ludzie przyjeżdżają tutaj z myślą o dwóch różnych zadaniach :
To dwa absolutnie różne zadania, które nie mają ze sobą nic wspólnego i nie mogą być rozwiązane przez tę samą funkcję. Jak na ironię, dla żadnej z nich
PDOStatement::rowCount()
nie trzeba używać faktycznej funkcji.Zobaczmy dlaczego
Zliczanie wierszy w tabeli
Oznacza to, że już źle to zrobiłeś. Użycie
mysql_num_rows()
lubrowCount()
do zliczenia liczby wierszy w tabeli jest prawdziwą katastrofą pod względem zużycia zasobów serwera. Baza danych musi odczytać wszystkie wiersze z dysku, zużyć pamięć na serwerze bazy danych, a następnie wysłać całą tę stertę danych do PHP, zużywając również pamięć procesu PHP, obciążając serwer bez absolutnie żadnego powodu.Poza tym wybieranie wierszy tylko do ich policzenia po prostu nie ma sensu.
count(*)
Zapytania ma być uruchamiany zamiast. Baza danych zliczy rekordy z indeksu, bez odczytywania rzeczywistych wierszy, a następnie zwrócony zostanie tylko jeden wiersz.W tym celu kod sugerowany w zaakceptowanej odpowiedzi jest sprawiedliwy.
Zliczanie zwracanych wierszy.
Drugi przypadek użycia nie jest tak katastrofalny jak raczej bezcelowy: jeśli chcesz wiedzieć, czy zapytanie zwróciło jakieś dane, zawsze masz same dane!
Powiedz, jeśli wybierasz tylko jeden wiersz. W porządku, możesz użyć pobranego wiersza jako flagi:
Jeśli potrzebujesz wielu wierszy, możesz użyć
fetchAll()
.Tak, oczywiście, w pierwszym przypadku użycia będzie dwa razy gorszy. Ale jak już się nauczyliśmy, po prostu nie zaznaczaj wierszy, aby je policzyć, ani z
rowCount()
anifetchAll()
.Ale jeśli rzeczywiście zamierzasz użyć wybranych wierszy, nie ma nic złego w użyciu
fetchAll()
. Pamiętaj, że w aplikacji internetowej nigdy nie należy wybierać dużej liczby wierszy. Tylko wiersze, które będą rzeczywiście wykorzystywane na stronie internetowej powinny być wybierane, stąd masz do wykorzystaniaLIMIT
,WHERE
lub podobna klauzula w SQL. A w przypadku tak umiarkowanej ilości danych można z niego korzystaćfetchAll()
. I ponownie, po prostu użyj wyniku tej funkcji pod warunkiem:I oczywiście absolutnym szaleństwem będzie uruchomienie dodatkowego zapytania tylko po to, aby stwierdzić, czy drugie zapytanie zwróciło jakieś wiersze, jak sugeruje to w dwóch najważniejszych odpowiedziach.
Zliczanie liczby wierszy w dużym zestawie wyników
W tak rzadkim przypadku, gdy trzeba wybrać naprawdę ogromną liczbę wierszy (na przykład w aplikacji konsolowej), musisz użyć niebuforowanego zapytania , aby zmniejszyć ilość używanej pamięci. Ale to jest rzeczywisty przypadek, kiedy
rowCount()
nie będzie dostępny , więc nie ma również zastosowania dla tej funkcji.Dlatego jest to jedyny przypadek użycia, w którym może być konieczne uruchomienie dodatkowego zapytania, na wypadek, gdybyś musiał znać dokładne oszacowanie liczby wybranych wierszy.
źródło
Jest bardzo późno, ale napotkałem problem i robię to:
To jest naprawdę proste i łatwe. :)
źródło
Skończyło się na tym:
źródło
Ten post jest stary, ale uzyskanie liczby wierszy w php z PDO jest proste
źródło
To jest stary post, ale denerwuję się, szukając alternatyw. To bardzo niefortunne, że PDO nie ma tej funkcji, zwłaszcza że PHP i MySQL zwykle idą w parze.
Korzystanie z fetchColumn () jest niefortunne, ponieważ nie można już używać tego zestawu wyników (skutecznie), ponieważ fetchColumn () przenosi igłę do następnego rzędu. Na przykład, jeśli masz wynik podobny do
Jeśli użyjesz fetchColumn (), możesz dowiedzieć się, że zostały zwrócone 3 owoce, ale jeśli teraz przejdziesz przez wynik, masz tylko dwie kolumny, Cena fetchColumn () to utrata pierwszej kolumny wyników tylko do znalezienia z ilu wierszy zostało zwróconych. Prowadzi to do niechlujnego kodowania i całkowicie błędnych wyników, jeśli zostaną zaimplementowane.
Tak więc teraz, używając fetchColumn (), musisz zaimplementować i całkowicie nowe wywołanie i zapytanie MySQL, aby uzyskać świeżo działający zestaw wyników. (który, mam nadzieję, nie zmienił się od czasu twojego ostatniego zapytania), wiem, mało prawdopodobne, ale może się zdarzyć. Ponadto narzut związany z podwójnymi zapytaniami przy sprawdzaniu poprawności liczby wierszy. Który w tym przykładzie jest mały, ale analizuje 2 miliony wierszy w połączonym zapytaniu, co nie jest przyjemną ceną do zapłacenia.
Uwielbiam PHP i wspieram wszystkich zaangażowanych w jego rozwój, a także całą społeczność używającą PHP na co dzień, ale naprawdę mam nadzieję, że zostanie to rozwiązane w przyszłych wydaniach. To „naprawdę” moja jedyna skarga na PHP PDO, która poza tym jest świetną klasą.
źródło
Odpowiadając na to, ponieważ złapałem się w to, wiedząc o tym i być może będzie to przydatne.
Pamiętaj, że nie możesz pobrać wyników dwukrotnie. Musisz zapisać wynik pobierania do tablicy, uzyskać liczbę wierszy według
count($array)
i wyświetlić wyniki za pomocąforeach
. Na przykład:źródło
Jeśli chcesz tylko uzyskać liczbę wierszy (nie danych) tj. używając COUNT (*) w przygotowanej instrukcji, wystarczy pobrać wynik i odczytać wartość:
W rzeczywistości pobieranie wszystkich wierszy (danych) w celu wykonania prostej liczby jest marnotrawstwem zasobów. Jeśli zestaw wyników jest duży, serwer może się na nim zadławić.
źródło
Spójrz na ten link: http://php.net/manual/en/pdostatement.rowcount.php Nie zaleca się używania rowCount () w instrukcjach SELECT!
źródło
Aby użyć zmiennych w zapytaniu, musisz użyć
bindValue()
lubbindParam()
. I nie łącz ze sobą zmiennych" . $variable . "
GL
źródło
Kiedy chodzi o mysql, jak liczyć lub uzyskać liczbę wierszy w tabeli z PHP PDO , używam tego
kredyty trafiają do Mike @ codeofaninja.com
źródło
Szybka linijka umożliwiająca zwrot pierwszego wpisu. Jest to przydatne w przypadku bardzo podstawowych zapytań.
Odniesienie
źródło
Próbowałem
$count = $stmt->rowCount();
z Oracle 11.2 i to nie działało. Zdecydowałem się użyć pętli for, jak pokazano poniżej.źródło
Do prostych zapytań, w których chcę określony wiersz i chcę wiedzieć, czy został znaleziony, używam czegoś takiego:
źródło
Istnieje proste rozwiązanie. Jeśli używasz PDO, połącz się z DB tak:
Następnie zapytanie do DB będzie:
I na koniec, aby policzyć wiersze pasujące do zapytania, napisz w ten sposób
źródło
fetchColumn ()
używane, jeśli chcesz uzyskać liczbę rekordów [effisien]
pytanie()
używane, jeśli chcesz pobrać dane i liczbę rekordów [opcje]
PDOStatement :: rowCount
źródło
kiedy wykonasz COUNT (*) w instrukcji mysql jak w
twoje zapytanie mysql już liczy liczbę wyników, po co ponownie liczyć w php? aby uzyskać wynik swojego mysql
i
$nb
będzie zawierał liczbę całkowitą, którą policzyłeś za pomocą instrukcji mysql, nieco długi do napisania, ale szybki do wykonaniaEdycja: przepraszam za niewłaściwy post, ale jako przykład pokazuję zapytanie z licznikiem, sugerowałem użycie wyniku mysql, ale jeśli nie użyjesz licznika w sql, funkcja fetchAll () jest wydajna, jeśli zapiszesz wynik w zmiennej nie stracisz linii.
count($table)
zwróci liczbę wierszy i nadal możesz użyć wyniku po polubieniu$row = $table[0]
lub użyciuforeach
źródło
Oto niestandardowe rozszerzenie klasy PDO z funkcją pomocniczą do pobierania liczby wierszy objętych kryteriami „GDZIE” z ostatniego zapytania.
Może być jednak konieczne dodanie większej liczby „modułów obsługi”, w zależności od używanych poleceń. Obecnie działa tylko w przypadku zapytań korzystających z „FROM” lub „UPDATE”.
źródło
Możesz połączyć najlepszą metodę w jedną linię lub funkcję i automatycznie wygenerować nowe zapytanie:
źródło
źródło
źródło
Użyj parametru
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, w przeciwnym razie pokaż -1:Usen parametrro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sin ello sale -1przykład:
źródło