• 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

Cloud VPS
0 głosów
514 wizyt
pytanie zadane 3 września 2022 w PHP przez Piotrek2713 Mądrala (5,520 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 (256,600 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,520 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 (290,250 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,520 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 (290,250 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 (90,110 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 286 wizyt
pytanie zadane 10 lutego 2018 w PHP przez shy_fox Gaduła (4,320 p.)
0 głosów
1 odpowiedź 263 wizyt
pytanie zadane 22 marca 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 516 wizyt
pytanie zadane 4 lutego 2020 w PHP przez franz Gaduła (4,940 p.)

93,453 zapytań

142,448 odpowiedzi

322,717 komentarzy

62,829 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

Kursy INF.02 i INF.03
...