Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Wyszukiwarka po tagach
Forum PHP.pl > Forum > PHP
trciap
Witam,
jestem nowy więc przepraszam za wszystkie błędy jakie popełnię na forum.

chodzi o to, że mam problem z tagami.

w moim skrypcie z filmikami,
przy każdym dodaniu filmu to z tytułu i opisu tworzą się tagi i dodają do mysql.

tabele wyglądają następująco

'tags'
id name
1 jakis
2 tag
3 inny
4 tag

itd.

oraz druga tabela

tag_film
id id_filmu id_tagu
1 15 15,16,17,18,19,
itd.

teraz jak mógł


jak wyświetlić wszystkie filmy np. które zawierają taga np. 'lol' ?

myślałem coś w stylu,

wpisana fraza->szukamy takiego taga,bierzemy jego id->id tego taga szukamy w tablei 'tag_film' i porównujemy z tymi w 'id_tagu'->później bierzemy id_filmu i wyświetlamy filmy o takim tagu
ddiceman
1. najpierw pobierasz id tagu
  1. 'SELECT id FROM tags WHERE name = "lol";'

2. to id zapisujesz do zmiennej [i]$id[/id] i uzywasz w kolejnym zapytaniu
  1. 'SELECT id_filmu FROM tag_film WHERE id_tagu LIKE "'.$id.'%" OR id_tagu LIKE "%,'.$id.',%" OR id_tagu LIKE "%,'.$id.'" OR id_tagu = "'.$id.'";

3. zauwazasz, ze to dziala, ale koszmarnie wolno, wiec wywalasz swoja strukture i przerabiasz ja na 3 tabele:
Kod
tags (id[int], nazwa[varchar]) {nazwa - unique}
films (id[int], nazwa[varchar]....)
tag_to_film(id[int], id_tagu[int], id_filmu[int]); {para id_tagu, id_filmu - unique}

i robisz 2 proste zapytania:
  1. SELECT id FROM tags WHERE nazwa = 'lol';

  1. SELECT id_filmu FROM tag_to_film WHERE id_tagu = '$id';
trciap
nie za bardo wiem co zrobić z tym

  1. <?php
  2. tags (id[int], nazwa[varchar]) {nazwa - unique}
  3. films (id[int], nazwa[varchar]....)
  4. tag_to_film(id[int], id_tagu[int], id_filmu[int]); {para id_tagu, id_filmu - unique}
  5. ?>


  1. <?php
  2. $sql = 'SELECT id FROM tags WHERE name = "lol";' ;
  3. $query_fetch = mysql_fetch_assoc(mysql_query($sql));
  4.  
  5. $id = $query_fetch['id'];
  6.  
  7. $sql_2 = 'SELECT id_filmu FROM tag_film WHERE id_tagu LIKE "'.$id.'%" OR id_tagu LIKE "%,'.$id.',%" OR id_tagu LIKE "%,'.$id.'" OR id_tagu = "'.$id;
  8. $query_fetch_2 = mysql_fetch_assoc(mysql_query($sql_2));
  9.  
  10. tags (id[int], nazwa[varchar]) {nazwa - unique}
  11. films (id[int], nazwa[varchar]....)
  12. tag_to_film(id[int], id_tagu[int], id_filmu[int]); {para id_tagu, id_filmu - unique}
  13.  
  14.  
  15. $sql_3 = "SELECT id FROM tags WHERE nazwa = 'lol'";
  16. $query_fetch_3 = mysql_fetch_assoc(mysql_query($sql_3));
  17.  
  18. $sql_4 = "SELECT id_filmu FROM tag_film WHERE id_tagu = '$id'";
  19. $query_fetch_4 = mysql_fetch_assoc(mysql_query($sql_4));
  20.  
  21. echo "<pre>";
  22. print_r($query_fetch_4);
  23. echo "</pre>";
  24. ?>



mam takie pytanie czy tam w tabeli
id_tagu to rekord może być "10,11,12" itp. ?

dzięki za pomoc
ddiceman
Przekleje tu to, co Ci odpisalem w PW, bo moze sie komus przyda:
Cytat
Witam mógłbyś mi pomóc z tą wyszukiwarką po tagach, bo jest to ostatnia rzecz jaką robię praktycznie w skrypcie, i już kurde nie wiem jak za bardzo to zrobić,

tzn. gdzie to mam użyć ?

  1. <?php
  2. tags (id[int], nazwa[varchar]) {nazwa - unique}
  3. films (id[int], nazwa[varchar]....)
  4. tag_to_film(id[int], id_tagu[int], id_filmu[int]); {para id_tagu, id_filmu - unique}
  5. ?>

stworzyc takie tabele w bazie danych. fachowo, to się nazywa "relacją M do N". w bazie danych (mysql?) tworzysz sobie tabele z tagami (zawierająca tylko id i nazwę tagu), swoją tabele z filmami zostawiasz jaką masz, ale usuwasz z niej pole id_tagu, co mialeś no i zamiast tego pola tworzysz trzecią tabelę z parami id_tagu-id_filmu.
w rezultacie otrzymujesz coś na kształt:
tagi:
Kod

id | nazwa
...
61 | lol
62 | wojna
...

filmy:
Kod

id | nazwa | jakies kolejne pola
...
25 | film wojenny
26 | komedia wojenna
...

tagi do filmow:
Kod
id | id_filmu | id_tagu
1  | 25       | 62
2  | 26       | 61
3  | 26       | 62

ostatnia tabela mowi Ci, ze do filmu 25 pasuje tylko tag 62 a do filmu 26 pasuja tagi 61 i 62
Fifi209
Prosto mówiąc relacja jeden do wielu:

Masz id filmu i z tagów po id filmu wyciągasz wszystkie tagi.

Kolega dobrze Ci radzi.
ddiceman
fifi209: wlasnie, ze relacja 'wiele do wielu' (M do N) - moze byc wiele filmow z tym samym tagiem i kazdy z filmow moze miec wiele tagow
trciap
no to tak miałem,tylko jak mam teraz problem

jak zrobić aby tagi się nie powtarzały ?

u mnie biorą się z tytułu i opisu filmu,

ale jak juz taki tag istnieje to kicha będzie nastepny.. i przez to wyszukiwarka wyszuka tylko 1 film
ddiceman
klucz unique na kolumne z nazwa tagu w tabeli z tagami
  1. ALTER TABLE tagi ADD UNIQUE(nazwa)

a pozniej
  1. <?php
  2. $id_tagow = array(); // tablica na idki tagow - zarowno nowych jak i wczesniej dodanych
  3. $tagi_ktore_juz_sa = array();
  4. foreach($tags as $nazwa_tagu){ // wszystkie proponowane tagi
  5.   $result = mysql_query('INSERT INTO tagi (nazwa) VALUES ("'.$nazwa_tagu.'");'); // jezeli jest zalozony klucz unique na to pole to zwrocony zostanie blad
  6.   if($result){ // udalo sie dodac - tagu jeszcze nie bylo
  7.       $id_tagow[] = mysql_insert_id(); // ostatni id -> id tagu
  8.   }
  9.   else{
  10.       $tagi_ktore_juz_sa[] = '"'.$nazwa_tagu.'"'; // lista tagow, ktorych nie udalo sie dodac, bo juz byly
  11.   }
  12. }
  13. if(count($tagi_ktore_juz_sa) > 0){ // jezeli sa jakies, ktorych nie udalo sie dodac, to trzeba pobrac ich ID
  14.    $result = mysql_query('SELECT id FROM tagi WHERE nazwa IN ('.implode(',', $tagi_ktore_juz_sa).');');
  15.    while($row = mysql_fetchrow($result)){
  16.        $id_tagow[] = $row['id']; // dodajemy do tablicy z id tagow te tagi, ktore juz byly wczesniej
  17.    }
  18. }
  19. if(count($id_tagow) > 0){
  20.    $query = 'INSERT INTO tagi_to_filmy (id_tagu, id_filmu) VALUES ';  // na koniec zapis w tabeli relacji M do N
  21.    foreach($id_tagow as &$id_tagu){
  22.       $id_tagu = '('.$id_tagu.', '.$nowe_id_filmu.')';
  23.    }
  24.    unset($id_tagu);
  25.    $query .= implode(',', $id_tagow);
  26.    mysql_query($query);
  27. }
  28. ?>

(moga byc bledy bo pisane z palca)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.