Autor | Zpráva | ||
---|---|---|---|
creck Profil |
#1 · Zasláno: 28. 5. 2006, 00:07:52
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
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 |
#2 · Zasláno: 28. 5. 2006, 00:11:07
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 |
#3 · Zasláno: 28. 5. 2006, 00:18:03
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 |
#4 · Zasláno: 28. 5. 2006, 00:22:33
Tak nějak sem to myslel:
Teď to je zhruba takhle 1
- rozdělit na slova
- cyklus pro projetí všech slov {
- dotaz do db
-> jestli tam je - odkaz
}
Navrhuju to trochu zjdenodušit na 1
- 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 |
#5 · Zasláno: 28. 5. 2006, 00:24:59
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 |
#6 · Zasláno: 28. 5. 2006, 09:00:24
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. |
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0