Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Count użytkowników należnych do danej grupy
Forum PHP.pl > Forum > Przedszkole
honytowk
Witam chciałbym zliczyć rekordy z tabeli całość wygląda tak:



chce żeby policzyło mi użytkowników którzy są np w grupie 3
należność użytkowników do grup jest zapisywana w tabeli "ep_users" -> pole "grupy"
Mephistofeles
Nie lepiej tą tabelę rozbić na 2? Jedną users, a drugą user-group?
honytowk
nie da rady bo bym musiał wszystko zmieniać, i wszystkich użytkowników przepisywać
darko
Funkcja substring_index powinna pomóc.
honytowk
zapytanie:

  1. $grupys = dbquery("SELECT count(user_id) FROM ".$db_prefix."users WHERE grupy='$grupa'");


wyswieltam rekordy:

  1. ".dbresult($grupys, 0)."


zrobiłem to tak, nie działa, i jak tu użyć tego "substring_index "
sadistic_son
To powinno być zrobione na 3 tabelach bo zachodzi relacja wiele-do-wielu. Ale skoro juz sie uparles ze ma tak zostac to uzyj LIKE %.
  1. $grupys = dbquery("SELECT count(user_id) FROM ".$db_prefix."users WHERE grupy LIKE '%".$grupa."%'");
Jednakze to zadziała tylko jesli masz max 9 grup. Bo np. grupe 23 rozpozna jak 2 i 3.
honytowk
dzieki ale odpada, potrzebuje czegoś lepszego

mam cos takiego do sprawdzania czy jestem w grupie moze sie przyda:
  1. $temp = explode('.', $string_grup);
  2.  
  3. $key = array_search( $grupa, $temp );
sadistic_son
No to w takim razie mozesz uzyc nastepujacego rozwiazania.
  1. $i=0;
  2. $query="SELECT user_id , grupy FROM ".$db_prefix."users";
  3. $result=mysql_query($query);
  4. while($row=mysql_fetch_array($result,MYSQL_NUM)){
  5. $gr=explode(".",$row[1]);
  6. foreach($gr as $g){
  7. if($g==$grupy){
  8. $i++;
  9. }
  10. }
  11. }
zmienna $i jest ilością userów z danej grupy. Ale jest to mega-nieoptymalne rozwiazanie!

EDIT:
Twoją podpowiedz mozna uzyc. Zamiast petli foreach moznaby zastosowac array_search. Ale wynik w sumie ten sam bedzie.
honytowk
nie działa
sadistic_son
Ale co nie działa?! Błąd wywala?! Jaki błąd?! Nic się nie dzieje?! Pokazuje że jest zero wyników?! CO NIE DZIAŁA?!
honytowk
Warning: explode() [function.explode: Empty delimiter in /home/honytowk/public_html/grupy/grupy.php on line 60

Warning: Invalid argument supplied for foreach() in /home/honytowk/public_html/grupy/grupy.php on line 61

Warning: explode() [function.explode: Empty delimiter in /home/honytowk/public_html/grupy/grupy.php on line 60

Warning: Invalid argument supplied for foreach() in /home/honytowk/public_html/grupy/grupy.php on line 61

wywala takie błędy
sadistic_son
Co wpisujesz podając grupę? Wpisujesz '.3' czy '3.' czy '3'?
darko
nie powinno być odwrotnie: $gr=explode(".", $row[1]); ?
Wicepsik
Szybszym rozwiązaniem będzie przeprojektowanie bazy. Ale sądząc po postach założyciela tematu, żadnego wkładu własnego.
sadistic_son
Racja darkoexclamation.gif!! Drobna pomylka, juz poprawilem.
Wicepsik - byłoby szybszym, lepszym, optymalniejszym, zajmujacym mniej powierchni dyskowej, bardziej poprawnym od strony bazodanowej itp. itd. No ale skoro ma tak zostac to wola tworcy bazy.
honytowk
Cytat(sadistic_son @ 30.12.2009, 21:27:54 ) *
Co wpisujesz podając grupę? Wpisujesz '.3' czy '3.' czy '3'?


wpisuje 3
(zmienna: $grupa)
sadistic_son
I po zmianie konstrukcji explode nadal wywala te same bledy? A istnieje przypadek ze w bazie w polu grupa nie ma nic wpisane? Albo ze nie ma kropki? Jesli tak to popraw eplode na to:
  1. $gr='.'.explode(".", $row[1]);
honytowk
  1. $i=0;
  2. $query="SELECT user_id , grupy FROM ".$db_prefix."users";
  3. $result=mysql_query($query);
  4. while($row=mysql_fetch_array($result,MYSQL_NUM)){
  5. $gr=explode(".",$row[1]);
  6. foreach($gr as $g){
  7. if($g==$grupy){
  8. $i++;
  9. }
  10. }

wstawiam to, i
zmienna $i do pola gdzie ma mi sie wyswietlac
to zamiast uzytkownikow zapisanych podaje mi ilosc uzytkownikow w calej bazie

ok dziala, zamiast zmiennej $grupy powinna byc zmienna $grupa

jeszcze jedno pytanie:

Jak wyświetlić wyniki?

(chce zrobić liste użytkowników należących do grupy)
darko
Z tego co widzę z kodu podanego przez sadistic_son to $row[0] przechowuje id użytkownika.
honytowk
  1. $query="SELECT user_id , grupy FROM ".$db_prefix."users";
  2. $result=mysql_query($query);
  3. while($row=mysql_fetch_array($result,MYSQL_NUM)){
  4. echo"".$row[1]."";
  5. }


wyswietla mi wynik

" .2.3.2 "

a row[0]
wyswietla wynik

" 1234 "

analizujac okazało sie ze .2.3.2 to wyniki grup z tabeli users

a powinny byc id użytkowników należących do danej grupy
darko
Coś tu nie gra, w temacie piszesz, że
Cytat
należność użytkowników do grup jest zapisywana w tabeli "ep_users" -> pole "grupy"

a dane są wyciągane z tabeli users, hmm...
sadistic_son
Przerób tak ten kod i wyświetli userów z danej grupy.
  1. $i=0;
  2. $query="SELECT user_id , grupy FROM ".$db_prefix."users";
  3. $result=mysql_query($query);
  4.  
  5. $query1="SELECT nazwa_usera FROM ".$db_prefix."users WHERE user_id IN(";
  6. while($row=mysql_fetch_array($result,MYSQL_NUM)){
  7. $gr=explode(".",$row[1]);
  8.  
  9. foreach($gr as $g){
  10. if($g==$grupa){
  11. $i++;
  12. $query1=$query1.$row[0].' , ';
  13. }
  14. }
  15. }
  16. $query1=$query1."0)";
  17. $result1=mysql_query($query1);
  18. while($row1=mysql_fetch_array($result1,MYSQL_NUM)){
  19. echo $row1[0].'<BR />';
  20. }

PS. Kliknij POMÓGŁ pod pomocnymi postami. Pzdr.
honytowk
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/honytowk/public_html/grupy/grupy.php on line 179

wyswietla mi taki błąd
sadistic_son
na końcu mojego kodu dodaj echo '+'.$query1.'+'; i wklej tutaj to co pojawi się między plusami.
honytowk
SELECT nazwa_usera FROM ep_users WHERE user_id IN(1 , 3 , 0)
sadistic_son
A co to jest 'nazwa_usera'? Masz taka kolumne w bazie danych? Ty wklejasz wszystko do kodu jak leci nie zamieniajac nawet nazw zmiennych itp. na swoje wlasne?!
honytowk
sory, nie zauwazylem tego
Wielkie dzieki za pomoc winksmiley.jpg
juz dziala chce zrobić jeszcze do tego stronnicowanie i zeby pojawialo mi sie po 4 w jednym rzedzie w 3 kolumnach na jednej stronie

co trzeba zmienic/dodac w kodzie?
darko
select ... limit od, od + ile
ile = 4 (po 4 w jednym rzedzie) * 3 (w 3 kolumnach) - 1 (bo liczenie zaczynamy od zera)

// edit
http://dev.mysql.com/doc/refman/5.0/en/select.html zwłaszcza sekcja limit
honytowk
nie zrozumialem
sadistic_son
Cytat(darko @ 31.12.2009, 01:00:46 ) *
select ... limit x, x +11
11 = 4 * 3 - 1
Ja szczerze mówiąc też nie blinksmiley.gif

EDIT: ok juz czaje. Ale ja bym stronnicowanie zrobil inaczej, bez limitu. Po prostu zapytanie pobiera wszystkie rekordy a tylko w PHP wyliczamy ktore maja sie pojawic na stronie 1, ktore na 2 itd.
honytowk
nadal nic nie rozumiem, o co chodzi z tą " +11 " ?
darko
+ 11 zwiększa offset pobieranych rekordów o pożądaną wartość, w Twoim przypadku to + 11 właśnie. Dla limit podaje się od, do - czyli chcesz pobrać rekordy od np. 5 do 16 to dajesz select (warunki) i na końcu dodajesz: limit 4,15 czyli
  1. $query="SELECT user_id , grupy FROM ".$db_prefix."users limit 4,15";

i w miejsce 4 oraz 15 podajesz odpowiednie wartości, w praktyce drugą wartość będziesz miał stałą, czyli wystarczy dla dwunastu rekordów na stronę przesyłać tylko numer offsetu:
  1. // ile rekordów na stronie
  2. $rpp = 12;
  3. // numer strony
  4. $offset = $_GET["offset"];
  5. if($offset < 0 || !is_numeric($offset)) {
  6. $offset = 0;
  7. }
  8. // i teraz
  9. // od
  10. $from = $offset * $rpp - 1;
  11. if($from < 0) $from = 0;
  12. // do
  13. $to = $from + $rpp;
  14. $query="SELECT user_id , grupy FROM ".$db_prefix."users limit $from,$to";
honytowk
no ok, ale to jest tylko zapytanie mysql
darko
w ostatniej pętli:
  1. while($row1=mysql_fetch_array($result1,MYSQL_NUM)){
  2. echo $row1[0].'<BR />';
  3. }

wystarczy dodać:
  1. $i = 1;
  2. while($row1=mysql_fetch_array($result1,MYSQL_NUM)){
  3. echo $row1[0];
  4. if($i % 4 == 0) echo '<BR />'; $i++;
  5. }


Została już tylko obsługa przesyłania w odpowiednim linku numeru aktualnej strony
honytowk
ok narazie zbieram to do " kupy " zobacze czy dziala za chwile

nie moge sie pozbierac z tym wynikiem selectu
wyniki powinny byc takie:
($r to przykladowa zmienna)
  1. echo "<td class='tblt2' align='center' ><a href='".BASEDIR."profile.php?lookup=".$r['user_id']."'>";
  2.  
  3. echo genshadow($r['photo_vip']);
  4. echo "</a><center><a href='".BASEDIR."profile.php?lookup=".$r['user_id']."'><b>".$r['user_aim']." ".$r['user_icq']."</b></a><br>
  5. <a href='".BASEDIR."dzielnice/dzielnica.php?osiedle=".$r['user_groups']."'>(".getgroupname($r['user_groups']).")</a> <br>
  6. <a href='".BASEDIR."user/znajomi.php?lookup=".$r['user_id']."'><img border='0' src='".IMAGES."profil/ikony/users.png' width='16' height='16'></a>
  7. <a href='".BASEDIR."user/gallery/galeria.php?lookup=".$r['user_id']."'><img border='0' src='".IMAGES."profil/ikony/image.png' width='16' height='16'></a>
  8. <a href='".BASEDIR."messages.php?msg_send=".$r['user_id']."'><img border='0' src='".IMAGES."profil/ikony/mail.png' width='16' height='16'></a> </center>
  9.  
  10. </td>
  11. ";


ook chyba sobie poradzilem całość wygląda tak:

  1. opentable("Zapisani:");
  2. // ile rekordów na stronie
  3. $rpp = 12;
  4. // numer strony
  5. $offset = $_GET["offset"];
  6. if($offset < 0 || !is_numeric($offset)) {
  7. $offset = 0;
  8. }
  9. // i teraz
  10. // od
  11. $from = $offset * $rpp - 1;
  12. if($from < 0) $from = 0;
  13. // do
  14. $to = $from + $rpp;
  15. $query="SELECT user_id , grupy FROM ".$db_prefix."users limit $from,$to";
  16. $result=mysql_query($query);
  17.  
  18. $query1="SELECT user_id,user_aim,user_icq,user_groups,photo_vip FROM ".$db_prefix."users WHERE user_id IN(";
  19. while($row=mysql_fetch_array($result,MYSQL_NUM)){
  20. $gr=explode(".",$row[1]);
  21.  
  22. foreach($gr as $g){
  23. if($g==$grupa){
  24. $i++;
  25. $query1=$query1.$row[0].' , ';
  26. }
  27. }
  28. }
  29. $query1=$query1."0)";
  30. $result1=mysql_query($query1);
  31. $i = 1;
  32. echo "<table align='center' cellpadding='0' cellspacing='10' >";
  33.  
  34. while($row1=mysql_fetch_array($result1,MYSQL_NUM)){
  35. echo "<td class='tblt2' align='center' ><a href='".BASEDIR."profile.php?lookup=".$row1[0]."'>";
  36.  
  37. echo genshadow($row1[4]);
  38. echo "</a><center><a href='".BASEDIR."profile.php?lookup=".$row1[0]."'><b>".$row1[1]." ".$row1[2]."</b></a><br>
  39. <a href='".BASEDIR."dzielnice/dzielnica.php?osiedle=".$row1[3]."'>(".getgroupname($row1[3]).")</a> <br>
  40. <a href='".BASEDIR."user/znajomi.php?lookup=".$row1[0]."'><img border='0' src='".IMAGES."profil/ikony/users.png' width='16' height='16'></a>
  41. <a href='".BASEDIR."user/gallery/galeria.php?lookup=".$row1[0]."'><img border='0' src='".IMAGES."profil/ikony/image.png' width='16' height='16'></a>
  42. <a href='".BASEDIR."messages.php?msg_send=".$row1[0]."'><img border='0' src='".IMAGES."profil/ikony/mail.png' width='16' height='16'></a> </center>
  43.  
  44. </td>
  45. ";
  46. if($i % 4 == 0) echo '<tr>'; $i++;
  47. }
  48. echo"</tr></table>";
  49. closetable();


jak stworzyć pojawienie się stron " 123456 "?

link wygląda tak:
/ludzie.php?grupa=2
darko
zacznij może od:
<< poprzednia | strona X z Y | następna >>
w ogólnym skrócie:
- oblicz ile jest stron: wyciągnij ilość rekordów - count(user_id), podziel ilość rekordów przez $rpp i sprawdź czy jest reszta, jeśli jest to do wyniku dodaj 1, wynik podstaw pod Y
- w linku przesyłaj doklejone ludzie.php?grupa=2&offset=X, gdzie X będzie aktualną stroną
- sprawdź czy $_GET["offset"] == 1 lub $offset == 0 - jeśli którekolwiek tak, to nie pokazuj części << poprzednia, jeśli i to i to nie - to poprzednia strona:
  1. $prev = $_GET["offset"] - 1;
  2. echo "<a href=\"ludzie.php?grupa=2&offset=$prev\">&lt;&lt; poprzednia</a>";

- sprawdź czy $_GET["offset"] >= Y jeśli tak to nie pokazuj części następna >> , jeśli nie, to następna strona:
  1. $next = $_GET["offset"] + 1;
  2. echo "<a href=\"ludzie.php?grupa=2&offset=$next\">następna &gt;&gt;</a>";

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.