Autor Zpráva
Misho
Profil *
Mam problem z vyhladavanim..

Ide o vyhladavanie skladieb na stranke. Vyhladavanie funguje ale len od slova do slova..
Ja potrebujem aby si ten vyhladavac aj nieco domyslel - skratka tak ako funguje vyhladavanie aj na inych strankach..

Skladby su ulozene takto: interpret1, interpret2 - názov
Teda ak je viac interprétov je to oddelené ciarkov a ako nahle sa to tam nedodrzi a da sa tam napr. feat. (namiesto ciarky) tak to nefunguje a tiez musi byt dodrzana pomlcka..
Je to tam preto lebo interpréti aj nazov skladby sa davaju zvlast do koloniek - je to pri urcitych funkciach potrebne..

Preto neviem ako to spravit..
PostCC
Profil
Misho:
A ty skladby jsou takto uložené kde? V databázi? V souboru? Ve scriptu?
A hledání se provádí jak? Zadáním jména interpreta do textboxu formuláře?

Zkuste ukázat víc z existujícího řešení, myslím, že takhle tu nikdo žádný nápad z křišťálové koule nevyčaruje.
Misho
Profil *
Skladby su ulozene v databaze - mysql

Vyhladavanie si mozete vyskusat na www.mp3databaza.com - hore je formular (je k tomu navod - ale myslite ze ho niekto cita?)

Formular to odosle do sekcie skladby, kde sa vytvory zoznam vyhovujucich skladieb..

Databaza:
tabulky: interpret_1, interpret_2, interpret_3, nazev

Tu je vypis zo zoznamu skladieb.. Je tam aj to vyhladavanie aj ine.. P.S. skladby su strankovane po 25..

<?php
  include "autorize.php";  
 
  $od = $_GET['aktualni_stranka'];
  $aktualni_stranka = $_GET['aktualni_stranka'];

  if ($od == "") {
    $od = 0;
  }
  else
    $od -= 1;  
    
  if ($aktualni_stranka == "")
    $aktualni_stranka = 1;    
  
  
  $od = $od * 25;
  
  if ($_GET['find_mp3'] <> "") {
    
    $get_addres = "&find_mp3=" . $_GET['find_mp3']; 
    
    $find_nazev = $_GET['find_mp3'];
    
    // pokud byl zadán i název skladby
    if ($nazev_name = strstr($find_nazev,"-")) {
      
      $pocet_celkem = strlen($find_nazev);
      $pocet_nazev = strlen($nazev_name);
      
      $pocet = $pocet_celkem - $pocet_nazev;
      
      $find_nazev = substr($find_nazev, 0, $pocet);
      
      $nazev_name = Str_Replace ("-", "", $nazev_name);   
      
      if ($nazev_name[0] == " ")
        $nazev_name = substr($nazev_name,1);
      
      if ($find_nazev[$pocet] == "")
        $find_nazev = substr($find_nazev,0,-1);
      
      $nazev_and = "AND nazev LIKE '%$nazev_name%' ";
      
    }  
    else
      $nazev_and = "";
    
    // Pokud byla nalezena čárky, rozdělení zadaných titulů, zadání Where clausule
    if ($tmp_name = strstr($find_nazev,",")) {
        
      // Počet písmen
      $end = strlen($find_nazev);   
      $letters_count = 0;
      
      // Vypočítání písmen prvního vyhledávání
      for ($i=0;$i<=$end;$i++) {
         
        if ($find_nazev[$i] != ",") {
          $letters_count += 1;
        }
        else
          $i = $end + 1;    
      }
      
      $interpret_1 = substr($find_nazev,0,$letters_count);
      
      // Smazání čárky
      $tmp_name = substr($tmp_name,1);
      
      // Pokud je ještě třetí interpret..
      if (strstr($tmp_name,",")) {
        
        // Počet písmen
        $end = strlen($find_nazev);   
        $letters_count = 0;
        
        // Vypočítání písmen druhého vyhledávání
        for ($i=0;$i<=$end;$i++) {
         
          if ($tmp_name[$i] != ",") {
            $letters_count += 1;
          }
          else
            $i = $end + 1;    
        }
      
        $interpret_2 = substr($tmp_name,0,$letters_count); 
     
        // Nakonec vyřazení poslední čárky, získání posledního interpreta
        $tmp_name = strstr($tmp_name,",");
        
        $tmp_name = Str_Replace (",", "", $tmp_name);
      
        $interpret_3 = $tmp_name;
      }
      else {      
        $interpret_2 = $tmp_name;
               
      }
      
      if ($interpret_2[0] == " ")
        $interpret_2 = substr($interpret_2,1);
      if ($interpret_3[0] == " ")
        $interpret_3 = substr($interpret_3,1);
    
      // Vyhledávání, if interpret_1 = interpret_1, interpret_2 = interpret_2, interpret_3 = interpret 3 OR interpret_1 = interpret_2 ...
      $where = "AND (interpret_1 LIKE '%$interpret_1%' AND interpret_2 LIKE '%$interpret_2%' AND interpret_3 LIKE '%$interpret_3%' $nazev_and) " .
               "OR (interpret_1 LIKE '%$interpret_1%' AND interpret_2 LIKE '%$interpret_3%' AND interpret_3 LIKE '%$interpret_2%' $nazev_and) " .
               "OR (interpret_1 LIKE '%$interpret_2%' AND interpret_2 LIKE '%$interpret_1%' AND interpret_3 LIKE '%$interpret_3%' $nazev_and) " .
               "OR (interpret_1 LIKE '%$interpret_3%' AND interpret_2 LIKE '%$interpret_1%' AND interpret_3 LIKE '%$interpret_2%' $nazev_and) " .
               "OR (interpret_1 LIKE '%$interpret_2%' AND interpret_2 LIKE '%$interpret_3%' AND interpret_3 LIKE '%$interpret_1%' $nazev_and) " .
               "OR (interpret_1 LIKE '%$interpret_3%' AND interpret_2 LIKE '%$interpret_2%' AND interpret_3 LIKE '%$interpret_1%' $nazev_and) ";
    }
    else {                
      $where = "AND (nazev LIKE '%$find_nazev%' OR interpret_1 LIKE '%$find_nazev%' OR interpret_2 LIKE '%$find_nazev%' OR interpret_3 LIKE '%$find_nazev%') $nazev_and ";
    }   
  }
  else
    $where = "";
 
  $dotaz = "SELECT * FROM skladby WHERE typ = '1' $where ORDER BY id DESC LIMIT $od, 25";
  $vysledek_skladby = mysql_query($dotaz) or                                             
    die(mysql_error());
       
  $dotaz = "SELECT * FROM skladby WHERE typ = '1' $where ";
  $pocet = mysql_query($dotaz) or
    die(mysql_error());
    
  $pocet = mysql_num_rows($pocet);
  $pocet_stranek = $pocet/25;
  
  if (!is_int($pocet_stranek))
    $pocet_stranek += 1;   
?>


pod tymto je uz vypis skladieb a ten je nepodstatny v tomto pripade..
PostCC
Profil
Misho:
Přiznávám, že mne poněkud děsí už samotná konstrukce 3 tabulek pro interprety. Existuje nějaký důvod pro to, aby nebyli všichni v jedné tabulce? Pak by bylo vyhledávání snadné, ne?

Co když má skladba víc interpretů? Třeba Jackson's Five se vám do té struktury zjevně nevejdou.

Než hledat řešení pro špatný návrh databáze, navrhuji vydat se cestou sloučení interpretů do jediné tabulky - trváte-li na uchování vazby "Someone feat. someone", pak rozšířené např. o příznak MAIN/GUEST, případně Pořadí. Pak nebude záležet na pořadí, v jakém uživatel interpreta zadává a bude možné uvést neomezený počet interpretů. Navíc pak bude možné vyhledávat i bez znalosti interpreta nebo názvu skladby, což je ve vašem případě poněkud obskurně řešeno tím, že chci-li hledat pouze skladbu, musím zadat její název, uvozený pomlčkou.

Je možné tu strukturu překopat? Převod stávajících tabulek by neměl být takový problém.
Misho
Profil *
Co sa tyka tych interpretov.. Pri nazve staci udat tych hlavnych interpretov - takze 3 stacia uplne..

Takto je to rozdelene z toho dovodu ze v stranke so skladbou sa potom ukazuju dalsie skladby, od interpretov, takze to na tom zaklade vyhladavna - z kazdej tabulky..

Mne ide v prvom rade aby to vyhladavalo na 100%.. Ked sa zada "kesha" tak nech vyhlada aj "ke$ha" a nech to nevyhladava od slova do slova a ked tam bude jedina chybicka - aj v diakritike nevyhľadá to nic..
Alphard
Profil
Misho:
Mne ide v prvom rade aby to vyhladavalo na 100%
Proto má být databáze dobře navržená. Při špatném návrhu se některé věci dělají obtížně a některé vůbec udělat nejdou. Vy se vykašlete na analýzu, navrhnete to na blbě a doufáte, že na fóru někdo poradí :-)

Když vidím ve vašem scriptu tu sestavu where like od řádku 108, buďte si jistý, že to rychlé nebude.

Pro normální hledání lze použít fulltext.

Ked sa zada "kesha" tak nech vyhlada aj "ke$ha"
Tohle je obtížné a nepomůže ani soundex().
Misho
Profil *
Takze aby to bolo interpret - nazov
v tej kolonke interpret uz budu vsetci zadani..

Takze tak by to malo fungovat?? Po prerobeni..
To ke$ha nepojde na kesha - OK..
ale ked sa zada "keša - tik tok" tak to najde podla toho tik tok aj ked v databaze bude ulozena "kesha"

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: