2009-01-20 10 views
14

Niedawno rozpocząłem pracę nad nowym projektem przy użyciu PHP5 i chcę używać dla niego ich klas PDO. Problem polega na tym, że sterownik MySQL PDO nie obsługuje funkcji rowCount(), więc nie ma sposobu na uruchomienie zapytania, a następnie uzyskanie liczby dotkniętych wierszy lub zwróconych wierszy, co jest dość dużym problemem jeśli chodzi o mnie. Zastanawiałem się, czy ktokolwiek jeszcze sobie z tym poradził i co zrobiłeś, aby obejść to. Konieczność zrobienia metody fetch() lub fetchAll() w celu sprawdzenia, czy jakiekolwiek wiersze zostały zmienione lub zwrócone, wydaje się być dla mnie hackerem, wolę po prostu zrobić $ stmt-> numRows() lub coś podobnego.Obejście problemu dla PHP5 w wierszu CHO RowCount Wydanie MySQL

+0

To nie wydaje się być problemem w PHP 5.4. Czy ktoś może potwierdzić? – David

Odpowiedz

25

Możesz wysłać zapytanie SELECT FOUND_ROWS() zaraz po oryginalnym zapytaniu SELECT, aby uzyskać liczbę wierszy.

$pdo->query("SELECT * FROM users"); 
$foundRows = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn(); 

Zobacz także: MySQL Docs on FOUND_ROWS()

+1

Jedno pytanie, rowCount(), działa dobrze dla mnie, także dla instrukcji SELECT. Czy zostało to już wdrożone, ponieważ odpowiedziano na to pytanie? – Mattis

+0

@Imran rowCount() działa także dla mnie, zarówno dla wybranych, jak i dla zapytań takich jak 'POKAŻ TABLICE LIKE ', '' zapytania. Używam PHP 5.2.6. Nie znam mojej wersji Pecl. Jak to sprawdzić? Czy to może być problem z PHP 5.2.6+? Znalazłem to pytanie - http://stackoverflow.com/questions/769767/pdos-rowcount-not-working-on--2-5-2-6 –

+0

Funkcja rowCount() działa dobrze tylko, jeśli wcześniej wykonano metodę fetchAll(), ale nie, jeśli używasz fetch() (to jest lepszy powód zużywa znacznie mniej pamięci) – itsjavi

1

Dla tych z Was, którzy są przy użyciu procedur przechowywanych MySQL, to rozwiązanie nie jest to wykonalne. Sugerowałbym, żeby twoja procedura składowana tworzyła dwa zestawy wierszy. Pierwsza zawiera jeden wiersz i jedną kolumnę zawierającą liczbę rekordów. Drugi będzie zestaw rekordów, których użyjesz do pobrania tej liczby wierszy.

liczba wielu rzędach mogą być SELECT COUNT(*) z takimi samymi WHERE klauzuli jako drugi zestaw wierszy bez klauzul LIMIT/OFFSET.

Inną możliwością może być utworzenie tymczasowego stołu. Użyj oświadczenia SELECT, aby wypełnić tabelę tymczasową. Następnie możesz użyć SELECT COUNT(*) FROM tmpTable dla swojego pierwszego zestawu wierszy i SELECT * FROM tmpTable na sekundę.

+1

Nie sądzisz, że używanie tymczasowego stołu to trochę przesada, by zdobyć taki niepotrzebny numer? –

0

To pytanie jest oparte na kilku fałszywych założeniach i jednym przestarzałym oświadczeniu.

Po pierwsze, nie mylić liczby wybranych i wybranych wierszy. PDO wsparło tę pierwszą już w 2009 roku.

Mówiąc o liczbie wierszy zwróconych przez instrukcję SELECT - po prostu nie potrzebujesz tego numeru. Twoje dane są wystarczające.

I tak, w dzisiejszych czasach rowCount() obsługuje liczbę wierszy wybranych również z mysql. Ale znowu - nie potrzebujesz tego numeru w średniej aplikacji internetowej.

+0

"Po prostu nie potrzebujesz tego numeru, dane, które masz, wystarczą". Och, mój .. tłumaczy się na "Nie potrzebujesz adresu e-mail, wystarczy mieć stronę!" Prawie ZAWSZE potrzebuję tego numeru i odejmuję wiele zapytań COUNT, gdy mogę po prostu zliczyć zapytanie. Zawsze dobrze jest powiedzieć użytkownikowi, że "nie znaleziono wpisów", jeśli tak jest, zamiast po prostu zapętlać NIC. (Nie można również sprawdzić, czy funkcja fetch() zwraca wartość true, gdy używa się również pętli while) – mowgli

Powiązane problemy