Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Podobne tagi z mysql
Forum PHP.pl > Forum > Przedszkole
doknes
Hej, mam stronę z anime(serialami) i chcę by na stronie z anime pojawiały się na dole anime podobne. Chce by podobizna tych anime była określana przez gatunek danego anime. Gatunek danego anime pobieram z mysql'a jako jedną zmienną. To co pobieram z bazy wygląda mniej więcej tak: "Fantasy, Komedia, Romans, Sci-Fi" lub po prostu zobaczcie na zdjęciu http://prntscr.com/685cov

Na innym angielskim forum (chyba każdy sie może domyślić jakim) polecono mi bym zrobił coś takiego:
  1. $sql = "SELECT * FROM odc_ListaAnime WHERE gatunek like '%$gatunki%'";
  2. $result = $conn->query($sql);
  3.  
  4. if ($result->num_rows > 0) {
  5. // output data of each row
  6. while ($row = $result->fetch_assoc()) {
  7. $maxodc = $row['maxodc'];
  8. $anime = $row['nazwa'];
  9. echo $anime."<br>";
  10. }
  11. } else {
  12. // echo "<h1> ERROR 404 </h1>";
  13. }
  14. $conn->close();
  15. }


No, ale ma to nie fajny efekt bo pokazuje tylko te anime, które mają idealnie ten sam ciąg liter (tych samych zdań w tej samej kolejności) i w tym to samo anime, a ja chce by wyszukiwało top 3 inne, które mają najbardziej podobne gatunki.



blahy
jezeli te nazwy kategorii sa zazwyczaj takie same, to mozesz je pobrac, zrobic explode zeby miec array szukanych kategorii i wtedy zbudowac zapytanie.
zakladajac ze szukasz podobnych seriali do 'gra o tron', ktora ma kategorie: 'fantastyka, dobry, serial' robisz:
  1. SELECT
  2. nazwa,
  3.  
  4. IF (gatunki LIKE '%fantastyka%', 1, 0)+
  5. IF (gatunki LIKE '%dobry%', 1, 0)+
  6. IF (gatunki LIKE '%serial%', 1, 0)
  7. AS kategorie
  8.  
  9. FROM `test`
  10. WHERE nazwa !='gra o tron'
  11. HAVING kategorie > 0
  12. ORDER BY kategorie DESC
  13. LIMIT 3

to 2 pole w selectcie bedzie sie skladac z dynamicznej ilosci ifow (foreach na tych kategoriach). zwroci ile kategorii kazdy rekord ma wspolnych z szukanym.
where usunie aktualny serial,
having usunie seriale, z ktorymi nie ma ani jednej wspolnej kategorii
order zwroci w pierwszej kolejnosci te, ktore maja najwiecej wspolnych kategorii
i limit na tyle ile chcesz dostac podobnych.

wtedy juz kolejnosc nie ma znaczenia
doknes

Problem w tym, że każdy serial może mieć zupełnie inne gatunki od tych, które ja tam wpisze domyślnie (bo strony z serialami są dynamiczne) i
w takim przypadku musiałbym tam wpisać wszystkie gatunki co by mi wyświetlało wszystkie anime co do niczego mnie nie prowadzi. Bo np, jedno jest TYLKO z gatunku mecha i SciFic to wtedy nie wyświetli nic mimo tego, że są anime, które są z tego samego gatunku :/


Masz takie "Live Demo" Jak to wygląda
http://www.anime.maneku.pl/index.php?str=a...TERRA%20FORMARS
http://www.anime.maneku.pl/index.php?str=a...e=Golden%20Time
pod listą odcinków

blahy
nie wpisujesz ich tam do zapytania na sztywno. pobierasz je z programu, do ktorego chcesz pobrac podobne. ta czesc zapytania jest dynamiczna (dla kazdego programu inna).

  1. $kategorieProgramu = // pobierasz gdzies z bazy, albo obiektu programu
  2. $kategorieProgramu = explode(',', $kategorieProgramu);
  3.  
  4. $sql = 'SELECT nazwa,';
  5. $ifs = [];
  6. foreach ($kategorieProgramu as $kategoria) {
  7. $ifs[] = "IF (gatunki LIKE '%". trim($kategoria) , "%', 1, 0)";
  8. }
  9.  
  10. $sql .= implode('+', $ifs) . 'AS kategorie';
  11.  
  12. $sql .= " FROM `test`
  13. WHERE nazwa !='gra o tron'
  14. HAVING kategorie > 0
  15. ORDER BY kategorie DESC
  16. LIMIT 3";

To juz pseudokod z glowy.

Dla innego programu bedziesz mial dynamicznie wygenerowane inne zapytanie.
doknes
Nie umiem sobie poradzić z tym kodem co mi dałeś...
Mam tak:
  1. require("connmysql.php");
  2. if ($f == "podobne") {
  3. $kategorieProgramu = $string;
  4. $kategorieProgramu = explode(', ', $kategorieProgramu);
  5.  
  6. $sql = 'SELECT odc_ListaAnime';
  7. $ifs = [];
  8. foreach ($kategorieProgramu as $kategoria) {
  9. $ifs[] = "IF (gatunek LIKE '%" . trim($kategoria) . "%', 1, 0)";
  10. }
  11.  
  12. $sql .= implode('+', $ifs) . 'AS gatunek';
  13.  
  14. $sql .= " FROM odc_ListaAnime
  15. HAVING gatunek > 0
  16. ORDER BY gatunek DESC
  17. LIMIT 3";
  18. $result = $conn->query($sql);
  19. if ($result->num_rows > 0) {
  20. // output data of each row
  21. while ($row = $result->fetch_assoc()) {
  22. $maxodc = $row['maxodc'];
  23. $anime = $row['nazwa'];
  24. if(getLA("lodc", $anime) == $maxodc){
  25. }else{
  26. echo "- <a href='index.php?str=anime&anime=$anime'>$anime</a><br>";
  27. }
  28. }
  29. } else {
  30. echo "<h1> ERROR 404 </h1>";
  31. }
  32. $conn->close();
  33.  
  34. }


a na stronie wyskakuje mi
Notice: Trying to get property of non-object in /home/chumorekgn/www/maneku/get.php on line 301
ERROR 404
in5ane
Napisz, która linia to linia 301.
doknes
"if ($result->num_rows > 0) {"

Czyli linijka 19 w kodzie, który podałem
blahy
pewnie tutaj: $result->num_rows masz false jako result, bo zapytanie jest niepoprawne.
zrob sobie var_dump z $sql zanim go wykonasz, przekej do myadmina, czy czego tam uzywasz i popraw az zacznie dzialac.

pierwsze co widze to $sql = 'SELECT odc_ListaAnime'; nie masz tam na koncu przecinka
doknes
No i wyszło mi coś takiego
  1. string(173) "SELECT odc_ListaAnime;IF (gatunek LIKE '%Komedia%', 1, 0)+IF (gatunek LIKE '%Romans%', 1, 0)AS gatunekFROM odc_ListaAnime HAVING gatunek > 0 ORDER BY gatunek DESC LIMIT 3"
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.