Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zaproszenia / znajomi
Forum PHP.pl > Forum > Bazy danych
slawo
id | zaprasza | ziomek

1 mycu sławo
2 charles sławo
3 jasiek sławo
4 sławo mycu

Witam, podpowie ktoś jak napisać dodawanie użytkowników do znajomych? Powiedzmy, że po kliknięciu + dodaj znajomego pobiera do bazy nick osoby zalogowanej i nick osoby, której chcemy dodać. Chciałbym tak to zrobić żeby wymagana była akceptacja zaproszeń.

Powyżej baza zaproszenia. Jak napisać coś takiego że gdy 2 osoby się zaproszą to pojawi się na stronie?

Nie chce żeby mi ktoś kod pisał tylko teoretycznie napisał na jakiej zasadzi mogłoby to działać. Z góry dzięki pzd.
Zyx
Swego czasu robiłem to w następujący sposób: tabelka połączeń między dwoma użytkownikami z polami "user1_id" oraz "user2_id". Dodatkowo umieszczone było pole "type" określające typ zależności. Przyjąłem zasadę, że jeśli jest już wiersz (A,cool.gif z typem C, to nie dodajemy już wiersza (B,A) z tym samym typem. Wyświetlanie dla użytkownika X np. zaproszeń polega na tym, że musimy znać numer typu zaproszenia oraz powiedzieć w zapytaniu, że ID użytkownika może być w polu "user1_id" albo "user2_id". Szczegółowe dane użytkowników możemy pobrać tym samym zapytaniem, albo kolejnym przeznaczonym już tylko i wyłącznie do tego.
zend
Na początku musimy zauwarzyć, że dane itak będą nam się dublować, więc proszę nie krzyczeć, że dane się dublują smile.gif
So, user_id1, user_id2 accepted_by_user2 <= pola
1) user 1 zaprasza 2, => 1,2 false
2 user 2 akceptuje, następuje aktualizacja zaproszenia, flaga true, oraz dodaje relacje 2,1,true
Implementacja całkiem przyjemna i przyjazna we wdrożeniu i utrzymaniu, nie ma też dużo zajmujących pol typów innych niż bool i int, co w tabelkach relacyjnych, przy dużej ilości danych może okazać się ważne

Drugą opcją może być trzymanie zaproszeń w osobnej tabelce, a wpisywanie do tabeli relacji tylko tych zaakceptowanych przez obie strony, co jest jeszcze lepszym rozwiązaniem
mortus
Moim zdaniem najlepiej zrobić dwie tabele:
znajomi [id_uzytkownika, id_znajomego]
zaproszenia [id, id_zapraszajacego, id_zapraszanego, stan_dla_zapraszajacego, stan_dla_zapraszanego, stan_zaproszenia]
przy czym:
- zapraszający przechowuje zaproszenie w swojej skrzynce nadawczej: stan_dla_zapraszajacego='wysłane',
- zapraszający zaproszenie usunął: stan_dla_zapraszajacego='wykasowane',
- zapraszany zaproszenia jeszcze nie przeczytał: stan_dla_zapraszanego='nowe' oraz stan_zaproszenia='oczekuje',
- zapraszany zaproszenie usunął, chociaż nie zaakceptował, a może nawet nie przeczytał: stan_dla_zapraszanego='wykasowane' oraz stan_zaproszenia='odrzucone',
- zapraszany zaproszenie przeczytał, ale jeszcze nie zaakceptował: stan_dla_zapraszanego='przeczytane' oraz stan_zaproszenia='oczekuje',
itd...
Cytat(zend @ 26.03.2010, 22:45:57 ) *
Na początku musimy zauwarzyć, że dane itak będą nam się dublować
Dane wcale nie muszą się dublować. Wszystko można sprawdzić za pomocą prostego select-a:
  1. SELECT * FROM znajomi WHERE (id_uzytkownika=moje_id AND id_znajomego=czyjes_id) OR (id_uzytkownika=czyjes_id AND id_znajomego=moje_id)
Dane w tabeli zaproszenia możemy przechowywać, albo usuwać. Przechowywać musimy wtedy, gdy chcemy, aby użytkownik który zaproszenie od "ktosia" odrzucił, nie mógł tego "ktosia" zaprosić.
zend
Zgadza się, że problem można zniwelować za pomocą prostego zapytania, ale zakładam że w tabeli będzie przechowywana bardzo duża liczba rekordów, więc używanie "OR" jest strzałem w własną piętę, bo wszystkie dane zostaną sprawdzone drugim warunkiem, co jest mało wydajne

@mortus - o tym właśnie pisałem w moim wcześniejszym poście
slawo
udało mi się ogarnąć zaproszenia. Teraz mam problem z wyświetlaniem znajomych. Chcę aby profile wyświetlały się tak jak na fotce, n-k itp. tzn. po 4 w rzędzie.

Napisałem take coś:

  1. $pokaz_ziomkow = mysql_query("SELECT * FROM ziomki WHERE ziomek='".urldecode($user)."' AND akceptacja='tak' OR zaprasza='".urldecode($user)."' AND akceptacja='tak' AND ziomek='".urldecode($user)."' ORDER BY id DESC")
  2. or die('');
  3.  
  4. echo "<table border=0 width=100%>
  5. <tr>
  6. <td bgcolor=#000000> <b><font color=white><b>Moje ziomki:</b></font></b></td>
  7. </tr>
  8. </table>";
  9.  
  10. while($z = mysql_fetch_assoc($pokaz_ziomkow)) {
  11.  
  12. $pokaz_dane = mysql_query("SELECT * FROM uzytkownicy WHERE login='".$z['zaprasza']."'")
  13. or die('');
  14.  
  15. while($d = mysql_fetch_assoc($pokaz_dane)) {
  16.  
  17. echo "<table border=1 width=200>
  18. <tr>
  19. <td>";
  20.  
  21. echo "<center><img src=".$z['avatar']." width=50 height=50 border=0><br><a href=pokaz_profil.php?user=".urlencode($z['zaprasza'])."><b>".$z['zaprasza']."</b></a> (".$d['miasto'].")</center>";
  22.  
  23. echo "</td>
  24. </tr>
  25. </table>";
  26.  
  27. }
  28. }


Ale wyświetla mi jeden pod drugim. Jak napisać żeby po 4 profile wyświetlało i potem enter, <br> ?




Zrobiłem to w tabelkach ale wątepie, że będzie mogła być tabelka koło tabelki.
mortus
Przykład
  1. <?php
  2. $liczba = 13;
  3. $liczb_w_wierszu = 3;
  4. echo '<table><tr>';
  5. for ($i = 0; $i < $liczba; $i++) {
  6. if ($i % $liczb_w_wierszu == 0 && $i != 0) {
  7. echo '</tr><tr>';
  8. }
  9. echo '<td>'.($i+1).'</td>';
  10. }
  11. for($i = 0; $i < $liczb_w_wierszu - $liczba%$liczb_w_wierszu; $i++) {
  12. echo '<td>-</td>';
  13. }
  14. echo '</tr></table>';
  15. ?>
Wystarczy przystosować (podpowiem, że $liczba to wynik funkcji mysql_num_rows()).
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.