Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Tagi na stronie
Forum PHP.pl > Forum > Przedszkole
Mareczko
Witam
Zamierzam zrobić sobie tagi na mojej stronie. Chciałbym się Was poradzić jak to rozwiązać. Mam 1 tabele z wszystkimi gdzie w 1 polu mam wpisywane tagi w postaci: tag1, tag2, tag3 itd. No i teraz zastanawiam się co dalej zrobić żeby później wyświetlić je w postaci chmury tagów na stronie.

Pozdrawiam
darko
explode na ", " i foreach na tablicy questionmark.gif
Mareczko
Dzięki, a jak pozbyć się dubli ? bo kilka wpisów może mieć takie same tagi wpisane.
darko
array_unique na utworzonej tablicy
Mareczko
Dzięki wielkie jeszcze raz. Już prawie sobie poradziłem
kod wygląda roboczo tak:
  1. <?php
  2. $keywords="tag1, tag1, tag2,tag3";
  3. $keywords=explode(',', $keywords);
  4. $keywords=array_unique($keywords);
  5. foreach($keywords as $i => $tag){
  6. print($tag.', ');
  7. }
  8. ?>


Teraz nie wiem gdzie tu upchać trim() bo 2 pierwsze tagi są takie same, a przez spację przed 2 wyświetlane są one jako 2 różne.
darko
Jeśli jako separator masz przecinek i spację pomiędzy poszczególnymi elementami, to - jak już napisałem w pierwszym poście - zrób explode na przecinku i spacji (", ")
piotrooo89
średnio elegancko to jest. ja polecam explode z samym przecinkiem (bez spacji) i później trim na każdym elemencie tablicy.
Mareczko
Problem rozwiązałem tak:
  1. $keywords=explode(',', $keywords);
  2. $keywords=array_map('trim', $keywords);
  3. $keywords=array_unique($keywords);


Inaczej raczej nie da się bo te tagi mogą być różne - ze spacją na początku ale i bez.

Mam teraz do Was trochę inne pytanie.
Moja koncepcja tagów raczej się nie sprawdzi - nie bardzo wiem jak rozwiązać to. Czy stworzyć nową tabelę z samymi tagami ? każdy rekord byłby innym tagiem - czy będzie to dobre rozwiązanie biorąc pod uwagę, że tych tagów może być znaczna ilość?
piotrooo89
Cytat(Mareczko @ 14.12.2009, 13:38:24 ) *
tych tagów może być znaczna ilość?


ile dla Ciebie to znaczna ilość? 100 000, 200 000, 1 000 000? bo jeśli tak to swobodnie możesz robić dla każdego tagi nowy rekord.
Mareczko
Myślę, że po jakimś czasie było by tego w setkach tysięcy. Przy takiej ilości rekordów jak najlepiej losować powiedzmy 5 rekordów ? ORDER BY RAND() ?
darko
order by rand() limit 5
?
Mareczko
Tak wiem, tylko chodzi mi o to czy w tabeli będzie 500 000 rekordów to order by rand() limit 5 będzie optymalne.
piotrooo89
na pewno 100% optymalności nie osiągniesz, lecz jest to powiedzmy dobre rozwiązanie.
darko
Będziesz miał chmurę tagów złożoną z 1000 000 pozycji? Może masz na myśli kilkaset stron, to wtedy dla każdego taga dajesz klucz obcy dla odpowiedniej strony i masz już jakoś znormalizowaną bazę.
Mareczko
Cytat(darko @ 14.12.2009, 14:04:49 ) *
Będziesz miał chmurę tagów złożoną z 1000 000 pozycji? Może masz na myśli kilkaset stron, to wtedy dla każdego taga dajesz klucz obcy dla odpowiedniej strony i masz już jakoś znormalizowaną bazę.

Nie bardzo rozumie o czym piszesz.
W chmurze tagów będę wyświetlał powiedzmy 5 losowych tagów z 500 000 zapisanych w bazie.
piotrooo89
możesz pokazywać 5 najczęściej używanych tagów.
phpion
Cytat(Mareczko @ 14.12.2009, 13:54:12 ) *
Tak wiem, tylko chodzi mi o to czy w tabeli będzie 500 000 rekordów to order by rand() limit 5 będzie optymalne.

Słuszna uwaga. Zdecydowanie lepiej (szczególnie w MyISAM) zrobić to trochę na okrętkę. Najpierw pobrać łączną liczbę rekordów do zmiennej w PHP (poprzez SELECT COUNT(*) FROM tabela - na MyISAM śmignie szybciutko). Potem w PHP wylosować liczbę od 0 do liczby rekordów z bazy pomniejszonej o liczbę rekordów do wyświetlenia (w Twoim przypadku 5) czyli $start = mt_rand(0, $count - 5). Dane wybrać zapytaniem SELECT ... LIMIT x,y gdzie x to wylosowana wcześniej liczba ($start), a y to narzucony limit (5). Niby 2 zapytania + losowanie w PHP, ale śmignie szybciej na dużej liczbie rekordów niż ORDER BY RAND() LIMIT 5.
darko
Można tak, jak pisałeś śmiało użyć order by rand() limit 5. Nie znam niczego bardziej optymalnego w tym przypadku (co nie znaczy, że to nie istnieje).

phpion - też o tym myślałem, ale zabrakło mi limit x,y Chciałem wyciągnąć dane po idkach, tyle że to działałoby dopiero w przypadku, jeśli byłaby zachowana kolejność idków.
piotrooo89
pion podał fajną rzecz. sprawdziłem i na postgresie order by random() na tabeli która ma dokładnie 504 432 rekordy i nie było jakiejś tragedii fajnie szybko się wyświetliło.
Mareczko
Dzięki wszystkim, mam nadzieje, że już sobie poradzę:)

Mam szybkie pytanie,
jak pozbyc sie dubli przy koncowym wyswietlaniu?
W tej chwili duble sa przesiewane tylko z konkretnego rekordu a jak to zamienic zeby usuwane byly biorac pod uwage wszystkie wyciagniete rekordy ?
  1. $sql = '
  2. SELECT item_keywords
  3. FROM items
  4. ';
  5. $result=mysql_query($sql);
  6. while($row=mysql_fetch_assoc($result)) {
  7. if($row['item_keywords']){
  8. $keywords=$row['item_keywords'];
  9. $keywords=explode(',', $keywords);
  10. $keywords=array_map('trim', $keywords);
  11. $keywords=array_unique($keywords);
  12.  
  13. foreach($keywords as $i => $tag){
  14. print $tag.', ';
  15. }
  16. }
  17. }


Nikt nie pomoże ? winksmiley.jpg
piotrooo89
distinct?
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.