Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: schemat bazy "prywatnych" profili
Forum PHP.pl > Forum > Bazy danych > MySQL
szczypior
Witam

Serwisy takie jak grono czy nasza-klasa wprowadziły możliwość wyboru przez użytkownika, które dane mają być widoczne jakim użytkownikom. Tzn, można określić że imię będą widzeń wszyscy, zalogowani będą widzieć też nazwisko, a znajomi np: zdjęcia. Ciekaw jestem jak przy tego rodzaju profilach buduje się bazę, czy najlepszym rozwiązaniem jest po prostu dodanie dodatkowych pól w tabeli, w ten sposób:

  1. | id | imie | pokaz_imie | nazwisko | pokaz_nazwisko itp
  2. | 1 | Karol| wszyscy | Kowalski | zalogowani


Czy jest może lepszy, efektywniejszy sposób?
mag32
nie wiem jak jest, ale ja bym to zrobił tak:
Imię---|Nazwisko-|Pokaż
Michał-|Nowak---|000

Przy czym każdy bit Pokaż decyduje o tym które z pól ma byc pokazywane.
Czyli w tym przypadku - żadne a ostatni bit to bit kontrolny (CRC?)
011 pokaż nazwisko bez imienia
100 pokaż imie bez nazwiska itp.
Qmis
Zamiast bitowo, można podawać cyfry 1, 2, lub 3 przy czym 1-pokaż tylko imie 2- pokaż imie i nazwisko ...itd.
Zależy jak wolisz zapisywać poziom prywatności i co dla ciebie jest bardziej czytelne
heaven
@Qmis: No liczby tak jak ty to opisujesz to sie nie nadaja jesli chodzi o ten typ rozwiazania problemu. Pomyśl ile musialbys liczb przypisac jesli byloby 5 opcji tylko. Do tego tyllko i wylacznie bity czyli robisz mniejwiecej tak
  1. <?php
  2. define('NAME_VISIBILITY',1); // 1 czyli bitowo 00001
  3. define('EMAIL_VISIBILITY',2); // 2 czyli bitowo 00010
  4. define('GG_VISIBILITY',4); // 4 czyli bitowo 00100
  5. define('CITY_VISIBILITY',8); // 8 czyli bitowo 01000
  6. //i teraz jak pobierzesz z bazy option dla danego usera to tylko sprawdzasz
  7. if(option & NAME_VISIBILITY) { echo .... }
  8. if(option & GG_VISIBILITY) { echo 'jego gg to'.$user_gg }
  9. //Jak chcesz zmienic zeby nazwisko bylo ukryte piszesz
  10. option &= !NAME_VISIBILITY; // i zapisujesz to nowe option do bazy a najlepiej zobic to bezposrednio przez zap
    ytanie sql 'UPDATE users SET option = option & !'.NAME_VISIBILITY.' WHERE user_id=......'
  11. //jesli chcesz zmienic zeby sie numer gg pokazywal to tak:
  12. option |= GG_VISIBILITY; // i zapisujesz to nowe option do bazy lub od razu zmienic zapytaniem
  13. ?>
Albitos
Sposób podany przez heaven'a wydaje się być najsensowniejszy. Operatory bitowe bardzo przydają się, kiedy potrzeba określić stany kilku rzeczy i przetrzymywać je w jednym miejscu smile.gif
szczypior
Jeśli dobrze rozumiem:

option to ma być zmienna której wartość pobieram z bazy, czyli np: 0001001 tak?

  1. <?php
  2. $option = "0001001";
  3.  
  4. define('NAME_VISIBILITY',1); // 1 czyli bitowo 00001
  5. define('EMAIL_VISIBILITY',2); // 2 czyli bitowo 00010
  6. define('GG_VISIBILITY',4); // 4 czyli bitowo 00100
  7. define('CITY_VISIBILITY',8); // 8 czyli bitowo 01000
  8.  
  9. if($option & NAME_VISIBILITY) { echo "<p>".NAME_VISIBILITY; }
  10. if($option & NAME_VISIBILITY) { echo "<p>".EMAIL_VISIBILITY; }
  11. if($option & NAME_VISIBILITY) { echo "<p>".GG_VISIBILITY; }
  12. if($option & GG_VISIBILITY) { echo "<p>".CITY_VISIBILITY; }
  13. ?>


czyli w tym wypadku powinno się wyświetlić 1 i 8, ale wyświetla się 1,2,4.

Jak zmienię GG_VISIBILITY na 5 niezmieniając wartości $option to, ku jeszcze wiekszemu zdziwieniu wyswietla się 1,2,5,8.

Pewnie cuś robie nie tak.

Podany przez Ciebie przykład może być zastosowany gdy użytkownik decyduje co chce ujawnić a co nie. Można by go zastosować też w przypadku gdy decyduje co i komu pokazuje winksmiley.jpg, ale trzeba by zrobić wtedy w bazie kolumny: pokaz_wszystkim, pokaz_zalogowanym, pokaz_znajomym i takie rozwiązanie uważacie że jest najlepsze?
heaven
Zrobiles blad i pisales czaly czas NAME_VISIBILITY w 3 ifach
  1. <?php
  2. //$option = "0001001"; // tu tez byl blad!!!!
  3. $option = 2^0 | 2^3; czyli liczba 9 a bitowo 9 to 1001
  4.  
  5. define('NAME_VISIBILITY',1); // 1 czyli bitowo 00001
  6. define('EMAIL_VISIBILITY',2); // 2 czyli bitowo 00010
  7. define('GG_VISIBILITY',4); // 4 czyli bitowo 00100
  8. define('CITY_VISIBILITY',8); // 8 czyli bitowo 01000
  9.  
  10. if($option & NAME_VISIBILITY) { echo "<p>".NAME_VISIBILITY; }
  11. if($option & EMAIL_VISIBILITY) { echo "<p>".EMAIL_VISIBILITY; }
  12. if($option & GG_VISIBILITY) { echo "<p>".GG_VISIBILITY; }
  13. if($option & CITY_VISIBILITY) { echo "<p>".CITY_VISIBILITY; }
  14. ?>

Tak, option i inne dane uzytkownika bobierasz z bazy i zamiast echo "<p>".NAME_VISIBILITY; powinienes napisac echo "<p>".#user_name;, oczywiscie user_name tez musisz wczesniej odczytac z bazy

Wszystki definicje musza byc wielokrotnoscia dwojki czyli 1,2,4,8,16,32,64,128,256,......
w tym przykladzie 2 jest podnoszone do potegi
  1. <?php
  2. define('NAME_VISIBILITY',2^0); // 1 czyli bitowo 00001
  3.  define('EMAIL_VISIBILITY',2^1); // 2 czyli bitowo 00010
  4.  define('GG_VISIBILITY',2^3); // 4 czyli bitowo 00100
  5.  define('CITY_VISIBILITY',2^4); // 8 czyli bitowo 01000
  6. ?>

zauwaz ze wszystkie te dane trzymasz w bazie np. w typie int. int w mysql ma chyba 4 bajty wiec co za tym idzie mozesz 32 rozne opcje tam przetrzymywac i to nie tylko dla tej widocznosci mozesz przeciez np. zrobic wylaczenie konta
define('ACCOUNT_DISABLE', 16); // czyli 2^5
i przy logowaniu sprawdzac czy czasem nie ma bitu ustawionego dotyczacego wylaczenia konta i zalogowac albo nie
szczypior
sorka małe przeoczenie winksmiley.jpg

Mam pytanie co do sposobu zmiany wartości ukryj/pokaż:
Cytat
//Jak chcesz zmienic zeby nazwisko bylo ukryte piszesz
option &= !NAME_VISIBILITY; // i zapisujesz to nowe option do bazy a najlepiej zobic to bezposrednio przez zapytanie sql 'UPDATE users SET option = option & !'.NAME_VISIBILITY.' WHERE user_id=......'
//jesli chcesz zmienic zeby sie numer gg pokazywal to tak:
option |= GG_VISIBILITY; // i zapisujesz to nowe option do bazy lub od razu zmienic zapytaniem


  1. <?php
  2. $option = "0001001";
  3. echo "<p>".$option;
  4. $option &= !CITY_VISIBILITY;
  5. echo "<p>".$option;
  6. $option |= GG_VISIBILITY;
  7. echo "<p>".$option;
  8. ?>


kolejno wyświetla mi się 0001001, 0, 4, a nie wartości binarne po zmianach.
heaven
spojrz jeszcze raz na moja poprzednia odpowiedz. poprawilem tam juz bo nie zauwazylem ze zapisales bitu jako string

//$option = "0001001"; // tu tez byl blad!!!!
$option = 2^0 | 2^3; czyli liczba 9 a bitowo 9 to 1001

  1. <?php
  2. $option = 9;
  3. echo "<p>".$option; //9
  4. $option &= !CITY_VISIBILITY; // wyzerowanie bitu 4 czyli zamiast 1001 bedzie 0001 czyli to jest "1"
  5. echo "<p>".$option; // 1
  6. $option |= GG_VISIBILITY; // ustawienie bitu 3 - bylo 0001 teraz 3 bit ustawiasz masz 0101 a jest liczba 5
  7. echo "<p>".$option; // 5
  8. ?>
szczypior
żeby sprawdzić co wyświetlić a co nie przy użyciu
  1. <?php
  2. if($option & NAME_VISIBILITY) { echo "<p>".NAME_VISIBILITY; }
  3. if($option & EMAIL_VISIBILITY) { echo "<p>".EMAIL_VISIBILITY; }
  4. if($option & GG_VISIBILITY) { echo "<p>".GG_VISIBILITY; }
  5. if($option & CITY_VISIBILITY) { echo "<p>".CITY_VISIBILITY; }
  6. ?>


$option musi mieć wartość w postaci binarnej (w takiej postaci mam przechowywać w bazie, tak?)

ale żeby później zmienić poszczególne bity muszę jak przerobić na dziesiętną, potem znów na binarną i do bazy wrzucić?
heaven
nie!
option to jest pewna liczba ale ty o niej tylko myslisz binarnie. W bazie przechowujesz ja jako liczbe (int) i pozniej robisz na niej dzialania binarne ale dalej to jest liczba. nic nie konwertujesz. Ciebie jako tako nie interesuje jaka to jest liczba tylko jakie bity sa w niej poustawiane. Wydaje mi sie ze dosc obszernie opisalem problem wiec jesli jeszcze czegos do konca nie rozumiesz to zapraszam na gg (w prifilu jest widoczne)
nowotny
Ja tak tylko się wtrącę... winksmiley.jpg Tu jest błąd:
Cytat(heaven @ 11.02.2008, 19:38:05 ) *
  1. <?php
  2. define('GG_VISIBILITY',2^3); // 4 czyli bitowo 00100
  3.  define('CITY_VISIBILITY',2^4); // 8 czyli bitowo 01000
  4. ?>
heaven
masz racje smile.gif
przy okazji okazalo sie ze jest duzo wiecej bledow :/ (negator bitowy w php to ~ a nie !)
  1. <?php
  2. define('NAME_VISIBILITY',2^0); // 1 czyli bitowo 00001
  3. define('EMAIL_VISIBILITY',2^1); // 2 czyli bitowo 00010
  4. define('GG_VISIBILITY',2^2); // 4 czyli bitowo 00100
  5. define('CITY_VISIBILITY',2^3); // 8 czyli bitowo 01000
  6.  
  7. $option = 9;
  8. echo "<p>".$option; //9
  9. $option &= ~CITY_VISIBILITY; // wyzerowanie bitu 4 czyli zamiast 1001 bedzie 0001 czyli to jest "1"
  10. echo "<p>".$option; // 1
  11. $option |= GG_VISIBILITY; // ustawienie bitu 3 - bylo 0001 teraz 3 bit ustawiasz masz 0101 a jest liczba 5
  12. echo "<p>".$option; // 5
  13. ?>
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.