generowanie podstron

0

Trochę zaczynam spamować w tym dziale, bo kolejny temat zakładam, ale mam nadzieje że oprócz mi komuś jeszcze to pomoże

Dajmy na to że chcę założyć spis książek online,

  • strona na której będą wyświetlane wszystkie wraz z wyszukiwarką
  • podstrona do dodawania kolejnych

po wyszukaniu w bazie chciałbym żeby każda książka miała swoja podstonę
np adres strona_com/tytuł-autor-rok

jak takie coś osiągnąć? Pod jakimi hasłami szukać wskazówek w google?
Tworzyć dla każdej strony statyczny plik a w nim includować np nagłówek, stopkę a po środku treść ?
I wpisywać adres dla każdej w bazie?

Jest na to jakaś dobra technika?

0

Używasz jakiś framework, czy nie?

0

nie, na czysto, pierwsze kroki w php
ale udało mi się w miare to rozwiązać
Stworzyłem plik a w nim taki kod

<?php

    if(isset($_GET['id'])){
        
        $zmienna = $_GET['id'];

        
        
        
        $baza=mysqli_connect("localhost","root","","filmy");
        mysqli_set_charset($baza,"utf8");
        if (mysqli_connect_errno()){
            echo "Wystąpił błąd połączenia z bazą";
        }

        
        $wynik = mysqli_query($baza,"SELECT * FROM filmy WHERE id =".$zmienna);
        
        while($row = mysqli_fetch_array($wynik))

        {
            echo $row['nazwa'];
            echo "<br>"; 
            echo $row['rok'];
            echo "<br>"; 
        }

        mysqli_close($baza);
        
        
    }
?>

Czyli po prostu w linku jest ID.

I tu kolejne pytanie, jak zrobić to przez to mod rewrite czy coś takiego, bo chciałbym mieć w linku po prostu /nazwa-rok
jest do tego jakaś funkcja? jak to dokładnie działa?

0

Wejdź teraz pod adres mojastrona.com?id=1; DROP TABLE filmy;--

  1. Używaj PDO i uważaj na SQL Injection.
  2. Utwórz w tabeli filmy kolumnę pod tytułem slug i uzupełnij ją dla każdego filmu. Dla przykładu:
    Tytuł: Władca Pierścieni
    Reżyser: Peter Jackson
    Premiera: 2001-12
    Slug: wladca-pierscieni-peter-jackson-2001-12
  3. Zamiast id po prostu w url umieszczaj slug.
    `mojastrona.com/filmy/wladca-pierscieni-peter-jackson-2001-12
  4. SELECT * FROM filmy WHERE slug = :slug.
1

Wejdź teraz pod adres mojastrona.com?id=1; DROP TABLE filmy;--

Nic złego się nie stanie, bo mysqli_query nie wspiera stacked/multiple queries.

0
Desu napisał(a):

Wejdź teraz pod adres mojastrona.com?id=1; DROP TABLE filmy;--

  1. Używaj PDO i uważaj na SQL Injection.
  2. Utwórz w tabeli filmy kolumnę pod tytułem slug i uzupełnij ją dla każdego filmu. Dla przykładu:
    Tytuł: Władca Pierścieni
    Reżyser: Peter Jackson
    Premiera: 2001-12
    Slug: wladca-pierscieni-peter-jackson-2001-12
  3. Zamiast id po prostu w url umieszczaj slug.
    `mojastrona.com/filmy/wladca-pierscieni-peter-jackson-2001-12
  4. SELECT * FROM filmy WHERE slug = :slug.

ale w jaki sposób to zrobić, tzn umieścić to w adresie?
teraz robiłem to get`em,

a może w jakiś sposób bo bazy jeszcze nie ma
przy dodawaniu rekordu do bazy, dopisywać linijkę do .htacces?

a w niej zmienne ; adres.pl/ $tytul - $rok ? Czy to dobre rozwiązanie?

2

Jeżeli nie uzywasz frameworka to będzie trzeba trochę zaczarować. Od razu zaznaczam, że nie jestem mistrzem konfiguracji nginx/apache, ale takie proste rozwiązanie nas urządza. A więc do dzieła:

  1. Musimy dodać odpowiednią regułę, która przepisze nasz url.
    Dla nginxa:
location ~ ^/filmy/(?<slug>.+) {
    try_files $uri $uri/ /movies.php?slug=$slug; 
}

Dla apacha (chyba, bo nie sprawdzałem):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/filmy/(.+)$ /movies.php?slug=$1 [L]

To spowoduje, że jak ktoś wejdzie pod taki link: aplikacja.dev/filmy/wladca-pierscieni-peter-jackson-2001-12 to odpali się plik movies.php. Nie bardzo umiem zrobić regex, który zmatchuje slug, dlatego dodałem przedrostek filmy, ale można by się pokusić o coś takiego:

RewriteRule ^/([a-z0-9]+(?:-[a-z0-9]+)*)$ /movies.php?slug=$1 [L]

To by pozwoliło przekierować taki url aplikacja.dev/wladca-pierscieni-peter-jackson-2001-12 na movies.php, ale to już musisz sam podłubać, bo ja nie mam czasu. Z tym, że chyba nie działa bo apach i nginx mają jakiś inny standard regex niż ten mi znany.

  1. Tworzysz plik movies.php.
<?php
// dzięki przepisaniu urla na movies.php?slug=$1 masz w $_GET slug
$slug = $_GET["slug"];
  1. Wyciągasz film po slugu
SELECT * FROM movies WHERE slug = :slug
  1. Wyświetlasz dane filmu.

Jeżeli chcesz stworzyć link do tego, to np tak:

$movies = [
    ["name" => "Władca Pierścieni", "slug" => "wladca-pierscieni-peter-jackson-2001-12"],
    ["name" => "Foo bar", "slug" => "foo-bar-john-doe-2012-03"],
];

foreach ($movies as $movie) {
    echo '<a href="/filmy/' . $movie["slug"] . '">' . $movie["name"] . '</a>';
}

Generalnie użycie frameworka bardzo by Ci tu ułatwiło życie. Taki laravel to w zasadzie zrobi wszystkio za Ciebie. Nie będziesz musiał się bawić z konfiguracją serwera, bo wewnętrzy system routingu i front controller pattern wszystko ogarnie. Nawet jak go odpowiednio skonfigurujesz, co jest banalne, to Ci po slugu sam wyciągnie film z bazy, a jak mu się nie uda to przekieruje na 404 - confused travolta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1