Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[mysql+php] - Wyświetlenie danych z tabeli

piottro1 24 Sty 2014 05:24 1785 12
  • #1 24 Sty 2014 05:24
    piottro1
    Poziom 10  

    Mam taka tabelę:

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kolumny gall_01, gall_02, gall_03 są dodawane do tabeli w momencie gdy powstaje nowa galeria na stronie, więc będzie ich więcej.
    Jak skonstruować zapytanie, aby wyświetlić pola tylko tych kolumn, dla użytkownika o określonym ID? Próbowałem to jakoś ugryźć ale nie mogę sobie z tym poradzić, proszę o pomoc.

    0 12
  • #2 24 Sty 2014 09:07
    kradam
    Poziom 14  

    Mam wrażenie, że galerie powinny być rekordami w innej tabeli, połączonej relacją z users. Proponuję poczytać o projektowaniu baz danych, lekcja pewnie druga. Po odpowiednim zaprojektowaniu bazy wyciągnięcie wszystkich galerii będzie trywialne.

    0
  • #3 24 Sty 2014 16:13
    piottro1
    Poziom 10  

    W sumie mam przygotowana druga tabelę, ale zapomniałem o tym wspomnieć:

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Próbuję zrobić uprawnienia do oglądania galerii. Myślałem o tym aby zmieniać wartość 0 na 1 w kolumnach gall_01, gall_02.. itd. w tabeli "users".

    0
  • #4 24 Sty 2014 16:45
    marcinj12
    Poziom 40  

    I będziesz każdorazowo przebudowywał bazę danych jak dojdzie nowa galeria? To już lepiej dodaj w tabeli użytkowników kolumnę typu varchar i każdemu użytkownikowi wstawiaj tam numery ID galerii, które ma widzieć, rozdzielone np. przecinkiem.
    Potem zależy jak to zaprojektujesz - możesz albo użyć tej kolumny i funkcji php explode() / implode() do sprawdzenia w kodzie, czy użytkownik może wyświetlić galerię o danym numerze ID, albo, jeżeli robisz złączenie tabel, dodać warunek WHERE gallerys.ID IN (...)

    0
  • #5 24 Sty 2014 17:15
    piottro1
    Poziom 10  

    @marcinj12 napisał:
    I będziesz każdorazowo przebudowywał bazę danych jak dojdzie nowa galeria?
    Mam gotowy formularz, w którym sprawdzam ostatnio dodaną galerię (identyfikator), wysyłam dane do bazy (uzupełniam pola w "gallerys", dodaję kolumnę do "users"), tworzę nowy folder na serwerze, gdzie następnie kopiuję pliki dla nowej galerii, dodaję wpis/link do pliku, gdzie są wyświetlane galerie. W następnym formularzu dodaję zdjęcia do odpowiedniej lokalizacji.

    @marcinj12, próbowałem już coś takiego zrobić. Utworzyłem kolumnę "auth" i do jej pól dodawałem wartości: _01,_02,_03,
    Później sprawdzałem czy istnieją, dla danego użytkownika, zapytaniem:
    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Pomyślałem jednak o prostym formularzu w którym będę mógł nadawać uprawnienia do poszczególnych galerii. Stąd pomysł z kolumnami w tabeli "users", zawierającymi wartości "0" lub "1". Chciałbym w formularzu umieścić checkbox'y i w prosty sposób nadać owe uprawnienia.
    Sprawa jest prosta, gdy ilość galerii jest ustalona, ale mam problem, bo galerii z czasem będzie przybywać.
    Szukam sposobu na sprawdzenie i wyświetlenie wartości w polach kolumn dla wybranego użytkownika .

    0
  • Pomocny post
    #6 24 Sty 2014 19:40
    marcinj12
    Poziom 40  

    Dodawanie dodatkowych kolumn do tabeli jest bezdyskusyjnie złym pomysłem.

    Nie rozumiem, dlaczego zrezygnowałeś ze sposobu który wymyśliłeś - w czym przeszkadza on w stworzeniu checkboxów na formie? Za każdym razem, kiedy dodajesz użytkownikowi galerię po prostu łączysz stringa ze wszystkich zaznaczonych checkboxów i robisz mu UPDATE tej kolumny.

    Nie jest też dla mnie jasne, czy chcesz dodawać uprawnienia użytkowników do galerii przy tworzeniu galerii, czy to użytkownikom przypisywać galerie, przy zakładaniu użytkownika? A może ma to być jakiś niezależny mechanizm?

    W każdym razie opcja jest jeszcze jedna - dwukolumnowa tabela z id_użytkownika i id_galerii. Dodajesz tam w kolejne wiersze uprawnienia na pary użytkownik-galeria, które potem możesz łatwo wyciągnąć SQLem.

    0
  • Pomocny post
    #7 24 Sty 2014 20:43
    kradam
    Poziom 14  

    marcinj12 napisał:

    W każdym razie opcja jest jeszcze jedna - dwukolumnowa tabela z id_użytkownika i id_galerii. Dodajesz tam w kolejne wiersze uprawnienia na pary użytkownik-galeria, które potem możesz łatwo wyciągnąć SQLem.

    To nie jest jeszcze jedna opcja, tyko jedyna godna uwagi, o ile wymagania są takie, że użytkownik ma dostęp do wielu galerii, a do jednej galerii może mieć dostęp wielu użytkowników.
    Rozwiązanie z varchar to programistyczny koszmarek, a problem przecież jest na poziomie liceum!!!

    0
  • Pomocny post
    #8 24 Sty 2014 23:29
    rufek90
    Poziom 24  

    Faktycznie najlepszym sposobem będzie utworzenie nowej, dwukolumnowej tabeli. Nie powinno się żałować tabel na takie rzeczy, bo takie rozwiązanie nie skomplikuje kodu.

    Rozwiązanie z varcharem wymaga napisania bardziej skomplikowanego SQL, lub dopisania paru linii do obsługi tak wyciągniętego rekordu...

    Uważam też, że dokładanie kolumn 'z kodu' do istniejącej tabeli to ostateczność... W takim przypadku nie ma to sensu.

    Podsumowując:

    potrzebujesz trzech tabel, w których rekordami będą: pojedynczy użytkownik, pojedyncza galeria, pojedyncza para idUzytkownik - idGaleria identyfikujące możliwość dostępu konkretnego użytkownika do konkretnej galerii.

    Aby pokazać użytkownikowi konkretne galerie robisz coś w stylu:

    Kod: sql
    Zaloguj się, aby zobaczyć kod



    Na koniec mała uwaga: tabele w bazie danych zwykło się nazywać od tego, co będą przechowywać, ale w liczbie pojedynczej, czyli u Ciebie proponuję zmienić na 'user', 'gallery' a jak zmieniać nie chcesz, to chociaż pamiętać na przyszłość :)

    0
  • #9 26 Sty 2014 04:00
    piottro1
    Poziom 10  

    Dziękuję kolegom za odpowiedzi. Są dla mnie cenne jako, że jestem początkujący.
    Moje nowe tabele wyglądają następująco:

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Jeśli zrobiłem coś nie tak jak trzeba to proszę o poprawienie.

    0
  • Pomocny post
    #10 26 Sty 2014 08:25
    rufek90
    Poziom 24  

    Nie jest źle, ale można jeszcze coś poprawić.

    z najważniejszych:
    - kolumna 'data' w user proponuję zapisać jako typ DATETIME
    - nie trzymasz się konwencji nadawania id: w tabeli 'user' masz kolumnę o nazwie 'id', a np. w gallery masz 'gallery_id'
    - w user wszystkie pola masz obowiązkowe (not null), i nie nadajesz im wartości domyślnych. Zastanów się, czy na pewno wszystkie pola muszą być obowiązkowe
    - id zapisujesz jako tinyint. Proponuję zmienić na inta jednak, bo tinyint ma mały zakres wartości i jeżeli robisz rzeczywisty system to można łatwo to przekroczyć

    zapytanie które Ci wkleiłem ostatnio zmodyfikowałem nieco (dodałem grupowanie w razie czego)

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #11 26 Sty 2014 21:38
    maciek_44
    Poziom 2  

    dobrze by było jeszcze dodać indeksy i wszystkie TINYINT zmień na INT i od razu na UNSIGNED... nie będziesz tam robić przecież ujemnych wartości

    0
  • #12 27 Sty 2014 04:34
    piottro1
    Poziom 10  

    Dzięki za kolejne wskazówki. Tabele przedstawiają się teraz tak:

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    Kod: mysql
    Zaloguj się, aby zobaczyć kod

    rufek90 napisał:
    w user wszystkie pola masz obowiązkowe (not null), i nie nadajesz im wartości domyślnych. Zastanów się, czy na pewno wszystkie pola muszą być obowiązkowe
    No tak, zrezygnowałem z kilku, bo faktycznie nie są aż tak istotne.
    maciek_44 napisał:
    i wszystkie TINYINT zmień na INT i od razu na UNSIGNED... nie będziesz tam robić przecież ujemnych wartości
    Zgadza się, dzięki za tą radę.
    maciek_44 napisał:
    dobrze by było jeszcze dodać indeksy
    Nie bardzo rozumiem o co chodzi i do czego mogę to wykorzystać.

    Poza tym, czy dla pola typu text można ustalić zakres wartości na poziomie bazy czy tylko w wysyłanym formularzu?

    Wracając do pomysłu nadawania uprawnień do przeglądania galerii, bazując na dodatkowej tabeli przechowującej "user_id" i "gallery_id". Rozumiem że poprzez dodanie rekordu nadaję uprawnienia. A co z odebraniem? Czyżbym musiał usuwać owe rekordy z bazy?

    0
  • #13 27 Sty 2014 05:39
    the_fifth_horseman
    Poziom 32  

    piottro1 napisał:
    maciek_44 napisał:
    dobrze by było jeszcze dodać indeksy
    Nie bardzo rozumiem o co chodzi i do czego mogę to wykorzystać.
    To poczytaj do czego służą indeksy i jak się je tworzy.
    Cytat:
    Poza tym, czy dla pola typu text można ustalić zakres wartości na poziomie bazy czy tylko w wysyłanym formularzu?
    Jeżeli potrzebne ci pole które przyjmuje jedną z kilku z góry określonych wartości, to powinieneś użyć typu ENUM.

    Cytat:
    Wracając do pomysłu nadawania uprawnień do przeglądania galerii, bazując na dodatkowej tabeli przechowującej "user_id" i "gallery_id". Rozumiem że poprzez dodanie rekordu nadaję uprawnienia. A co z odebraniem? Czyżbym musiał usuwać owe rekordy z bazy?
    Owszem.

    0