• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zaawansowany system przyjaznych adresow

Object Storage Arubacloud
0 głosów
369 wizyt
pytanie zadane 14 czerwca 2019 w PHP przez Paproch Użytkownik (700 p.)
Witam,

Walczę z dosyć duzym projektem, który jest czymś nowym dla mnie i wcześniej tego nie robiłem. Mianowicie strona będzie dawała możliwość dodawania przez użytkowników swoich podstron. Dane będą zapisywane w bazie danych i następnie na podstawie tych danych będzie generowany nowy plik.

I teraz w zależności od tego jak użytkownik nazwie podstronę będzie generowana na tej podstawie nazwa pliku.

Chciałbym wiedzieć czy bez użycia frameworka idzie zrobić automatycznie przyjazne linki? Np. Użytkownik utworzył takie coś https://mojadomena.pl/tresuztkownika01.html a chciałbym np. https://mojadomena.pl/tresc-uzytkownika

W małych stronach stosowałam. httaccess na sztywno przypisując nazwy

1 odpowiedź

+1 głos
odpowiedź 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 14 czerwca 2019 przez Paproch
 
Najlepsza
Nie wiem co dokładnie robisz, ale konieczne jest generowanie podstron do plików HTML? Bez specjalnego celu nie widzę sensu, aby to robić. Możesz po prostu wyświetlać te podstrony dynamicznie pobierając dane z bazy za każdym razem i prostymi regexami w .htaccess zrobisz przepisywanie adresu, w PHP odczytasz jaką podstronę trzeba pokazać, podstawisz i wyświetlisz - bez istnienia faktycznego pliku o takim adresie.

Jeśli miałoby chodzić o konkretny przykład to nie za bardzo rozumiem jak chcesz to robić automatycznie. Możesz użyć regexów, ale one muszą mieć jakiś punkt zaczepienia, aby dopasować dany ciąg do zamiany. Możesz np. napisać że wyłapie wszystkie stringi rozdzielone myślnikami i połączy je w jedno, ale skąd miałby wziąć to 01? To będzie na sztywno zawsze 01? Po prostu poczytaj o wyrażeniach regularnych i pomyśl jak zrobić adresy, aby mogły one wyłapać poszczególne fragmenty, którymi chcesz operować.
komentarz 14 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
Chyba chodzi o to, żeby interpreter php włączył się i otworzył tą stronę, jeśli w przeglądarce wpiszemy adres który nie ma na końcu php bo nie wiem jak to się robi. Reszta jest banalna.
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Domyślnie wystarczy, aby plik który się faktycznie uruchomi miał rozszerzenie .php, a jaki będzie przyjazny adres to bez znaczenia, może wcale nie mieć rozszerzenia.
komentarz 14 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
No tak, ale pytającemu pewnie chodziło o to jak zrobić żeby adres nie miał "php" a apache żeby przekazał go do pliku który ma "php" w nazwie.
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie wspomniał nigdzie o .php, ale to tak samo jak z innymi rzeczami. Można ustawić to co się da na sztywno, co napisał że robi i chciał robić to bardziej dynamicznie. Napisałem więc, że trzeba to obsłużyć wyrażeniami regularnymi. Samo usunięcie rozszerzenia php z plików to żaden problem, ale jak zrozumiałem nie o to mu chodzi - podał pewien adres, który ma się zamienić na inną nazwę pliku (bez myślnika, z liczbą, z rozszerzeniem), a nie tylko bez rozszerzenia.
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)

@Arkadiusz Waluk, chodzi mi o to że jak mam załóżmy rozwijane menu i w tym menu są odnośniki do różnych kategorii i po kliknięciu na wybraną kategorie wchodzę w pelny wykaz. I z tego wykazu wybieram sobie jeden link który mnie interesuje, a jego zawartość otwiera się w szablonie pobierają dane do wyświetlenia z bazy danych. Mam nadzieję że rozumiesz o co mi chodzi :) a te O1 było tylko tak dla przykładu żeby odróżnić nazwy linków. A docelowo chce mieć w pasku przeglądarki przyjazny adres nawet po wygenerowaniu.

Natomiast jak tak dynamicznie wygenerowany link zachowuje się przy okazji kopiuj wklej? Jak go komuś podam to otworzy się docelowa zawartość i wróci go do strony głównej? Przyznam się że nie bawiłem się tym jeszcze. 

komentarz 14 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)

@Arkadiusz Waluk,
 Chyba chodzi mu o to jak zrobić żeby dowolną nazwę strony adresu internetowego bez rozszerzenia przekierować na stałe na plik o zupełnie innej nazwie, który jest plikiem php z parametrami tak, żeby zawsze ten plik bez rozszerzenia był przekierowywany na ten sam parametr do pliku php. To może być nawet zawsze ten sam plik php tylko parametr różni te pliki między sobą. Czyli po prostu jakby alias zrobić z pliku bez rozszerzenia na plik php z konkretnym zawsze takim samym (odpowiadającym plikowi bez rozszerzenia) wybranym parametrem.

komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Tak nie do końca rozumiem :P Dane szablonu w bazie mają pewnie jakieś id lub unikalny string, który je identyfikuje. Przykład: załóżmy że mamy tabelę z postami i każdy ma w bazie kolumnę, nie wiem, "link". Mamy tam wiersz z różnymi potrzebnymi danymi posta (tytuł, treść, datę, cokolwiek), którego wartość kolumny link to "to-jest-post". Wchodzimy pod adres example.com/post/to-jest-post. W htaccess mamy regułę z regexem w rodzaju /post/([a-z\-]+), która przepisuje to na plik post.php?link=$1 (pod $1 postawi się to-jest-post). W pliku post.php odczytujemy wartość $_GET['link'] (czy tam lepiej przez filter_input() itd.), dostajemy "to-jest-post". Mając to robimy zapytanie do bazy z WHERE link='to-jest-post' LIMIT 1 (oczywiście tu wartość powinna być bindowana do zapytania) i tym sprawdzamy czy post pod takim linkiem istnieje (jak nie to rzucamy 404), uzyskujemy wszystkie pozostałe dane w tym rekordzie, podstawiamy gdzieś na stronie pod przygotowany szablon i jest gotowe. Wszystko opisałem w uproszczonej i skróconej formie, trzeba to sobie dostosować. Coś takiego czy jeszcze inny problem masz?

Przez dynamiczny link miałem na myśli tylko to, że nie będzie na sztywno wpisane w .htaccess (jak zrozumiałem tak robiłeś to do tej pory i tu Ci to nie pasuje), tylko będzie jedna reguła, która będzie dopasowywała wszystko co pasuje do niej i przypisywała, nic więcej. Nie wpływa to w żaden sposób na przesłanie linku dalej, wystarczy tylko odpowiednio go generować (nigdzie nie używać post.php?link=to-jest-link, a generować już /post/to-jest-link).

Jeszcze inna rzecz: w zasadzie nikt już teraz na poważnie nie bawi się z pisaniem reguły w .htaccess i przepisywaniu na pojedyncze pliki. Teraz robi się całe aplikacje z jednym plikiem wejściowym, wszystkie wywołania kieruje na ten jeden plik i obsługuje już tam jakimś routingiem. Często używa się też do tego bibliotek/frameworków. Skoro zadajesz takie pytania to pewnie jeszcze nie doszedłeś do tego etapu, więc jestem w stanie zrozumieć pisanie jak robisz teraz, ale warto wiedzieć, że normalnie nikt tak nie robi już i mieć to na uwadze.

@mrspock1 przekierowanie zawsze na dany plik to nie problem, przekierowanie zawsze z takim samym parametrem też, ale często przecież adres się zmienia, pojawiają się różne parametry, które występują w różnych miejscach i mają być różnie użyte. Jeśli robimy to przez .htaccess to będzie potrzebne więcej niż jeden taki wpis, dla każdego adresu praktycznie trzeba zrobić nową regułę. Opisałem teraz powyżej przykład, mam nadzieję ze o to chodziło.
komentarz 14 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
Jemu raczej chodzi o to, jak już tłumaczyłem, żeby przekierowanie adresu o dowolnej nazwie było na inną zupełnie nazwę pliku php ale dla każdego pliku wejściowego byłby inny parametr w pliku przekierowanym php. Ale raczej nie w postaci funkcji która potrafi obliczyć automatycznie jak zamienić jedną nazwę na drugą, tylko w postaci tabelki gdzie byłyby wcześniej zapisane nazwy plików wejściowych (bez rozszerzeń) i na jaki parametr on przekierowuje do tego samego pliku php. Pewnie jeszcze chciałby, żeby to było jak najprostsze do wykonania żeby mógł to ogarnąć.
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Żadnych tabelek i takich rzeczy się nie zrobi przez .htaccess. W .htaccess można zapisać pojedyncze reguły z regexami, więc nie trzeba wpisywać na sztywno dla np. każdego posta, ale każdy adres i tak trzeba rozpisać jako osobną regułę w pliku. Jeżeli chciałby robić wywoływanie na podstawie wartości z tablicy to już z poziomu PHP. Tyle że wtedy ono nie wywoła jakiegoś innego osobnego pliku php (bo po co), tylko po prostu całość powinna być oprogramowana jako jedna aplikacja i w jej wnętrzu wywoływanie akcji. No i pytanie czy tu warto wymyślać koło na nowo, skoro są gotowe biblioteki i frameworki, które szybko i łatwo obsłużą akcje.
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)

@Arkadiusz Waluk, I o to mi właśnie chodziło :) super, wiem czego szukać. Dobrze się domyślasz, dopiero zaczynam i framework przede mną, ale póki chce dobrze poznać pisanie w "czystych jezykach". Domyślam się że tak pewnie się nie robi tak jak ja to próbuję. Dzięki wielkie 

komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Rozumiem. Miło by było, aby początkujący uczyli się podstaw i zaraz zaczynali myśleć tak bardziej obiektowo i w ramach aplikacji, a nie konkretnego skryptu w postaci jednego pliku. Sam jednak zaczynałem podobnie jak Ty, długo to u mnie trwało, ale się udało. Więc jeśli tylko ktoś wie, że ma w taką stroną iść, to myślę że zaczęcie od takiego podejścia nie jest złe. Ważne tylko, aby się na nim nie zatrzymać.
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)
Ale chyba jednak o co innego jednak mi chodzi jak przealizowalem na spokojnie.

Sytuacja wygląda tak, ma dwa pliki php oraz bazę danych. I niech to będzie tak domena.pl/plik_pierwszy.php  a w nim lista linków załóżmy odnosnik1 odnośnik 2 odnosnik3. Nazwa tego linku ma byc nazwa komórki w bazie i na tej podstawie wyciągnę cały wiersz i te dane z tego wiersza maja być wysłane do pliku domena.pl/plik_drugi.php i tam odpowiednie wartości wstawia się do szablonu. Czyli wizualnie wszystkie odnośniki będą w tym samym szablonie ale różniły się treścią. I to o co mi teraz najbardziej chodzi to uzyskać taki efekt że po przesłaniu danych z plik_pierwszy.php do plik_drugi.php w adresie strony widniało domena.pl/odnosnik1 lub domena.pl/odnosnik2 czyli ta nazwa która kliknąłem w plik_pierwszy.php zamiast domena.pl/plik_drugi.php

Nie wiem jak  inaczej to wytłumaczyć :(
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
To jest właśnie to co opisałem, kwestia dostosowania. Nie wiem tylko o co Ci chodzi z jakimś przesyłaniem danych między plikami, nic takiego nie robisz. W plik_pierwszy.php wstawiasz linki do domena.pl/odnosnik1 czy tam domena.pl/odnosnik2 i tyle, nie jako plik_drugi.php. Zapominasz w tym momencie, że to faktycznie istnieje jako plik_drugi.php, podajesz te nowe wygenerowane adresy. Przypominasz sobie tylko robiąc konfigurację w .htaccess, gdzie definiujesz, że odnosnik1 to ma być plik_drugi.php. Albo jeżeli reguła ma być uniwersalna to definiujesz wyrażenie regularne w regule, kierujesz to na ten plik i przekazujesz mu w parametrze, jak to pokazywałem wyżej w przykładzie z postami.
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)
No ok, to tylko jednego nie rozumiem. Bo załóżmy że jest ten odnośnik1 w plik_pierwszy.php, to jak to podlinkowac go do danych z bazy? Bo plan miałem taki, że do a hrefa kierującego do plik_drugi.php dokleje Get z wartoscia=odnosnik1, a w plik_drugi.php odbiorę to i po tej nazwie wyciągnę z bazy resztę pasujących rekordów i powstawiam dane w szablon. Ale chyba mam wrażenie że jest lepszy sposób którego nie znam :)
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie, to jest dobry sposób. Przecież dokładnie to opisałem w przykładzie z postami powyżej. Można to przesyłać metodą POST, ale wtedy nie da się jako normalny link, tylko formularz, więc tu to nie ma sensu. Dobrze przesłać to metodą GET, czyli tak jak pokazujesz. Z tym że od początku temat zaczął się od przyjaznych adresów, więc wokół tego ciągle się kręcę. Jeżeli chcesz ich użyć możesz zrobić odnośniki do /odnosnik1 i /odnosnik2 i w .htaccess ustawić, aby to przekierowywał na plik_drugi.php?wartosc=odnosnik1 (czy inna odczytana wartość). W PHP normalnie to odczytasz, będzie widoczne jakby tego początkowego przepisania w ogóle nie było.

A lepszym sposobem jest zrobienie tego routingiem w aplikacji, tak jak opisałem wcześniej. Aby nie wymyślać koła na nowo wygodniej skorzystać z jakiejś biblioteki/frameworka.
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)
No to chyba powoli zaczyna mi się to układać w głowie :) dziękuję Ci bardzo za podpowiedzi. Tylko jakbyś jeszcze mógł podpowiedzieć jakiej libki szukać, jeżeli masz coś sprawdzonego? Bo jeszcze chwilę wstrzymam się z frameworkiem, ale na pewno za niego się wezmę.
komentarz 14 czerwca 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

Pod sam routing nie mam, ale po szybkim szukaniu widać, że to jest nawet popularne i aktualne: https://github.com/nikic/FastRoute - nie wiem jak wygląda w praktyce, ale na początek pewnie wystarczy. Ja do tej pory zawsze routing łączyłem z całym frameworkiem, jeśli coś bardzo małego to polecam Slima, jak odrobinę większego to Symfony, które w podstawowej wersji jest też dość małe (resztę można łatwo doinstalowywać). Tyle że to wszystko (nawet ta pierwsza biblioteka) opiera się o programowaniu obiektowym, wypadałoby w miarę sensownie ogarniać podstawy PHP i obiektówkę.

1
komentarz 14 czerwca 2019 przez Paproch Użytkownik (700 p.)

Super, wielkie dzięki. To już mniej więcej wiem co z czym :) mam nadzieję że sobie poradzę i przekuje porażkę w sukces smiley wątek można uznać za zamknięty smiley

Podobne pytania

0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 4 listopada 2015 w PHP przez Radekoslaw123 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 372 wizyt
pytanie zadane 22 maja 2022 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
1 odpowiedź 337 wizyt
pytanie zadane 27 stycznia 2021 w PHP przez Maciek06 Użytkownik (680 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...