Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Zaproś/usuń znajomych, proszę o porady
greg.paw.90
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 8
Dołączył: 12.06.2009
Skąd: Wielkopolska

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
bemol
post
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 29
Dołączył: 5.04.2007
Skąd: Rymanów Zdrój/Rzeszów

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


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


--------------------
Tym ludziom zaufałem i dobrze na tym wyszedłem:
kresh
Darti
piotrekkr
Bez nich wiele bym nie zrobił. Dzięki im za to!
Go to the top of the page
+Quote Post
mortus
post
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.

Ten post edytował mortus 19.03.2010, 10:48:51
Go to the top of the page
+Quote Post
greg.paw.90
post
Post #4





Grupa: Zarejestrowani
Postów: 71
Pomógł: 8
Dołączył: 12.06.2009
Skąd: Wielkopolska

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


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 ?

Ten post edytował greg.paw.90 19.03.2010, 11:04:08
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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

Ten post edytował phpion 19.03.2010, 11:08:34
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
greg.paw.90
post
Post #7





Grupa: Zarejestrowani
Postów: 71
Pomógł: 8
Dołączył: 12.06.2009
Skąd: Wielkopolska

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


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.
Go to the top of the page
+Quote Post
mortus
post
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
phpion
post
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.

Ten post edytował phpion 19.03.2010, 12:34:33
Go to the top of the page
+Quote Post
mortus
post
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 00:38