Autor Zpráva
creck
Profil
udelal jsem si jednu funkci, ktera v textu najde slovo a kdyz toto slovo je i v DB tak z neho udela odkaz, problem je ale v tom, ze kdyz je text prilis dlouhy odesila strasne mnoznstvi dotazu a tak silene zatezuje DB a jeste k tomu, kdyz je v DB hodne zaznamu tak to je dalsi zatez na cely script a dlouho to nacita, potreboval bych poradit jak to udelat jednoduseji.

1
2function odkaz_psa($text) {
3  
4  // rozdelime text na pole
5  $textA = array();
6  $textA = split(' ', $text);
7  $text = '';
8  
9  // prochazime jednotliva slova
10  for($i=0; $i<=count($textA); $i++) {
11    
12    // vybereme jmena z dataabze
13    $db_result = DBdotaz('SELECT id, jmeno FROM dogs');
14    while($db_row = DBpole($db_result)) {
15      
16      // rozdelime jmeno na pole
17      $jmeno = stripslashes($db_row['jmeno']);
18      $jmenoA = array();
19      $jmenoA = split(' ', $jmeno);
20      $jmeno = '';
21      
22      // seskupime jmeno bez mezer
23      for($a=0; $a<=count($jmenoA); $a++) {
24        $jmeno .= $jmenoA[$a];
25      }
26      
27      // pokud se slovo rovna jmenu, bude tucne
28      if($textA[$i]==strtolower($jmeno) || $textA[$i]==strtoupper($jmeno)) {
29        $textA[$i] = '<a class="blue" href="javascript:dog(\'' . $db_row['id'] . '\');" title="' . STRANKA_PSA . ' - ' . strtoupper($db_row['jmeno']) . '"><b>' . $db_row['jmeno'] . '</b></a>';
30      }
31    }
32    
33    // seskupime text
34    $text .= ' ' . $textA[$i];
35  }
36  
37  // vratime text
38  return stripslashes(trim($text));
39}

function odkaz_psa($text) {
  
  // rozdelime text na pole
  $textA array();
  $textA split(' '$text);
  $text '';
  
  // prochazime jednotliva slova
  for($i=0$i<=count($textA); $i++) {
    
    // vybereme jmena z dataabze
    $db_result = DBdotaz('SELECT id, jmeno FROM dogs');
    while($db_row = DBpole($db_result)) {
      
      // rozdelime jmeno na pole
      $jmeno stripslashes($db_row['jmeno']);
      $jmenoA array();
      $jmenoA split(' '$jmeno);
      $jmeno '';
      
      // seskupime jmeno bez mezer
      for($a=0$a<=count($jmenoA); $a++) {
        $jmeno .= $jmenoA[$a];
      }
      
      // pokud se slovo rovna jmenu, bude tucne
      if($textA[$i]==strtolower($jmeno) || $textA[$i]==strtoupper($jmeno)) {
        $textA[$i] = '<a class="blue" href="javascript:dog(\'' . $db_row['id'] . '\');" title="' . STRANKA_PSA . ' - ' . strtoupper($db_row['jmeno']) . '"><b>' . $db_row['jmeno'] . '</b></a>';
      }
    }
    
    // seskupime text
    $text .= ' ' . $textA[$i];
  }
  
  // vratime text
  return stripslashes(trim($text));
}
koudi
Profil
Moc sem to nečet, ale nebylo by třeba jednodušší načíst všechna slova do db a pak pouze porovnávat při projíždění toho cyklu (místo nového db dotazu)?
creck
Profil
koudi
myslim ze se nechapeme ... v DB mam nejake zaznamy (jmena). Uzivatel kdyz napise nejaky text a prida jej do DB. Pri naslednem vypisovani tohoto textu mi ma funkce projet vsechna slova a pokud je dane slovo v DB kde jsou jmena tak z toho jmena udela odkaz.
koudi
Profil
Tak nějak sem to myslel:

Teď to je zhruba takhle
1
2 - rozdělit na slova
3 - cyklus pro projetí všech slov {
4     - dotaz do db
5      -> jestli tam je - odkaz
6  }

 - rozdělit na slova
 - cyklus pro projetí všech slov {
     - dotaz do db
      -> jestli tam je - odkaz
  }


Navrhuju to trochu zjdenodušit na


1
2- dotaz do db 
3- načtení všech jmen do pole
4- cyklus pro projetí všech slov {
5    - jestli je slovo v poli z databáze -> nahradit
6  }

- dotaz do db 
- načtení všech jmen do pole
- cyklus pro projetí všech slov {
    - jestli je slovo v poli z databáze -> nahradit
  }



odpadá tím to obrovské množství dotazů do db.
koudi
Profil
Ještě mě napadlo, že by pak šla použít fce array_intersect pro nalezení průniku polí, což je hledaný výsledek a z toho pole to až vše nahradit
Retal
Profil
Určitě změň algoritmus na ten, který navrhuje koudi, tj. načíst všechny rasy / jména psů do pole. Potom bych osobně sáhnul k regexpům. Konkrétně preg_replace() přijímá první argument i jako pole, takže mu můžeš předhodit celý výsledek z databáze.

Uvažoval bych také o nějaké formě cachování, ať už psů nebo celých výsledků.

A do třetice: Co to je za šílený odkaz

<a class="blue" href="javascript:dog(...);"><b>...</b></a>
<a class="blue" href="javascript:dog(...);"><b>...</b></a>


Proč ten javascript?! Odstraňuješ účinně všechny vyhledávače.
Proč element <b>? Vždyť vzhled můžeš definovat přes CSS.
Proč strtoupper? Písmo můžeš taktéž kapitalizovat přes CSS.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0