28. oktober 2001 - 03:11Der er
22 kommentarer og 1 løsning
Søg i MySQL med PHP (ala google)
Jeg ved godt at dette emne har være oppe og vende en del gange efterhånden... jeg har også læst de fleste indlæg omkrig emnet her på siden. Men jeg bringer alligevel lige emnet på banen igen... :)
Jeg får fint forbindelse til MySQL og kan da også printe de ting ud jeg finder... jeg syntes bare ikke at min ultra primitive search engine fungere helt optimalt, den har de med at komme med nogle underlig resultater. (ala altalavista :) )
Jeg bruger følgende script til at søge i min database:
$resultat = mysql_query(\"SELECT * FROM knowledgedb WHERE emne or tekniker or omraade or note LIKE \'%$soeg%\'\");
hvis jeg erstatter \"emne or tekniker or omraade or note\" med \"*\" så får jeg følgende fejl: Warning: Supplied argument is not a valid MySQL result resource in /usr/local/apache/htdocs/atm/udskriv.php on line xx
Jeg er ude efter en \"search engine/script\" hvor jeg kan skrive flere flere ord i samme form, og bruge \"\" + - osv...
Jeg vil selvfølgelig helst selv lave/forstå det hele selv... men hvis der er en som ligger inde med et godt search script så vil jeg gerne smide et par 100 point efter det..
Med version 7 af TeamShare tager Lector næste skridt og bygger en platform for AI-agenter, der i højere grad kan følge medarbejderen gennem hele arbejdsprocessen.
$resultat = mysql_query(\"SELECT * FROM knowledgedb WHERE emne LIKE \'%$soeg%\' OR tekniker LIKE \'%$soeg%\' Or omraade LIKE \'%$soeg%\' OR note LIKE \'%$soeg%\'\");
Det med at kunne bruge \"\", +, - på søgeord .. der skal en avanceret SQL build rutine til .. det tvivler jeg på at du får nogle til at lave for point.
En generel regel for søgninger er at du skal bruge fulltext index\'es fremfor LIKE søgninger til det grundet rene performance spørgsmål samt fleksibilitet. Problemet pt. er, at mySQL \"kun\" har mulighed for at køre OR søgninger frem for AND, så helt godt er det ikke endnu, det kommer (jeg går ud fra du pr. default kender http://www.mysql.com/doc som manual).
Når vi så er \"tvunget\" til LIKE søgninger som her skal du til at lege lidt med patternmatching. Du skal bestemme om \"ET LILLE HUS\" skal søge på \"ET (AND) LILLE (AND) HUS\" eller \"ET (OR) LILLE (OR) HUS\" eller hvordan du vil have det... En stopword liste indeholdende for gennerelle ord som \"et, og, den, det\" osv. er god da en søgning på disse ord kan give alt for mange hits. Så er det tid til at sortere alle specialtegn fra, du ønsker jo ikke søgninger på * / - _ osv osv. så dem kan du udskifte med et [space] og senere splitte på denne. Tilbage har du fx. et array af søgeord samt +- foran dem... Udfra dem kan du lave en if ($pre == \'+\') type=AND (forståelseskode, ikke reel) og if ($pre == \'+\') type=NOT.
Så skulle du være ved at være der med en meget simpel søgemaskine. Implementeringen må du selv stå for, men der er et \"team af eksperter\" bag dig som sikkerhedsnet og som er villige til at guide dig igennem de tricky faser. Go for it mate, jeg tror ikke du finder meget der passer til dig uden at betale for det :)
OK.... det er også sjovere at lave det selv. Jeg har ikke brug for \"\", +, - osv... Hvordan skal jeg bygge det op hvis man skal kunne bruge flere ord i min \"soeg form\"? Er min søge streng helt håbløs?
til el_barto Jeg er kommet til at godkende svarene... Men du skal nok få nogle points hvis du hjæper mig.
Jeg har kigget lidt på din rutine, og jeg vil lige høre om jeg har forstået det korrekt. jeg kommer med mit input fra min form. f.eks. \"linux backup\" Alle de under lige tegn bliver fjener, og ordne bliver gemt i et Array som følgende variabler: $words1 og $words2 er det rigtigt? Hvordan kommer jeg så videre her fra? I øjeblikket bruger jeg jo denne totalt håbløse streng: resultat = mysql_query(\"SELECT * FROM knowledgedb WHERE emne LIKE \'%$soeg%\' OR tekniker LIKE \'%$soeg%\' Or omraade LIKE \'%$soeg%\' OR note LIKE \'%$soeg%\'\"); Min søgning fungere fakstik ok sådan som den er nu... jeg kan bare kun søger på et ord. (men det havde I jo allerede set.)
Lige et nyt kort spørgsmål: Når der ikke bliver fundet nogle resutater så får jeg bare en blank side. Hvad skal ændres for at jeg kan komme til at skrive f.eks søgningen gav intet resultat?
Mvh.
Asbjørn Morell
Synes godt om
Slettet bruger
28. oktober 2001 - 17:50#11
Den bliver måske lidt gumpetung, men hvis det ikke er vildt mange søgninger der foretages kan man måske leve med det..
Jeg kan se at jeg kom til at poste noget gammel kode...den rigtige (og lidt tilpassede) kommer her:
$soegeord = \"hus, hest, bil, båd\";
$betingelse = \"SELECT * FROM knowledgedb WHERE id > \'0\' AND (\";
$i = -1; do { ++$i; $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\' OR\";
} while ($tal-1 > $i); $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\')\";
echo $betingelse;
MHT blank side hvis der ingen resultater er så kører jeg med
if (!mysql_num_rows($betingelse)) { echo \"Intet fundet\"; }
Og hvad angår point er jeg ligeglad, da det er det at hjælpe der er sjovt :)
tak el_barto Du er en guttermand! Jeg skal lige have noget aftensmad.. og så vil jeg tæste din rutine.. det gør ikke noget om den er en smule langsom, da der max vil være 50 søgninger om dagen.
Jeg har lige være i gang med rutinen... det ser ud til at virke: SELECT * FROM knowledgedb WHERE id > \'0\' AND ( emne LIKE \'%linux%\' OR tekniker LIKE \'%linux%\' OR omraade LIKE \'%linux%\' OR note LIKE \'%linux%\' OR emne LIKE \'%atm%\' OR tekniker LIKE \'%atm%\' OR omraade LIKE \'%atm%\' OR note LIKE \'%atm%\' OR emne LIKE \'%atm%\' OR tekniker LIKE \'%atm%\' OR omraade LIKE \'%atm%\' OR note LIKE \'%atm%\') Warning: Supplied argument is not a valid MySQL result resource in /usr/local/apache/htdocs/atm/udskriv.php on line 37 Intet fundet Warning: Supplied argument is not a valid MySQL result resource in /usr/local/apache/htdocs/atm/udskriv.php on line 53
Her har jeg søgt på \"linux atm\". Men der er noget der går galt når jeg prøver på at trække resutatet ud af tabellen... jeg bruger føgende runtine:
while ($raekke = mysql_fetch_array($betingelse)) { extract($raekke); tabel_standard();
}
hvad der det lige der går galt? tabel_standard() er bare en html tabel i en function med globale variabler... (det virkede med min gamle \"engine\")
Mvh.
Asbjørn Morell
Synes godt om
Slettet bruger
28. oktober 2001 - 18:58#14
Der må stå noget i den funktion der hedder extract() som er defineret et eller andet sted...
en simpel udtrækning ser således ud:
$query = mysql_query(\"$betingelse order by id asc) or die(mysql_error());
if (!mysql_num_rows($query)) { echo \"Intet fundet.\"; }
while($row = mysql_fetch_array($query)){ $sql = \"SELECT * FROM knowledgedb WHERE id = \'$row[id]\'\"; $result = mysql_query($sql); $row = mysql_fetch_array($result);
sådan ser det ud når det virker (med den gamle kode)
$resultat = mysql_query(\"SELECT * FROM knowledgedb WHERE emne LIKE \'%$soeg%\' OR tekniker LIKE \'%$soeg%\' Or omraade LIKE \'%$soeg%\' OR note LIKE \'%$soeg%\'\"
while ($raekke = mysql_fetch_array($resultat)) { extract($raekke); tabel_standard();
}
Jeg bruger webcafe MySQL function\'s... (alle starter vel i det små...):
$i = -1; do { ++$i; $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\' OR\";
} while ($tal-1 > $i); $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\')\";
$query = mysql_query(\"$betingelse order by id asc) or die(mysql_error());
if (!mysql_num_rows($query)) { echo \"Intet fundet.\"; }
while($row = mysql_fetch_array($query)){ $sql = \"SELECT * FROM knowledgedb WHERE id = \'$row[id]\'\"; $result = mysql_query($sql); $row = mysql_fetch_array($result);
$i = -1; do { ++$i; $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\' OR\";
} while ($tal-1 > $i); $betingelse = \"$betingelse emne LIKE \'%$words[$i]%\' OR tekniker LIKE \'%$words[$i]%\' OR omraade LIKE \'%$words[$i]%\' OR note LIKE \'%$words[$i]%\')\";
$query = mysql_query(\"$betingelse order by id asc) or die(mysql_error());
if (!mysql_num_rows($query)) { echo \"Intet fundet.\"; }
while($row = mysql_fetch_array($query)){ $sql = \"SELECT * FROM knowledgedb WHERE id = \'$row[id]\'\"; $result = mysql_query($sql); $row = mysql_fetch_array($result);
Ok... det virker nu :) I min gamle tabel function brugte jeg følgende kommando til at erlære nogle globale variabler:
global $tekniker, $emne, $note, $omraade;
Men det virker ikke med det nye Array... hvad skal ændres? jeg har prøvet med: global $row[tekniker], $row[emne], $row[note], $row[omraade]; men dette giver følgende fejl: Parse error: parse error, expecting `\',\'\' or `\';\'\' in /usr/local/apache/htdocs/htm.php on line 6
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.