Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zaproś/usuń znajomych
Forum PHP.pl > Forum > Przedszkole
greg.paw.90
Witam szanownych forumowiczów smile.gif
ostatnio coraz więcej pracuję w php/mysql. Myślę, że idzie mi coraz lepiej. Postanowiłem zrobić skrypt relacji między użytkownikami - mianowicie znajomi. W związku z tym chciałbym się Was poradzić.
Jeśli chodzi o dodaj znajomych to myślę że sobie poradzę. Chce zrobić to tak:
Użytkownik wchodzi do profilu osoby którą chce zaprosić i klika "Zaproś". Uruchamia się skrypt który przez GET pobiera id osoby, która ma zostać zaproszona. Potem w tabeli temp_invite stworzy się rekord z id(auto i key), id_osoby_zapraszajacej , id_osoby_zapraszanej , akcja(1 - przyjęte , 0 - odrzucone). Wtedy zostanie wysłane info(PM) do użytkownika, który został zaproszony. I jak zaakceptuje do do bazy zostaną dopisane id tych osób. Strukturę widzę tak: login,haslo,itp itd, znajomi i tu będą ID znajomych rozdzielone "||" takim znakiem. No i dodawanie i wyświetlanie raczej nie będzie stanowić problemu.
Problem dla mnie pojawia się z usunięciem znajomych. Może ktoś zechce mi poradzić jakby to zrobić? Myślałem, żeby zrobić w ten sposób:
pobieram rekordy i przez funkcje explode() rozbijam id znajomych, potem zliczam przez count() ile jest znajomych i pętlą for wyświetlam linki z opcją usuń.
  1. $znajomi = explode('||','$wiersz[10]');
  2. $ile = count($znajomi);
  3. for($i=0,$i==$ile,$i++){
  4. echo '<a href=usun="'.$link[$i].'">usun</a>';
  5. }

I ter bym zrobił sprawdzanie które id jest to usunięcia i przypisał do tego elementu tablicy wartość 0, np"
  1. $usun=$_GET['usun'];
  2. $znajomi = explode('||','$wiersz[10]');
  3. $ile = count($znajomi);
  4. for($i=0,$i==$ile,$i++){
  5. if($link[$i]==$link[$usun]){
  6. $link[$usun] = '0';
  7. }
  8. implode("||","$link[$i]");
  9. }


Pytanie czy to jest dobry sposób? Może macie jakieś inne pomysły. Będę bardzo wdzięczny.

Pozdrawiam i z góry dzięki za odp i porady smile.gif
bemol
ja bym to zrobił inaczej, bo w tej chwili śmiecić będziesz sobie w bazie z tymi zerami.
  1. str_replace('||0','',$link);

to przed zapytaniem jeszcze by się przydało.
a z tymi zaproszeniami to ja był nie zmieniał na 0 lub 1, tylko jeśli odrzucone to usunąć, a jeśli przyjęte to dodać znajomego i też usunąć.
mortus
Przede wszystkim Twój kod jest niezrozumiały i nieprawidłowy (co to jest $link?). Jeżeli chodzi o Twoją koncepcję, to chyba lepiej usuwać dane id z listy znajomych. Można to zrobić w taki sposób:
  1. if(isset($_GET['usun'] && $_GET['usun'] != '') {
  2. $usun = $_GET['usun'];
  3. $znajomi = explode('||', $wiersz['10']);
  4. $key = array_search($usun, $znajomi);
  5. unset($znajomi[$key]);
  6. $znajomi = implode('||', $znajomi);
Natomiast jeżeli chodzi o samą ideę, to nie wiem, czy jest to najlepsze rozwiązanie.
EDIT:
A jeśli chodzi o zaproszenia, to popieram propozycję bemola. No chyba, że chcielibyśmy np. zablokować możliwość ponownego zapraszania osób, które raz zaproszenie odrzuciły.
greg.paw.90
ok, dzięki za porady...
rozważałem jeszcze takie coś, że będzie tabela invite o strukturze: id, id_zapraszajacego , id_zaproszonego , wyslane , odebrane i wtedy będzie mi wszystko łatwiej zrobić tylko myślę że dodatkwa tabela jest zbędna jeśli mogę to zrobić w tabeli user , chyba że się mylę ?
Które rozwiązanie według Was jest lepsze ?
phpion
Cytat(greg.paw.90 @ 19.03.2010, 11:03:40 ) *
tabela invite o strukturze: id, id_zapraszajacego , id_zaproszonego , wyslane , odebrane i wtedy będzie mi wszystko łatwiej zrobić tylko myślę że dodatkwa tabela jest zbędna jeśli mogę to zrobić w tabeli user , chyba że się mylę ?

Mylisz się. Rozwiązanie z dodatkową tabelą to jedyne poprawne rozwiązanie. Zapomnij o cudach w stylu łączenia ID za pomocą ||, a kolegom wypowiadającym się przede mną gratuluję.

PS: widzę, że dałeś "Pomógł" tamtym postom :/ ehhh...
mortus
Cytat(mortus @ 19.03.2010, 10:45:19 ) *
Natomiast jeżeli chodzi o samą ideę, to nie wiem, czy jest to najlepsze rozwiązanie.

Napisałem wyraźnie i poradziłem, jak powinien swój kod zmodyfikować. Według mnie najlepiej mieć tabelę znajomi i tam łączyć w kolejnych rekordach konkretne id z id znajomych. Tymczasem pytanie o tabelę invite dotyczy samych zaproszeń, a nie konkretnej listy znajomych.
greg.paw.90
Dobra w takim razie zrobię to z osobą tabelą... Dziękuję bardzo.

P.S
Kliknąłem pomógł bo w końcu odpowiedzieli na mój wcześniejszy post i dali wskazówki, a to też pomoc.
mortus
Ja zrobiłbym dwie tabele:
znajomi [id, id_usera, id_znajomego]
oraz
zaproszenia [id, id_zapraszajacego, id_zapraszanego, odpowiedz]
Odnośnie tabeli znajomi to zastanawiam się nad dublowaniem rekordów (bo jeśli Janek jest znajomym Daniela, to Daniel jest znajomym Janka), ale to zapewne tylko kwestia zapytania SQL.
Pole odpowiedz w tabeli zaproszenia mogłoby przyjmować wartości 'Zaakceptowane', 'Odrzucone', 'Oczekuje' i byłoby uaktualniane w momencie, kiedy zaproszona osoba wykona jakąś akcję (oczywiście należy uwzględnić sytuacje, w których np. zaproszona osoba nie zrobi nic, albo usunie zaproszenie - choć to może być równoważne z odrzuceniem). Jeżeli osoba zaproszona zaakceptuje zaproszenie, to wtedy oprócz odpowiedzi w tabeli zaproszenia uaktualniana jest tabela znajomi. Pytanie: czy tabela zaproszenia jest potrzebna? Bezwzględnie tak, jeśli chcemy przechowywać zaproszenia w skrzynce nadawczej osoby zapraszającej i w skrzynce odbiorczej osoby zapraszanej (wtedy trzeba dodać jeszcze inne pola opisujące stan zaproszenia dla zapraszającego i dla zapraszanego - np. czy zapraszany odczytał zaproszenie, czy zapraszający wyrzucił zaproszenie ze skrzynki nadawczej itp.). Pytanie: czy usuwać rekordy z tabeli zaproszenia, po zaktualizowaniu tabeli znajomych? Bezwzględnie nie, jeśli np.
Cytat
chcielibyśmy zablokować możliwość ponownego zapraszania osób, które raz zaproszenie odrzuciły
Tabela zaproszenia może być o wiele bardziej rozbudowana, w zależności od efektów, jakie chcemy uzyskać. Jeżeli chodzi o tabelę znajomi, to nie wiem, czy jest to optymalne rozwiązanie. Może niech się phpion wypowie, bo w sumie sam się nad tym zastanawiam.
phpion
Po pierwsze to pole id w tabeli:
znajomi [id, id_usera, id_znajomego]
jest zbędne. Kluczem głównym powinny tu być kolumny id_usera + id_znajomego. Co do zablokowania możliwości powtórnego zapraszania to wystarczy dodać kolumnę status typu prawda (zaproszenie przyjęte)/fałsz (zaproszenie odrzucone) z wartością domyślną NULL (zaproszenie nierozpatrzone). Pozostanie jednak problem zapraszania "w drugą stronę" czyli. ja zapraszam usera X i on przyjmuje zaproszenie to żeby nie mógł mnie zaprosić (ponieważ ta relacja jest symetryczna jak zauważył mortus). Można to jednak sprawdzić prostym SELECTem albo w momencie wrzucania danych wrzucać ich "odwróconą" kopię czyli wpisując 1 i 2 dodać również rekord 2 i 1. Tyle tylko, że to spowoduje 2x większy rozmiar tabeli.
mortus
Cytat(phpion @ 19.03.2010, 12:33:22 ) *
albo w momencie wrzucania danych wrzucać ich "odwróconą" kopię czyli wpisując 1 i 2 dodać również rekord 2 i 1. Tyle tylko, że to spowoduje 2x większy rozmiar tabeli.
No właśnie o takie dublowanie danych mi chodziło i zastanawiam się, czy należy tego unikać (skoro można to sprawdzić prostym select-em), czy nie ma to większego znaczenia.
Poza tym czy nie lepiej po prostu oddzielić same zaproszenia, od listy znajomych, wtedy w tabeli znajomi mamy dużo mniej rekordów. Bo załóżmy, że ktoś zaprosi wszystkich i połowa z tych osób odrzuci zaproszenie, ale według tego co piszesz phpion-ie, żeby sprawdzić listę znajomych tego użytkownika musimy sprawdzić wszystkie rekordy z nim powiązane i dodatkowo sprawdzić pole status. Sprawdzamy wtedy również te osoby, które zaproszenie odrzuciły. Po co? Czy to nie jest nieoptymalne? Rozumiem, że można dać index na pole status, ale czy nie lepiej mimo wszystko zrobić dwie tabele?
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.