Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL]Znajomi
marcio
post
Post #1





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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





Grupa: Zarejestrowani
Postów: 230
Pomógł: 27
Dołączył: 27.05.2008
Skąd: Warszawa

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


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..

Ten post edytował nithajasz 28.05.2008, 17:32:41
Go to the top of the page
+Quote Post
marcio
post
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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?

Ten post edytował marcio 28.05.2008, 17:54:38
Go to the top of the page
+Quote Post
nithajasz
post
Post #4





Grupa: Zarejestrowani
Postów: 230
Pomógł: 27
Dołączył: 27.05.2008
Skąd: Warszawa

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


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...

Ten post edytował nithajasz 28.05.2008, 18:16:16
Go to the top of the page
+Quote Post
marcio
post
Post #5





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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

Ten post edytował marcio 28.05.2008, 18:31:20
Go to the top of the page
+Quote Post
nithajasz
post
Post #6





Grupa: Zarejestrowani
Postów: 230
Pomógł: 27
Dołączył: 27.05.2008
Skąd: Warszawa

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


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...

Ten post edytował nithajasz 28.05.2008, 18:50:43
Go to the top of the page
+Quote Post
marcio
post
Post #7





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dzis nie potrafie sie skupic
Go to the top of the page
+Quote Post
nithajasz
post
Post #8





Grupa: Zarejestrowani
Postów: 230
Pomógł: 27
Dołączył: 27.05.2008
Skąd: Warszawa

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował nithajasz 28.05.2008, 19:02:47
Go to the top of the page
+Quote Post
marcio
post
Post #9





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/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
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: 24.08.2025 - 01:41