Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Porównywanie danych z pętli while
Forum PHP.pl > Forum > Przedszkole
tomekpl
Witam,
Mam problem z porównaniem danych różnych użytkowników.
Mam tabelę gdzie są zapisane kolejno:
id,id_gry,id_user

Chce zrobić obrazowo coś takiego:
jeżeli ( użytkownik zapisał się do takiej samej gry jak ty){
wyswietl, posiadasz taką samą gre
}

Obrazowo inaczej, wiem, że źle, ale nie mam pomysłu jak to zrobić:
if(while($read=mysql_fetch_array($query)){$read['id_gry']}==while($read2=mysql_fetch_array($query2)){$read2['id_gry']}){
wyswietl, posiadasz taką samą gre
}

Gdy użytkownik A wchodzi do profilu użytkownika B i jeżeli użytkownik B zapisał się do takiej samej gry co użytkownik A to niech wyświetli informacje.

Może coś z SELECT * FROM users_gry WHERE (id_user LIKE 'A' OR id_user LIKE 'B') ";

Nie mam pojęcia i pomysłu..
Pawel_W
a słyszałeś kiedyś o zbiorach liczb? (EDIT: i nie tylko winksmiley.jpg )

"SELECT * FROM ... WHERE ... IN( zbiór ) " czy jakoś tak... winksmiley.jpg
tomekpl
Zrobiłem coś takiego:

  1. <?php
  2. $sql ="SELECT * FROM users_gry WHERE id_user IN ('$user_do', '$user_od')";
  3. $query=mysql_query($sql);
  4.    while($read=mysql_fetch_array($query)){
  5.    echo "".$read['id_gry']." <br />";
  6.    }
  7. ?>


Wyświetla mi:
3
1
2
4
2
4


I chciałbym właśnie, że jeżeli wynik się powtarza zwrócić informacje

Może warunek IF w zapytaniu questionmark.gif
erix
A nie lepiej GROUP BY + count...?
tomekpl
Mógłbyś pomóc napisać zapytanie ?
Czytam na kilku stronach, ale nie mogę ogarnąć.
Nie wiem jak porównać dane dopasowane do dwóch użytkowników, i jak są takie same to niech wyświetla informacje.
erix
  1. SELECT *, count(id_gry) AS ile FROM users_gry GROUP BY id_gry WHERE id_user IN ('$user_do', '$user_od') AND ile>1

? Klepane z palca.
tomekpl
Trochę zmieniłem:
  1. <?php
  2. $sql=("SELECT *, count(id_gry) AS ile FROM users_gry where id_user IN ('$user_do', '$user_od') GROUP BY id_gry");
  3. ?>


jak dam po IN ('$user_do', '$user_od') AND ile>1 to jest bład
kielich
a Jaki błąd questionmark.gif
tomekpl
Ogólny, że źle zapytanie jest.

  1. <?php
  2. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:Program FilesVertrigoServwwwserwergameincludefunction.php on line 142
  3. ?>


Przy zapytaniu:



  1. <?php
  2. $sql=("SELECT *, count(id_gry) AS ile FROM users_gry where id_user IN ('$user_do', '$user_od') AND ile>1 GROUP BY id_gry");
  3.  
  4.  
  5.  
  6. $query=mysql_query($sql);
  7.    while($read=mysql_fetch_array($query)){
  8.    echo "".$read['id_gry']."<br />";
  9.    }
  10. ?>






///////////

Doszedłem do takiego czegoś:

  1. <?php
  2. function get_list($query) {
  3. $returned = array();
  4.  
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_assoc($result)) {
  7. $returned[] = $row;
  8. }
  9.  
  10. return $returned;
  11. }
  12. ?>



  1. <?php
  2. $array1 = get_list("SELECT id_gry FROM users_gry WHERE id_user=".$user_od); //pobiera gry usera A
  3. $array2 = get_list("SELECT id_gry FROM users_gry WHERE id_user=".$user_do); //pobiera gry usera B
  4.  
  5. foreach($array1 as $gra) {
  6. if(in_array($gra, $array2)) {
  7. $ok=1;
  8. }
  9. }
  10.  
  11. echo $ok;
  12. ?>


Jeszcze nie napisałem warunków, nie chcę, żeby mi zwracało wyników, tylko, jeżeli jest jakiś wynik to pokaz "ok" i tyle smile.gif
Może komuś się przyda. Ma ktoś może prostsze rozwiązanie ?

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Po napisaniu warunków:

  1. <?php
  2. function user_profil_button_wyzwij($user_do,$user_od){
  3.  
  4.  
  5. if($user_od!=$user_do){
  6.  
  7. $sql = mysql_query("SELECT id FROM users_gry WHERE id_user=".$user_do."");
  8. $ile1 = mysql_num_rows($sql);
  9.  
  10. $sql = mysql_query("SELECT id FROM users_gry WHERE id_user=".$user_od."");
  11. $ile2 = mysql_num_rows($sql);
  12.  
  13. if($ile1>0 && $ile2>0){
  14.  
  15. $array1 = get_list("SELECT id_gry FROM users_gry WHERE id_user=".$user_od); //O ile user_od to liczba
  16. $array2 = get_list("SELECT id_gry FROM users_gry WHERE id_user=".$user_do); //O ile user_do to liczba
  17.  
  18. foreach($array1 as $gra) {
  19. if(in_array($gra, $array2)) {
  20. $ok=1;
  21. }
  22. }
  23. if($ok){
  24. $form='<form method="get" action="wyzwij,user,'.$user_do.'"><button type="submit"  class="button_akcja"><span>'._wyzwij_user.'</span></button></form>';
  25.                
  26. return $form;
  27.  
  28. }
  29.  
  30.  
  31. }// ile
  32. }// if userod!=userdo
  33.    
  34. } // f     user_profil_button_wyzwij
  35. ?>
michal_robak
powinieneś dać break-a po linijce $ok=1; wtedy pętla się skończy i nie będzie mielić.

Aha i jeszcze jedna rzecz. Zmodyfikuj funckję get_list na:

  1. <?php
  2. function get_list($query) {
  3. $returned = array();
  4.  
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_assoc($result)) {
  7. $returned[$row] = 1;
  8. }
  9.  
  10. return $returned;
  11. }
  12. ?>


Po co ... ano po to że potem wystarczy Ci sam foreach:

  1. <?php
  2. foreach($array1 as $key=>$value) {
  3. if($array2[$key]==1){
  4. $ok=1;
  5. }
  6. }
  7. ?>


Wtedy pozbywasz się funkcji in_array która przy dużej ilości danych działa niezbyt szybko bo jakby nie bylo jest to podwójna pętla. Teraz kilka słów wyjaśnień. Najlepiej w ogóle jest tu zrobić sprawdzenie. Tu jest pętla po $array1 ale tu powinna być ta lista która posiada mniej elementów wtedy algoryym będzie szybciej działać.

User A zapisał się do gry o nr id 1 i 3. User B do gry 2 , 3 , 4 , 5
Czyli otrzymuje dwie listy:

  1. <?php
  2. $array1 = array("1"=>1,"3"=>1);
  3. $array2 = array("2" => 1, "3" => 1, "4" => 1, "5" => 1);
  4. ?>


Następnie przykład sprawdzenia (jako że $array1 posiada mniej elementow to idziemy po niej):

1.jeżeli $array2["1"] == 1 ---> nie warunek nie jest sprawdzony bo $array2["1"] jest puste
2.jeżeli $array2["2"] == 1 ---> tak warunek jest sprawdzony i pętla się kończy

Jeżeli jechalibyśmy po $array2 to takich sprawdzeń byłoby 4(zakładając że byśmy nie znaleźli podobieństwa). Więc tak wygląda. ... chyba że coś źle zrozumiałem hehe. Pozdrawiam
tomekpl
Wkleiłem twoją funkcje:
  1. <?php
  2. function get_list($query) {
  3. $returned = array();
  4.  
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_assoc($result)) {
  7. $returned[$row] = 1;
  8. }
  9.  
  10. return $returned;
  11. }// f get_list
  12. ?>


Jest błąd w linijce $returned[$row] = 1;
  1. Warning: Illegal offset type in D:\Program Files\VertrigoServ\www\serwer\game\include\function_war.php on line 8
  2.  
  3. Warning: Illegal offset type in D:\Program Files\VertrigoServ\www\serwer\game\include\function_war.php on line 8
  4.  
  5. Warning: Illegal offset type in D:\Program Files\VertrigoServ\www\serwer\game\include\function_war.php on line 8
  6.  
  7. Warning: Illegal offset type in D:\Program Files\VertrigoServ\www\serwer\game\include\function_war.php on line 8
michal_robak
aha a czy ten $row to aby na pewno liczba questionmark.gif. Na pewniaka użyj funkcji intval gdyby dalej krzyczał ale nie powinien krzyczeć bo sam stosuje taki zapis w różnych algorytmach
erix
$row zawiera tablicę, która nie może być kluczem w innej.
tomekpl
Cytat(michal_robak @ 21.07.2009, 13:36:51 ) *
aha a czy ten $row to aby na pewno liczba questionmark.gif. Na pewniaka użyj funkcji intval gdyby dalej krzyczał ale nie powinien krzyczeć bo sam stosuje taki zapis w różnych algorytmach


Tak to liczba, id gry. Dałem tak:
$returned[intval($row)] = 1;
nie ma błędu, ale skrypt nie działa tak jak ma działać.
Ma zwracać informacje jeżeli użytkownicy są zapisani do takiej samej gry.


Cytat(erix @ 21.07.2009, 14:18:50 ) *
$row zawiera tablicę, która nie może być kluczem w innej.

Nie rozumiem do końca.


Jak rozwiązać problem, aby wyświetlało mi wyniki, które ma user A i user B.
user A - 1,3,5,6
user B - 2,3,4,6

wynik: 3,6

questionmark.gif
erix
Wiesz, po co jest mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual? Kurs PHP+MySQL przeczytany?
tomekpl
Cytat(erix @ 22.07.2009, 12:07:37 ) *
Wiesz, po co jest mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual? Kurs PHP+MySQL przeczytany?

Tutaj nie chodzi o wyświetlenie wszystkich gier, tylko takich, gdzie użytkownik jest zapisany z drugim.

User A > 3,4,5 Userb B > 3,5,6 = 3,5

Rozwiązanie, które podał michal_robak nie działa do końca.
erix
To nieistotne. Przeczytaj najpierw kurs, zobaczysz co ta funkcja zwraca.

Kluczem tablicy nie może być inna tablica, cały czas do tego piję, a Ty dalej swoje... ;/
tomekpl
Cytat(erix @ 23.07.2009, 12:39:45 ) *
To nieistotne. Przeczytaj najpierw kurs, zobaczysz co ta funkcja zwraca.

Kluczem tablicy nie może być inna tablica, cały czas do tego piję, a Ty dalej swoje... ;/


Jak mnie już tak umoralniasz to podaj adres tego kursu blinksmiley.gif

Mam problem i nie umiem go rozwiązać, czy oznacza to, że moja wiedza na temat php,mysql jest nikła ?
erix
Cytat
Jak mnie już tak umoralniasz to podaj adres tego kursu

http://php.net - tam jest wszystko, do tego jeszcze Ci zalinkuję konkretną funkcję: mysql_fetch_array" title="Zobacz w manualu PHP" target="_manual już N-ty raz z kolei. Jeśli nie rozumiesz, co się do Ciebie mówi, to zostaw programowanie w spokoju...

Cytat
Mam problem i nie umiem go rozwiązać, czy oznacza to, że moja wiedza na temat php,mysql jest nikła ?

Nie. Ale może by się przydało czytać ze zrozumieniem, co inni piszą?
ayeo
Witam!

Twój problem został już rozwiązany 4 razy! Czemu nie czytasz tego co inni Ci piszą? Tak trudno dowiedzieć się jaki typ zwraca dana funkcja? Zrobić głupiego dumpa? Przecież masz konkretny typ błędu! Pierwsze co powinieneś zrobić to sprawdzić zawartość zmiennej $row. Wtedy byś nie musiał pisać x postów na forum ani obrażać się na @erix'a tongue.gif

Pozdrawiam!
tomekpl
Było sporo odpowiedzi, ale ja już się w tym gubię, próbowałem różnych sposobów, ale nic nie wychodziło.
I nadal nie mam rozwiązanego problemu..

Ja nie mam w głowie skanera, który rozpozna problem. Problem trzeba wiedzieć jak rozwiązać, bądź podobny rozwiązać, aby przedstawić. To co dla kogoś wydaje się łatwe, w rzeczywistości jest bardzo trudne dla laika.
ayeo
Witam!

Zrób sobie: var_dump( $row ); i będziesz wiedział co masz źle! Już prościej się nie da napisać tego!

Pozdrawiam!
tomekpl
Cytat(ayeo @ 23.07.2009, 20:16:58 ) *
Twój problem został już rozwiązany 4 razy!

Mógłbyś podać link do tematu? Ja nie mogę znaleźć.


Cytat(ayeo @ 23.07.2009, 20:46:54 ) *
Witam!

Zrób sobie: var_dump( $row ); i będziesz wiedział co masz źle! Już prościej się nie da napisać tego!

Pozdrawiam!


No i właśnie tak jak pisałem wcześniej, podałeś rozwiązanie, ale ja nie wiem jak go zastosować sad.gif
erix
A pamiętasz, co napisałem? Chyba nie...
Cytat
$row zawiera tablicę, która nie może być kluczem w innej.


Albo rozumiesz, albo uzupełnij wiedzę o podstawowe pojęcia typu tablica, klucz, zwracana wartość, typ zmiennej itd, inaczej zamykam temat, bo wałkowane jest to samo już N-ty raz z kolei w tym wątku...
tomekpl
Chyba pisze, że nie umiem tego zastosować!?

Chciałbym rozwiązanie, żeby było w zapytaniu SQL
erix
To po co tracimy na to czas?

Trzeba było powiedzieć, że chcesz gotowca, bym wcześniej zamknął.

Jeśli nie rozumiesz, czemu tak postąpiłem - na forum gotowców nie dajemy, co najwyżej wskazówki, jak rozwiązać dany problem. Dostałeś praktycznie na tacy, co trzeba. Gotowiec? Proszę bardzo - giełda ofert stoi otworem. I BTW:

Cytat
Chyba pisze, że nie umiem tego zastosować!?

(PW)
Cytat
Co do mojego kursu to takiego nie przebyłem, wszystko praktyka, a teraz jestem na poziomie pisania dość konkretnego projektu, który właśnie kończę, jest to dość spory CMS.

Nie wiem, jak Ty piszesz CMS-a nie rozumiejąc dokumentacji, dla mnie jest to niepojęte. Albo PW pisze kto inny, a na forum kto inny, albo sobie pogrywasz.
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.