Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Znajomi
Forum PHP.pl > Forum > Przedszkole
marcio
Witam nie znam dobrze sql wiec musze o cos zapytac

Mam takie zapytanie
  1. <?php
  2. $znajomi = mysql_query('select * from znajomi where dla_kogo = "'.mysql_real_escape_string($_GET['user']).'" and stan = "akceptowano" order by id desc', $db);
  3. ?>


Mam tabele znajomi i w niej kolumny
id
tresc
dodal
dla_kogo
stan
data

Gdy ktos wysyla zaproszenie user moze je akceptowac juz odrzucic jednak gdy zaakaceptuje to znajmomy wyswietla sie tylko w profilu osoby odbierajacej zaproszenie a w profilu osoby wysylajacej juz nie czy ktos moze mi powiedziec jak powinno wygladac zapytanie zeby widziala i osoba wysylajaca jak i osoba odbierajaca zaproszenie??

P.S kolumna STAN moze miec 3 wartosci CZEKAM gdy wyslalo ODRZUCONO gdy nie akceptowano i AKCEPTOWANO jesli akceptowano
nithajasz
Działa to na zasadzie, że ma jakąś nazwe użytkownika klikam na nią i przenosi mnie do jego profilu i tam wyświetlają się znajomi ?

Jeśli tak to ja takie zapytanie bym zrobił w stylu :

  1. <?php
  2. $znajomi = mysql_query('select * from znajomi where (dla_kogo = "'.mysql_real_escape_string($_GET['user']).'" OR dodal="'.mysql_real_escape_string($_GET['user']).'") AND stan = "akceptowano" order by id desc', $db);
  3. ?>


W takim zapytaniu wchodząc np na profil użytkownika będziesz widział znajomych, którym on wysłał zaproszenie jak i znajomych, którzy jego zaprosili. Przetestuj dla wszystkiego bo nie sprawdzałem zapytania..
marcio
Nie nie to nie to juz mialem podobne zapytanie bez nawiasow teraz user ma tez samego siebie w znajomych ogolnie zmienna $_GET['user'] wskazuje na nazwe uzytkownika przegladanego profilu

EDIT:
Moze to lepiej opisze a wiec jest sobie user marcio i user Xaxas i Bios, user Xaxas i Bios wysylaja mi zaproszenie A user Marcio akceptuje tylko zaproszenie uzytkownika Xaxas a zaproszenie Bios'a odrzuca teraz gdy sie wejdzie w moj profil czyli Marcio widac znajomi Xaxas jednak gdy wejde na profil Xaxas nie ma on zadnych znajomych

Hmm czy teraz wytlumaczylem jasniej?
nithajasz
Cytat(marcio @ 28.05.2008, 18:39:58 ) *
EDIT:
Moze to lepiej opisze a wiec jest sobie user marcio i user Xaxas i Bios, user Xaxas i Bios wysylaja mi zaproszenie A user Marcio akceptuje tylko zaproszenie uzytkownika Xaxas a zaproszenie Bios'a odrzuca teraz gdy sie wejdzie w moj profil czyli Marcio widac znajomi Xaxas jednak gdy wejde na profil Xaxas nie ma on zadnych znajomych


Czyli tak jak wchodzisz na profil Marcio sprawdzasz w bazie czy ma jakichś przyjaciół.

  1. SELECT * FROM znajomi WHERE stan=1 AND (dla_kogo=$marcio_id OR dodal=$marcio_id);


Wchodzisz na profil Xaxas sprawdzasz czy on ma jakiś znajomych.

  1. SELECT * FROM znajomi WHERE stan=1 AND (dla_kogo=$xasas_id OR dodal=$xasas_id);


Czyli, jeśli w bazie masz rekord :

id = 1
dla_kogo = xasas_id
dodal = marcio_id

To przy takiej wersji zapytania pobierzesz to co chcesz..

W 1 wypadku znajdzie Ci wszystkie rekordy gdzie zaproszenie zostało przyjete (stan=1) i gdzie Marcio wysłał zaproszenia lub je otrzymał. W 2 przypadku znajdzie wszystkie rekordy gdzie Xasas wysłał lub dostał zaproszenie i zaproszenie jest zaakceptowane.

  1. SELECT * FROM [tabela] WHERE stan=1 AND ([od] = [user_id] OR [do] = [user_id]);


Krócej musisz sprawdzić czy użytkownik znajduje się w którymś z tych dwóch pól i sprawdzić stan zaproszenia jeśli jest zaakceptowane to wyświetlić to.

Jeśli Bios wejdzie na te profile to zobaczy u Marcios znajomego Xasas a u Xasas Marcios.

Edit : zapytania uproszczone chodzi o schemat...
marcio
Hmm albo ja mam zle zbudowana ta tabele i bede musial zmienic bo:
  1. <?php
  2. $znajomi = mysql_query('select * from znajomi where stan = "akceptowano" and(dla_kogo = "'.mysql_real_escape_string($_GET['user']).'" or dodal = "'.mysql_real_escape_string($_GET['user']).'") order by id desc', $db);
  3. ?>

Dalej W profilu Xaxas jest on jako znajmomy a u mnie jestem ja i Xaxas

Oto screen z tabeli znajomi:
http://img253.imageshack.us/my.php?image=zrzutekranu2lo8.png

Ogolnie zastanawialem sie tez na union select'em ale nic z tego

P.S za pomoca twojego ostatniego zapytanie dzieje sie tak jak z moimi poprzednimi gyd Bios wejdzie na moj profil zobaczy Marcio i Xaxas ale gdy wejdzie na profil Xaxas bedzie tylko Xaxas

P.S2 ogolnie chodzi mi o to ze jesli Xaxas wysle mi zaproszenie i jak akcpetuje mam byc w jego profilu a on w moim i vice versa
nithajasz
Wykonaj w phpmyadminie zapytanie :

  1. SELECT * FROM znajomi WHERE (dla_kogo LIKE 'Bios' OR dodal LIKE 'Bios') AND stan LIKE 'akceptowano';


Zapytanie powinno zwrócić Ci 3 rekordy id: 1, 2 ,3.. i te rekordy mógłbyś wyświetlić w profilu gracza np w taki sposób:

  1. <?php
  2. $query = "SELECT * FROM znajomi WHERE (dla_kogo LIKE 'Bios' OR dodal LIKE 'Bios') AND stan LIKE 'akceptowano'";
  3. $rQuery = mysql_query($query);
  4.  
  5. echo "Znajomi Bios: ";
  6. while ($r = mysql_fetch_array($rQeury)){
  7. if($r['dla_kogo'] == 'Bios') echo $r['dodal']; else echo $r['dla_kogo']; 
  8. }
  9. ?>


Tak nawiasem, mówiąc takie coś jak stan lepiej jest przechowywać jako tinyint i zmieniać mu wartości w zależności od stanu np. 0 - nie odczytany, 1 - zaakceptowany, 2 - odrzucony. Tak samo co do użytkowników, to ja bym podawał ich id a nie nazwy..


Edit :

Zrobiłem sobie podobną bazę tylko zamiast nazw userów dalem A, B, C tak jak Ty masz 3 pierwsze rekordy.

Wklepałem do phpMyAdmina :

  1. SELECT *
  2. FROM `znajomi` WHERE od LIKE 'B' OR dla LIKE 'B';


I wyrzuciło wszystkie 3 rekordy więc zapytanie jest dobre. Reszta to kwestia co zrobisz z wynikami tego zapytanie jak je wypiszesz...
marcio
Ok masz +
  1. <?php
  2. $znajomi = mysql_query('SELECT * FROM znajomi WHERE (dla_kogo LIKE "'.mysql_real_escape_string($_GET['user']).'" OR dodal LIKE "'.mysql_real_escape_string($_GET['user']).'") AND stan LIKE "akceptowano" order by id desc', $db);
  3. $ilosc_znajomych = mysql_num_rows($znajomi);
  4.  
  5. echo('<table align="center" width="80%" style="border: 1px solid #000000">
  6. <tr>
  7. <td align="center" style="background: #8a0000;"><b>Znajomi</b></td>
  8. </tr>
  9. </table>
  10. <table align="center" width="80%" style="border: 1px solid #000000">');
  11.  
  12. if($ilosc_znajomych > 0) {
  13.  
  14. while($name = mysql_fetch_assoc($znajomi)) {
  15.  
  16. if($name['dla_kogo'] == $_GET['user']) $dodal = $name['dodal']; else $dodal = $name['dla_kogo'];
  17. $avatr = avatr($dodal);
  18.  
  19. echo('<tr>
  20. <td style="width:250px;background:#eee;color:#000000;text-align:left"><a href="user.php?user='.$dodal.'"><b>'.$dodal.'</b></a></td><td style="width:180px;background:#eee;color:#fff;text-align:center">'.$avatr.'</td>
  21. </tr>');
  22.  
  23.  }
  24. }
  25.  
  26. else echo('<tr><td align="center">Ten uzytkownik nie ma znajomych</td></tr>');
  27. ?>

Jednak mam 2 pytanie dlaczego bez LIke nie dzialalo??

I jeszcze jedno wiem ze mecze ale gdy Xaxas wysle mi zaproszenie a ja jemu i obydwaj zaakceptujemy to w profili bede mial go jako podwojnego znajomego sorki ale przewaznie jakos mi lepiej idzie kodznie smile.gif dzis nie potrafie sie skupic
nithajasz
Cytat(marcio @ 28.05.2008, 19:53:22 ) *
<a href=\"user.php?user='.$dodal.'\">
Jednak mam 2 pytanie dlaczego bez LIke nie dzialalo??

I jeszcze jedno wiem ze mecze ale gdy Xaxas wysle mi zaproszenie a ja jemu i obydwaj zaakceptujemy to w profili bede mial go jako podwojnego znajomego sorki ale przewaznie jakos mi lepiej idzie kodznie smile.gif dzis nie potrafie sie skupic


Musisz przy wysyłaniu dać jakąś funkcję filtrującą czy takie zaproszenie może wysłane. Np. jeśli Marcio wysłał zaproszenie Xasas to w momencie gdy Xasas bedzie chciał wysłać zaproszenie powinieneś sprawdzić coś takiego :

  1. SELECT id FROM znajomi WHERE dla LIKE 'Marcio_id' AND od LIKE 'Xasas_id';


Jeśli mysql_num_rows zwróci, że istnieje taki rekord to zaproszenia użytkownik nie może wysłać.

Dlaczego LIKE? Jakoś tak z przyzwyczajenia tego używam do porównywania stringów, jakbyś chciał to zapytanie :

  1. SELECT * FROM znajomi WHERE dla = 'B' OR od = 'B';


też zwróci te same rekordy.
Taka rada zmień na id userów z nazw jest naprawdę wygodniejsze i funkcjonalniejsze przy bardziej rozbudowanej bazie.
marcio
No to w sumie juz wiem jak to zrobic 1 min kodzenia mam cos podobnego w dodawaniu zaproszen ze ktos sobie sam nie moze wyslac zaproszenia i dany user nie mozna wyslac 2 zaproszen jesli juz dana osoba akceptowala to albo dodam union select i bedzxie jedno zapytanie albo zrobie to na 2 smile.gif ogolnie wielkie dzieki

P.S a z tego LIKE nie mozna mienic na zwykle WHERE bo WHERE jest szybsze tylko cos dzialac nie chcialo ale coz nie wazne z czasem i tego sie naucze

btw: co do nazw kolumn to wiem ze lepiej to robic na int tak jak to mam w userahc ale coz juz mi sie zmieniac nie chce
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.