Zdravím nevíte jak udělat když mám řetězec "Ročníková práce z ekonomiky na OAML" a člověk dá vyhledat jenom ročníková práce OAML aby mu to naslo? Jsem si jistý že to jde, ale opravdu si s tím nevím rady...
v php je to preg_match(), v sql sloupec like '%hledany text%'
Jo, jasne to preg_match() prave ze pouzivam, ale najde to pouze pokud je cely retezec stejny, ale ja pottebuju aby to vyfiltrovalo jenom vyrazy ktere maji schodna slova tkaze jenom tam kde je "ročníková práce OAML". A to mi z výrazu "Ročníkvoá práce z ekonomika na OAML" nevyhodí že to obsahuje. A když se mi povedlo to nejak aby to hledalo v celem, tak to zobrazilo vsechno kde bylo slovo "ročníková" a slovo "práce" a slovo "OAML". A já potřebuji jenom tam kde je to všechno najednou.
A táák, no v PHP to půjde akorát na vícekrát a v SQL by se možná dalo použít fulltextové vyhledávání, ale s tím mám nulové zkušenosti.
A co znamena na vicekrat?
Na vícekrát jako že si slova naházíš třeba do pole pomocí explode(' ', $slova) a pak pomocí foreach prohledáš řetězec několikrát s každým ze slov, a když tam budou všechny, tak je to ono. V databázi pak třeba když není k dispozici fulltext tak LIKE '%slovo1%' AND LIKE '%slovo2%' ... AND LIKE '%slovoN%'.
a mohl bys mi to tu nejak priblizne napsat... snazil jsem se neco vymyslet, ale nejak mi to nejde.. :(
Řekněme že máš na stránkách input s názvem "slovo" kam se zadává hledané slovo (hledaná slova).
$slovo = addslashes(trim($_POST['slovo'])); //odstraním mezery na začátku a na konci, olomítkuju "nebezpečné znaky"
if(!empty($slovo)){ //když uživatel něco zadal
$slova = explode(' ', $slovo); //naházím do pole rozdělené po mezerách
$poprve = true; //potřebuju vědět jestli je to první slovo, kvůli přidávání AND
foreach($slova as $slovo){
if($poprve === true){
$sql = 'SELECT sloupec1, sloupec2 FROM tabulka WHERE text LIKE "%'.$slovo.'%" '; //zadám začátek dotazu, doplň si názvy sloupců a tabulku
}else{
$sql .= ' AND text LIKE "%'.$slovo.'%" '; //přidám další slovo do podmínky
}
}
//teď můžu přidat na konec dotazu ještě další podmínky,...
}
No, snad je to ono, dpolň si správný názvy položek v DB a proměnné z formuláře.
2funous: Vdaka ti velmi pekne, prave si mi totizto usetril par hodin casu, skusania a nervov :-)))))
jenom je skoda, ze ja jsem to chtel prave tim foreach, nepouzivam databaze... :(
$slovo = addslashes(trim($_POST['slovo'])); //odstraním mezery na začátku a na konci, olomítkuju "nebezpečné znaky"
if(!empty($slovo)){ //když uživatel něco zadal
$slova = explode(' ', $slovo); //naházím do pole rozdělené po mezerách
$nenalezeno = false;
while(){ //nejaky cyklus na prochazeni vsech souboru ve kterych se ma hledat
foreach($slova as $slovo){
if(strstr($obsah_souboru, $slovo) === false){ //slovo v obsahu souboru není
$nenalezeno = true;
break; //vylezu z cyklu, je jasné že některé ze slov v souboru není, proto ho nedám do výsledků
}
}
if($nenalezeno === false){
//soubor obsahuje všechny slova, takže tady může být cokoli, prostě se jedná o hledaný soubor
}
}
}
Snad je to ono :)
No, tak ten skriptík nad tímhle se mi rozchodit nepodařilo. Já používám tenhle. Není tu někdo, kdo by byl ochoten to nějak zkombinovat. Prosím. Jsem vážně zoufalý!
<?
$findme=str_replace(" ","|",$findme);
$findme=strtr($findme,"áäčďéěëíňóöřšťúůüýžÁÄČĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽ","aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ");
$findme=strtolower($findme);
$handle=opendir('files/data');
while (false!==($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$array[]=$file; } }
closedir($handle);
$count=count($array);
if(!IsSet($skip) or $skip<0) {
$skip=0; }
if(!IsSet($to)) {
$to=$skip+1000; }
if(($skip+1000)>$count) {
$to=$count; }
print "Hledané výrazy <b>\"$findme\"</b> obsahují tyto položky: <font color=gray>(Pokud se Vám zobrazilo příliš mnoho údajů, zkuste zadat výraz s méně slovy a popřípadě je zkuste zadat i v jiném pádě.)</font> | <a href=?url=files/index.php>[Hledat znova?!]</a><br>";
print "<hr size=2 color=#990000>";
for($i=$skip;$i<$to;$i++) {
if($i<999) {
$num="0".($i+1); }
else {
$num=$i+1; }
$file_open=file("files/popisky/".$array[$i].".txt"); //soubor s popisem souboru
$file_open[0]=str_replace(" ","_",$file_open[0]);
$file_open[0]=strtr($file_open[0],"áäčďéěëíňóöřšťúůüýžÁÄČĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽ","aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ");
$file_open[0]=strtolower($file_open[0]);
if (preg_match ("/$findme/i", "$file_open[0] && $array[$i]")): // hleda v popisku i v nazvu souboru
?>
<b>Název souboru:</b> <? echo $array[$i]; ?><br><a href=files/download.php?get=<? echo $array[$i]; ?>>Download »</a> | Počet stáhnutí: <b><? include("counters/$array[$i].txt"); ?></b>
| Velikost souboru: <b><?
$size=filesize("files/data/$array[$i]");
echo "".round($size/1024, 0)." kB";
?></b><br>
<b>Popis souboru:</b> <? include ("popisky/$array[$i].txt"); ?>
<hr size="2" color="#990000">
<? else: ?>
<? endif; ?>
<? } ?>
V žádném jiném souboru nebyl řetězec <b>"<? echo $findme; ?>"</b> nalezen. Zkuste štěstí znovu s jiným klíčovým slovem.<hr size="2" color="#990000">
Díky moc...
Kdyžtak mi prosím písněte na můj mail. Budu vděčný.
to marek, funous:
proc foreach? detekci zda retezec obsahuje definovana slova lze snadno provest v ramci jednoho regularniho vyrazu...
to goshoom a muzes mi tedy rict jakym? prosim...
goshoom: imgo je forach rychlejsi... Ostatne, na sestaveni toho regularniho vyrazu bys musel taky projet ta zadana slova,...
je sice pekny tohle vsechno tady co tu rikate, ale jako porad se mi to nedari dat nejak dohromady... :(
funous: ano, musel, pokud ovsem rozparsujes vstupni retezec do pole - coz neni nezbytne nutne. muzes sestavit vyraz pouze na zaklade vstupu (jinym regularnim vyrazem). ale uznavam, ze to neni jednodussi reseni...
:( zadna pomoc... jenom diskuze jak na to... :(
soky666: No, me nenapada jak to udelat pres regexp. Ja sem svoje reseni popsal,... Jestli goshoom vi, at povi :)
no... tak tady uz mi asik nikdo nepomuze... pujdu hledat jinam... ale i tak diky...