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.


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

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


Navrhuju to trochu zjdenodušit na



- 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>


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.