Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Lista tych samych IP
Loped
post
Post #1





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 9.04.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
Loped
post
Post #3





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 9.04.2009

Ostrzeżenie: (0%)
-----


Tak tak, łatwo powiedzieć trudniej zrobić ;P Jak w jakiś łatwy sposób moge je 'porównać'?
Go to the top of the page
+Quote Post
kefirek
post
Post #4





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


Użyj GROUP BY ip w zapytaniu
Go to the top of the page
+Quote Post
Zyx
post
Post #5





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Loped -> o operatorze == słyszałeś?

Kefirek -> w zapytaniu jest już ORDER BY i to jest rzecz wystarczająca do posortowania.

Ten post edytował Zyx 17.05.2009, 19:07:49
Go to the top of the page
+Quote Post
kefirek
post
Post #6





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Zyx
post
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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ć...
Go to the top of the page
+Quote Post
sowiq
post
Post #8





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
Zyx
post
Post #9





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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) ... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sowiq
post
Post #10





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Zyx @ 17.05.2009, 23:54:43 ) *
ja tam się nie motam przy pisaniu jednego ifa, który wykonuje operację if($a == $b) ... (IMG:http://forum.php.pl/style_emoticons/default/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 == (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował sowiq 17.05.2009, 23:03:48
Go to the top of the page
+Quote Post
Zyx
post
Post #11





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kefirek
post
Post #12





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Loped
post
Post #13





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 9.04.2009

Ostrzeżenie: (0%)
-----


Zyx próbowałem Twojego sposobu lecz nic nie wyświetla.
Go to the top of the page
+Quote Post
sowiq
post
Post #14





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 22:21