Πολλαπλές παράμετροι στις διαδρομές της μηχανής σε PHP

Ας υποθέσουμε ότι τώρα ο ιστότοπός μας έχει κατηγορίες και σελίδες που ανήκουν σε αυτές τις κατηγορίες. Ας δημιουργήσουμε έναν πίνακα με τις κατηγορίες:

categories
id slug name
1 first-category name1
2 second-category name2

Και έναν πίνακα με τις σελίδες:

pages
id slug title content category_id
1 my-first-page title1 <div> content1 </div> 1
2 my-second-page title2 <div> content2 </div> 1
3 my-third-page title3 <div> content3 </div> 2

Στον ιστότοπό μας επιτρέπουμε τα slugs των σελίδων από διαφορετικές κατηγορίες να συμπίπτουν. Αυτό σημαίνει ότι στο URL πρέπει πρώτα να καθορίσουμε το slug της κατηγορίας και μετά το slug της σελίδας σύμφωνα με το ακόλουθο σχήμα: /page/:category/:page, όπου με άνω και κάτω τελεία υποδεικνύονται οι θέσεις στις οποίες θα υπάρχουν μεταβαλλόμενες παράμετροι.

Ας γράψουμε τις διαδρομές για τον ιστότοπό μας:

php<?php
  $route = '^/page/(?<catSlug>[a-z0-9_-]+)/(?<pageSlug>[a-z0-9_-]+)
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/show.php';
  }
  
  $route = '^/page/(?<catSlug>[a-z0-9_-]+)
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/category.php';
  }
  
  $route = '^/
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/all.php';
  }
?>

Σ τον χειριστή της πρώτης διαδρομής θα εμφανίζουμε τη ζητούμενη σελίδα:

view/page/show.php<?php
  $catSlug = $params['catSlug'];
  $pageSlug = $params['pageSlug'];
  
  $query = "SELECT pages.title, pages.content 
    FROM pages
  LEFT JOIN
    category ON category.id=pages.category_id
  WHERE
    pages.slug='$pageSlug' AND category.slug='$catSlug'";
  
  $res = mysqli_query($link, $query) or die(mysqli_error($link));
  $page = mysqli_fetch_assoc($res);
  
  return $page;
?>

Σ τον χειριστή της δεύτερης διαδρομής θα εμφανίζουμε τη λίστα των σελίδων από την καθορισμένη κατηγορία:

view/page/category.php<?php
  $catSlug = $params['catSlug'];
  
  $query = "SELECT pages.slug, pages.title FROM pages
  LEFT JOIN
    category ON category.id=pages.category_id
  WHERE
    category.slug='$catSlug'";
  
  $res = mysqli_query($link, $query) or die(mysqli_error($link));
  
  for ($data = []; $row = mysqli_fetch_assoc($res); $data[] = $row);
  
  $content = '';
  foreach ($data as $page) {
    $content .= '
      <div>
        <a href="/page/' . $catSlug . '/'  . $page['slug'] . '">' . $page['title'] . '</a>
      </div>
    ';
  }
  
  $page = [
    'title' => 'λίστα όλων των σελίδων της κατηγορίας ' . $catSlug,
    'content' => $content
  ];
  
  return $page;
?>
Задание 1

Ας υποθέσουμε ότι έχετε έναν ιστότοπο με πόλεις και χώρες. Ας υποθέσουμε ότι στη διεύθυνση / εμφανίζεται μια λίστα όλων των χωρών, στη διεύθυνση /:country εμφανίζεται μια λίστα των πόλεων της καθορισμένης στη παράμετρο χώρας, και στη διεύθυνση /:country/:city η περιγραφή της καθορισμένης πόλης.