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

Generowanie adresu URL na podstawie danych z bazy

Object Storage Arubacloud
0 głosów
291 wizyt
pytanie zadane 3 września 2022 w PHP przez Piotrek2713 Mądrala (5,380 p.)
Sprawa wygląda tak:

 

Chcę utworzyć skrypt (o ile to możliwe), który wygeneruje mi adres URL podstrony na podstawie danych z Bazy.

Przykładowo, mam w bazie artykuł z wierszem title o wartości „Pierwszy wpis na blogu” i chcę, aby adres w takim przypadku był następujący www.moja-domena.pl/pierwszy-wpis-na-blogu/.

Czy można użyć do tego PHP, czy trzeba stworzyć plik.htaccess?
komentarz 6 września 2022 przez VBService Ekspert (253,340 p.)
edycja 6 września 2022 przez VBService

Wydaje się proste, ale jakoś trudno mi jest to sobie poukładać w głowie. 

może spróbuj coś w tym stylu

 

.htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

# RewriteRule ^(.*)$ index.php [QSA]  
# lub
# RewriteRule ^(.+)$ index.php [NC,QSA,L]
# lub
RewriteRule ^(.+)$ index.php [NC,QSA,L]

 

index.php

<?php
 
  //var_dump($_SERVER['REQUEST_URI']);
 
  $request_clean_uri = str_replace('-', ' ', basename($_SERVER['REQUEST_URI']));
 
  //var_dump($request_clean_uri);
 
  // symulacja bazy danych
  $db = [
    [ 'link' => 'Lorem ipsum 1',       'desc' => 'Lorem ipsum 1 dolor sit amet, consectetur adipiscing elit' ],
    [ 'link' => 'Lorem ipsum 2',       'desc' => 'Lorem ipsum 2 dolor sit amet, consectetur adipiscing elit' ],
    [ 'link' => 'Lorem ipsum 3 lorem', 'desc' => 'Lorem ipsum 3 lorem dolor sit amet, consectetur adipiscing elit' ]
  ];
 
  $ul = $desc = '';
  foreach ($db as $item) {
    $link = strtolower(str_replace(' ', '-', $item['link']));
    $ul .= "<li><a href=\"{$link}\">{$item['link']}</a></li>";
  }    
 
  if ($request_clean_uri) {
    $error_404 = true;
 
    // tutaj np.: $sql = "SELECT * FROM artykul WHERE link = '$request_clean_uri'"
 
    // symulacja pobierania danych po $mysqli->query($sql)
    foreach ($db as $item)
      if (strtolower($item['link']) == $request_clean_uri) {
        $desc = "<h3>{$item['link']}</h3><p>{$item['desc']}</p>";
        $error_404 = false;
        break;
      }
 
    if ($error_404)
      header("location: 404.php"); // lub 404.html
  }
?>
<ul>
  <?php echo $ul; ?>
  <li><a href="lorem-fake-link">Lorem fake link</a></li>
</ul>
<div>
  <?php echo $desc; ?>
</div>

 

Simple Pretty URL Using PHP htaccess (Step-By-Step Example)

komentarz 7 września 2022 przez Piotrek2713 Mądrala (5,380 p.)

Mam tak i my wyświetla błąd

<?php

    require_once "connect.php";

    $connection = new mysqli($host, $db_user, $db_password, $db_name);

    if ($connection->connect_errno!=0)
    {
        echo "error".$connection->connect_errno;
    }
    else
    {
        $sql = "SELECT * FROM `artykuły`";

        if ($result = $connection->query($sql))
        {
            class Article
            {
                public $title;
            }

            $_SESSION['articles'] = [];
            $_SESSION['article_id'] = 0;

            while($row = $result->fetch_assoc())
            {
            $_SESSION['articles'][$_SESSION['article_id']] = new Article();
            $_SESSION['articles'][$_SESSION['article_id']]->title = $row['title'];
            $_SESSION['article_id']++;
            }
        }
  
            $request_clean_uri = str_replace('-', ' ', basename($_SERVER['REQUEST_URI']));

            foreach ($_SESSION['article']->title as $item)
            {
                $link = strtolower(str_replace(' ', '-', $item['link']));
                $href .= "<a class=\"btn btn-primary\" href=\"{$link}\">Pokaż więcej</a>";
            }    
            
            if ($request_clean_uri)
            {
                $error_404 = true;
            
                $sql = "SELECT * FROM artykuły WHERE Hypertext = '$request_clean_uri'";
            
                // symulacja pobierania danych po $mysqli->query($sql)
                foreach ($_SESSION['article']->title as $item)
                if (strtolower($item['link']) == $request_clean_uri)
                {
                    $error_404 = false;
                    break;
                }
            
                if ($error_404)
                header("location: 404.php");
            }
        $connection->close();
    }

?>

2 odpowiedzi

+1 głos
odpowiedź 3 września 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
Można do tego użyć PHP, ale w htaccess trzeba zrobić przekierowanie wszystkiego oprócz istniejących fizycznie plików na jeden plik początkowy aplikacji, najczęściej index.php. To bardzo często spotykana metoda. Wygodna i dająca większe możliwości, bo cała decyzja dotycząca tego co wyświetlić pod danym adresem zapada w aplikacji, niezależnie od serwera. Wymaga jednak wspomnianej konfiguracji np. w htaccess, bo Apache nie będzie wiedział, że pod tym adresem powinien coś zrobić jeśli fizycznie pliku/katalogu o podanej nazwie na dysku nie będzie i zwróci 404. Z regułą przekierowującą na index.php niezależnie od adresu zostanie wywołany ten plik i już po stronie PHP decydujesz co się stanie dalej, co zostanie uruchomione, np. poprzez pobranie jakichś danych z bazy.

Samo generowanie nie wymaga specjalnej procedury, po prostu w bazie możesz sobie zrobić kolumnę na ten fragment z adresu, który będzie uzupełniany w momencie zapisu tytułu. Następnie przy wejściu na stronę szukać rekordu dla podanej frazy - jeśli jest to wykonywać z nim określone akcje i przygotowywać widok, a jeśli nie ma to zwrócić 404.
komentarz 3 września 2022 przez Piotrek2713 Mądrala (5,380 p.)
Wydaje się proste, ale jakoś trudno mi jest to sobie poukładać w głowie. Potrzebuję mieć jasny obraz, jak to powinno wyglądać. Nigdy jeszcze nie tworzyłem pliku .htaccess, a PHP znam na najbardziej podstawowym poziomie
komentarz 3 września 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
A czego dokładnie brakuje Ci w tym obrazie? :)

.htaccess powinien zawierać przepisanie adresu na jeden wejściowy plik, np. index.php. Przykład: https://stackoverflow.com/a/18406686 są tu dwie opcje, jedna z przekazaniem podstrony w parametrze GET, druga zakładająca że adres odczyta się z REQUEST_URI. Niezależnie czy użyje się pierwszego czy drugiego w PHP należy odczytać tę wartość i na jej podstawie zadecydować o uruchomieniu danej akcji, np. wykonać proste zapytanie na zasadzie SELECT ... FROM ... WHERE url=?, gdzie jako ? podstawiona będzie wartość odczytana z adresu. Gdy jest rekord to generujesz odpowiednio podstronę, gdy go nie ma to zwracasz stronę błędu 404, bo to znaczy że ktoś szuka podstrony, której nie ma.
+1 głos
odpowiedź 4 września 2022 przez SzkolnyAdmin Szeryf (86,360 p.)

Czy problem leży w zamianie tekstu " Pierwszy wpis na blogu " na " pierwszy-wpis-na-blogu "? Jeśli tak, to użyj funkcji tekstowych PHP. Zobacz np. tu

Podobne pytania

0 głosów
3 odpowiedzi 208 wizyt
pytanie zadane 10 lutego 2018 w PHP przez shy_fox Gaduła (4,320 p.)
0 głosów
1 odpowiedź 188 wizyt
pytanie zadane 22 marca 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 4 lutego 2020 w PHP przez franz Gaduła (4,940 p.)

92,573 zapytań

141,423 odpowiedzi

319,647 komentarzy

61,959 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!

...