Skocz do zawartości
Zaloguj się, aby obserwować  
Gość finlandia

Problem z mysql_num_rows

Polecane posty

Gość finlandia

Witam, mam pewien problem z funkcją mysql_num_rows

 

$x = mysql_num_rows(mysql_query("select * from `tabela` where `id_blabla`='$ID'"));

 

Po wykonaniu wartość $x wynosi 0 mimo, że w bazie danych znajduje się rekord pasujący do zapytania. Nie bardzo wiem jak temu zaradzić. Na internecie znalazłem "Notatka: Jeśli funkcja mysql_num_rows() jest używana w połączeniu z mysql_unbuffered_query(), poprawna wartość zostanie zwrócona dopiero po odebraniu wszystkich wierszy wyniku." natomiast nie używam żadnego mysql_unbuffered_query(). Czy ktoś ma jakiś pomysł?

Edytowano przez finlandia (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Do zliczania służy count()

 

$x = mysql_num_rows(mysql_query("select count(*) from `tabela` where `id_blabla`='$ID'"));

 

Wprowadzasz kolego w błąd. Albo count() w zapytaniu albo mysql_num_rows() w PHP. Taki kod zawsze zwróci wartość 1, niezależnie czy w tabeli będzie 100 pasujących rekordów czy 1500.

 

Co do tematu to zobacz czy MySQL nie zwraca żadnego błędu(mysql_error() w PHP). Spróbuj w jakimś 'kliencie' MySQLa np. PHPMyAdmin wykonać takie zapytanko

SELECT COUNT(*) as `ilosc` FROM `tabela` WHERE `id_blabla` = 'JAKIES ID';

 

Pozdrawiam

  • Upvote 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość finlandia

Strasznie odgórnie traktujecie piszących w tym temacie. Jestem programistą, który wie co to mysql_error. Skoro nie napisałem, że wywaliło błąd to znaczy że takowego nie ma. Poradziłem sobie używając count, którego de facto chciałem uniknąć, natomiast chciałbym wiedzieć dla późniejszego doświadczenia co zrobić, aby mysql_num_rows zadziałało.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Skoro uważasz się za programistę i wiesz co to mysql_error to rozwiązanie tego problemu dla Ciebie powinno być bułką z masełkiem, przynajmniej ja tak uważam :) . Sprawdź dokładnie zapytanie bo nie wierze, że funkcja nie działa i nie zwraca błędu...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Strasznie madrym programista jestes, skoro celowo! nakazujesz bazie danych wypluc caly set danych tylko i wylacznie po to, zeby przez php policzyc, ile on ma wierszy. Raz, ze zuzywasz moc obliczeniowa bazy na odnajdywanie tych dyrdymalow, dwa - polaczenie sieciowe (przy duzej ilosci danych i zdalnym polaczeniu moze to byc odczuwalne), zajmujesz pamiec serwera www (gdzies ten rowset musi zbuforowac przeciez) i moc obliczeniowa (bo musisz go policzyc).

 

Do tego chcesz unikac rozwiazania takiego, ze baza analizujac wlasciwie tylko indeksy zwroci ci prosty row z ich iloscia. Zauwazasz, ile dzieki temu zasobow zaoszczedzasz? Pewnie wydaje ci sie, ze to pryszcz. Ale pozniej wlasnie tacy jak ty lamentuja, ze ich uslugodawcy na %cpu wywalaja, a oni maja tylko prosta stronke.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jeszcze warto wspomnieć o SQL_CALC_FOUND_ROWS które w pewnych przypadkach może działać lepiej niż COUNT - wszystko jednak zależy od budowy bazy danych.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość finlandia

Strasznie madrym programista jestes, skoro celowo! nakazujesz bazie danych wypluc caly set danych tylko i wylacznie po to, zeby przez php policzyc, ile on ma wierszy. Raz, ze zuzywasz moc obliczeniowa bazy na odnajdywanie tych dyrdymalow, dwa - polaczenie sieciowe (przy duzej ilosci danych i zdalnym polaczeniu moze to byc odczuwalne), zajmujesz pamiec serwera www (gdzies ten rowset musi zbuforowac przeciez) i moc obliczeniowa (bo musisz go policzyc).

 

Do tego chcesz unikac rozwiazania takiego, ze baza analizujac wlasciwie tylko indeksy zwroci ci prosty row z ich iloscia. Zauwazasz, ile dzieki temu zasobow zaoszczedzasz? Pewnie wydaje ci sie, ze to pryszcz. Ale pozniej wlasnie tacy jak ty lamentuja, ze ich uslugodawcy na %cpu wywalaja, a oni maja tylko prosta stronke.

 

 

Nikt cie nie pytał o zdanie i moje parametry serwera. Pobieram wszystkie dane, bo mi są potrzebne i bynajmniej nie tylko do zliczenia rekordów. To przy okazji. Swoje mongolskie teorie zostaw na swoje %cpu. Płace więc mogę zużywać, tym bardziej jeśli mi to potrzebne w jakimś celu. Nie zamierzam też uprzykrzać życie firmom hostingowym. Zadałem proste pytanie i skoro nie umiesz na nie odpowiedzieć, to bądź łaskaw nie udzielać się w temacie.

Edytowano przez finlandia (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

(...) Pobieram wszystkie dane, bo mi są potrzebne i bynajmniej nie tylko do zliczenia rekordów. To przy okazji.

Fragment kodu, który przedstawiłeś nie wskazuje na to, że chcesz te dane pobrać, ponieważ nie zapamiętujesz nigdzie identyfikatora zasobów zwróconego przez mysql_query więc i później tych danych nie pobierzesz jakąkolwiek inną funkcją.

Po to SQL ma funkcję count() żeby z niej korzystać a nie zliczać dane na około.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No wlasnie w tym problem, ze jak je pobierasz jasnie obrazalski waszmosciu w ten sposob, to do niczego innego ich (znaczy sie tego pobranego rowsetu) nie uzyjesz, bo dane "wyparuja" z pamieci po zakonczeniu tej linijki.

 

edit: regdos byl szybszy.

A za podejscie, ze skoro place za zasoby, to moge je w taki bzdurny sposob marnotrawnic...

... wyjasnij to tylko swojemu klientowi, dla ktorego robisz dziela, ze przez twoje nieomylne widzimisie ma kupowac demony wydajnosci na proste aplikacje. Bo jemu zapewne powiesz, ze to uslugodawca dupny jest i wyludza kase mowiac, ze ta prosciutka aplikacja to dedyka wymaga.

Edytowano przez kafi (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość finlandia

Kod w skrypcie wygląda zupełnie inaczej. Drogą dedukcji sprawdzałem wszystkie możliwe problemy/sposoby i nic nie działało. Stąd też uprościłem kod który mimo pasujących rekordów w bazie, zwraca '0'. Jak już pisałem chodzi o sam problem funkcji mysql_num_rows, a o pozostałą część skryptu nie musicie się martwić. Fakt - faktem że nie zaznaczyłem że chcę uniknąć count, ale kwestie optymalizacji skryptu w ogóle nie powinny być brane pod uwagę w tym momencie. Dodam, że programistą jestem z zamiłowania i programuję tylko dla siebie ew. pomagam innym totalnie zielonym. Kafi znów poruszasz niepotrzebny wątek - skończ prawić niepotrzebne morały!!

Edytowano przez finlandia (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Teraz to juz samemu sobie zaczynasz zaprzeczac.

 

Kod postaci

mysql_connect(...)
mysql_select_db(...)
$res = mysql_query("SELECT * FROM test");
$ilosc = mysql_num_rows($res);

dziala jak najbardziej poprawnie.

 

Natomiast ty pytasz o zlozenie mysql_num_rows( mysql_query() ), ktore jest konstukcja pomimo, ze syntaxowo w teorii* poprawna, to merytorycznie porazajaco bledna.

 

* - jak widac w praktyce nie dziala, wiec calkiem prawdopodobnym jest to, ze przy tym poleceniu nie jest brana jedynie prosta zawartosc zmiennej $res, a jeszcze jakies inne pseudoglobalne zmienne. Bo w samym kodzie php roznica miedzy mysql_query a mysql_unbufered_query to jedynie

 

php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
vs.
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);

 

No ale tak to niestety sie z programistami rozmawia. Kazdy blad to oczywiscie wina nieprawidlowej konfiguracji serwera, a wskazowki, ze cos sie da zrobic inaczej/lepiej/etc. to tylko prawienie moralow.

Edytowano przez kafi (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość finlandia

No i w końcu pomimo nieporozumień, dostałem to czego oczekiwałem, za co należy ci się +

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×