Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Lista tych samych IP
Forum PHP.pl > Forum > PHP
Loped
Witam. Próbuje napisać kod aby pokazywało mi listę użytkowników oraz ich IP. Te same IP maja być kolo siebie oraz były na tle niebieskim.

Kod:

  1. <?php
  2. $lacz = lacz_bd();
  3.  
  4. $prisoner = $lacz->query("select * from uzytkownik where ip order by ip asc");
  5. $number = $prisoner->num_rows;
  6.  
  7. $i = 0;
  8. while ($hobbit = $prisoner->fetch_assoc()) {
  9. $arrid[$i] = $hobbit['id'];
  10. $arrname[$i] = $hobbit['nazwa_uz'];
  11. $arrip[$i] = $hobbit['ip'];
  12. $ip_color = $lacz->query("select * from uzytkownik where ip='".$arrip[$i]."'");
  13. $ip_number = $ip_color->num_rows;
  14. if ($ip_number > 1) {
  15. $arrcolor[$i] = '0812e2';
  16. } else {
  17. $arrcolor[$i] = '3b3b3b';
  18. }
  19. $i = $i + 1;
  20.  
  21. }
  22. ?>


Nie wiem jak się do tego zabrać a powyższy kod nie działa. Ma ktoś jakieś pomysły?
Zyx
Adresy IP koło sobie załatwia Ci już pierwsze zapytanie. Drugiego nie potrzebujesz, przecież masz już wszystkie potrzebne Ci informacje w już pobranym zbiorze wyników. Jedyne, co musisz dodać, to warunek, który porówna IP aktualnego wiersza z IP wiersza poprzedniego. Jeśli są takie same, to w obu ustawia ten sam kolor. W sumie trzy-cztery linijki smile.gif.
Loped
Tak tak, łatwo powiedzieć trudniej zrobić ;P Jak w jakiś łatwy sposób moge je 'porównać'?
kefirek
Użyj GROUP BY ip w zapytaniu
Zyx
Loped -> o operatorze == słyszałeś?

Kefirek -> w zapytaniu jest już ORDER BY i to jest rzecz wystarczająca do posortowania.
kefirek
Cytat(Zyx @ 17.05.2009, 20:06:42 ) *
Kefirek -> w zapytaniu jest już ORDER BY i to jest rzecz wystarczająca do posortowania.


A gdzie ja napisałem ze ORDER BY ? Chodziło o GROUP BY w celu pogupowania adresów ip i wtedy bedzie wiadomo ile jest takich samych adresów ip Dodatkowo użył bym HAVING > 1
Zyx
A gdzieś ty wyczytał, że ja napisałem, że ty coś napisałeś? Pytam się, po co Lopedowi podajesz jakieś GROUP BY, kiedy ma już ORDER BY w swoim zapytaniu, uzyskuje dzięki temu posortowane dane i ma już dosłownie wszystko, czego potrzebuje, dokładnie tak jak napisałem. Jeden prosty if porównujący IP między sąsiednimi wierszami załatwia sprawę (nawet liczyć nie trzeba, ile jest wierszy z jakim adresem IP), a ty mu jakieś kosmiczne zapytania każesz pisać...
sowiq
Cytat(Zyx @ 17.05.2009, 23:32:11 ) *
a ty mu jakieś kosmiczne zapytania każesz pisać...
Sorry, że się podłączę, ale będę bronił ~kefirka.
Opisana przez autora sytuacja to podręcznikowy przykład na użycie GROUP BY. Uważam, że jest to jedna z podstawowych rzeczy w MySQL, a na pewno dużo bardziej elegancka niż porównywanie sąsiednich wierszy (można się tylko zamotać przy pisaniu tego).
Zyx
Weźmy sobie paru użytkowników:

Kod
1    Rafał    13
2    Tomasz    11
3    Rafal    13
4    Tomasz    12
5    Janusz    5
6    Gucio    13
7    Mariusz    5


Co chce autor:

Kod
1    Rafał    13  <-- na niebiesko
3    Rafal    13  <-- na niebiesko
6    Gucio    13  <-- na niebiesko
2    Tomasz    11
4    Tomasz    12
5    Janusz    5  <-- na niebiesko
7    Mariusz    5  <-- na niebiesko


Wynik, który produkuje GROUP BY:

Kod
2    Tomasz    11
1    Rafał    13
5    Janusz    5


Więc? Ponadto, z całym szacunkiem, ale ja tam się nie motam przy pisaniu jednego ifa, który wykonuje operację if($a == $b) ... smile.gif
sowiq
Cytat(Zyx @ 17.05.2009, 23:54:43 ) *
ja tam się nie motam przy pisaniu jednego ifa, który wykonuje operację if($a == $b) ... smile.gif
Wcale tak nie twierdzę. Ale nieco uprościłeś sytuację. Ponieważ to operacja na MySQL, to znasz tylko bieżący rekord. Dlatego musisz mieć dodatkowe zmienne dla zapamiętania poprzedniego i następnego rekordu. Następny to tak na prawdę też bieżący, ale dopiero w następnym kroku.
Poza tym musisz zrobić warunki że operujesz na pierwszym albo ostatnim rekordzie.

To nie takie hop-siup, że jeden if i == winksmiley.jpg
Zyx
sowiq - ale komplikujesz... wszystko, byleby tylko w MySQL-u pogrzebać i sobie pracę utrudnić. Przecież te dane trafiają do PHP, kto powiedział, że wszystko należy na etapie MySQL-a przetworzyć? Nikt - SQL pewnych rzeczy Ci nie rozwiąże, nie do tego jest stworzony. Widzisz, że autor tablicuje wyniki, zatem ma dostęp i do obecnego, i do wszystkich poprzednich wierszy. Dodanie dodatkowego warunku zamiast tego kodu to minuta roboty i widzę, że bez podania gotowego kodu się niestety nie obejdzie. Chciałem by autor sam spróbował zaimplementować, ale jak widzę, zostałem sprytnie zsabotowany.

  1. <?php
  2. $prisoner = $lacz->query("select * from uzytkownik where ip order by ip asc");
  3. $i = 0;
  4. $dane = array();
  5. while($hobbit = $prisoner->fetch_assoc())
  6. {
  7.  $dane[$i] = $hobbit;
  8.  $dane[$i]['color'] = '3b3b3b';
  9.  if(isset($dane[$i-1]) && $dane[$i-1]['ip'] == $dane[$i]['ip'])
  10.  {
  11.    $dane[$i]['color'] = '0812e2';
  12.    $dane[$i-1]['color'] = '0812e2';
  13.  }
  14.  $i++;
  15. }
  16. ?>


Oto cała trudność zadania. Nie ma to jak komplikować rzeczy proste.
kefirek
Można tak
  1. $prisoner = $lacz->query("SELECT *,
  2. GROUP_CONCAT(nazwa_uz) AS lista
  3. FROM uzytkownik GROUP BY ip WHERE ip ORDER BY ip");


I pod $dane['lista']; masz liste użytkoników z tym samym ip
Loped
Zyx próbowałem Twojego sposobu lecz nic nie wyświetla.
sowiq
  1. SELECT u.login, u.ip, i.ile
  2. FROM uzytkownik u
  3. LEFT JOIN (SELECT ip , COUNT(*) AS ile FROM uzytkownik GROUP BY ip) i ON (u.ip = i.ip)
  4. ORDER BY u.ip ASC
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.