[PHP] Jak zrobić system tagów?

System tagów to przydatne rozwiązanie, które pozwala na kategoryzację i indeksowanie treści strony internetowej. Dzięki zastosowaniu systemu tagów, użytkownicy mogą łatwo znaleźć interesujące ich treści oraz przeglądać je według określonych kategorii. W tym artykule omówię, jak stworzyć prosty system tagów w PHP, który będzie skuteczny i łatwy w obsłudze. Na potrzeby tego wpisu załóżmy, że chcemy zrobić tagi do prostej strony z artykułami.

Baza danych

Pierwszym krokiem w tworzeniu systemu tagów jest zaprojektowanie odpowiedniej struktury bazy danych. Baza danych będzie przechowywać informacje o tagach oraz powiązania między tagami a artykułami. Schemat bazy powinien wyglądać tak:

Tabela "tags":

  • - id (unikalny identyfikator)
  • - name (nazwa tagu)

Tabela "articles":

  • - id (unikalny identyfikator)
  • - title (tytuł artykułu)
  • - content (treść artykułu)

Tabela "article_tags":

  • - article_id (klucz obcy do tabeli "articles")
  • - tag_id (klucz obcy do tabeli "tags")

Utwórz powyższe tabele i przejdź do następnej części.

Dodawanie tagów

Zakładam, że masz już formularz, przez który dodajesz artykuł. Trzeba będzie teraz dodać do niego dodatkowe pole tekstowe dla tagów np. o nazwie tags. Następnie trzeba stworzyć logikę dodawania tagów do artykułu. Logika dodawania tagów musi być zaimplementowana po logice dodawania artykułu, ponieważ musimy mieć ID dodawanego artykułu. Będzie to możliwe dopiero, kiedy zostanie on zapisany w bazie. Czyli, najpierw kod zapisujący artykuł w bazie danych, a następnie kod zapisujący tagi dla niego. Poniżej kod dodawania tagów:



function get_tag_id_by_name($tag) {

global $dbh;

$sth = $dbh->prepare('SELECT id FROM tags WHERE name = :tag LIMIT 1');

$sth->bindParam(':tag', $tag, PDO::PARAM_STR);

if($sth->execute()) {

if($row = $sth->fetch(PDO::FETCH_ASSOC)) {

return $row['id'];

}

else return false;

}

else return false;

}

function save_new_tag() {

global $dbh;

$sth = $dbh->prepare('INSERT INTO tags (name) VALUES (:tag)');

$sth->bindParam(':tag', $tag, PDO::PARAM_STR);

$sth->execute();

}

function save_relationship($article_id, $tag_id) {

global $dbh;

$sth = $dbh->prepare('INSERT INTO article_tags (article_id, tag_id) VALUES (:article_id, :tag_id)');

$sth->bindParam(':article_id', $article_id, PDO::PARAM_INT);
$sth->bindParam(':tag_id', $tag_id, PDO::PARAM_INT);

return $sth->execute();

}

$tags_str = trim($_POST['tags']);
$tags_str = htmlentities($tags);

$tags = explode('', $tags_str);

foreach($tags as $tag) {

if(!get_tag_id_by_name($tag)) {

save_new_tag($tag);

}

$tag_id = get_tag_id_by_name($tag);

save_relationship($article_id, $tag_id);

}

W powyższym przykładzie do operacji na bazie danych użyłem rozszerzenia PDO. Jeśli korzystasz z mysqli, zmodyfikuj odpowiednio ten kod. Pamiętaj, że powyższy kod wykonujemy dopiero po dodaniu artykułu, czyli jeśli mamy już jego ID. Najpierw sprawdzamy każdy tag, czy istnieje w bazie. Jeśli istnieje, przypisujemy jego ID do zmiennej $tag_id, w przeciwnym razie wykonujemy funkcję save_new_tag, która doda nowy tag do bazy. Jeśli mamy już ID tagu, możemy zapisać relację article_id = tag_id (funkcja save_relationship).

Komentarze

  1. Kultowy mechanizm tagów :) Fajnie wyjaśnione, troche mam tylko uwag do pehapa ale zakładam, że to dopiero początek przygody. Trzymam kciuki za rozwój no i może sie kiedyś spotkamy na jakims evencie !

    OdpowiedzUsuń

Prześlij komentarz

Dzięki za komentarz!

Popular

[C++] Jak obliczyć pole i obwód trapezu?

[HTML] Jak wyśrodkować tekst?

[PHP] Jak pobrać adres strony?