Jeg har lave en fin lille soegefunktion, men der er et problem. Problemet er at soegefunktionen laver match i ordene dvs. at den deler ordene op, saa 'er' pludselig giver resultat paa 'geografiker'. Jeg vil gerne have at den sammenligner hele ord, og ikke deler ordene op paa den maade.
Kode:
<?php if(!empty($_POST['sSearch'])) {
$search_org = mysql_escape_string(strtolower($_POST['sSearch'])); $search = " ".$search_org; $search_titel = "LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search)."%'"; $search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search)."%'"; $search_kode = "LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search)."%'"; $query = mysql_query("SELECT * FROM koder WHERE $search_titel OR $search_beskrivelse OR $search_kode AND Godkendt = 'Y'") or die(mysql_error()); $maxCount = 0; $result = array();
Din query-string ser således ud hvis jeg har forstået det rigtigt :) ->
SELECT * FROM koder WHERE LOWER(Titel) LIKE '%%' OR LOWER(Titel) LIKE '%src_ord%' OR LOWER(Beskrivelse) LIKE '%%' OR LOWER(Beskrivelse) LIKE '%src_ord%' OR LOWER(Kode) LIKE '%%' OR LOWER(Kode) LIKE '%src_ord%' AND Godkendt = 'Y'
Jeg er ikke helt med på hvad LIKE '%%' gør men burde LIKE '%src_ord%' ikke være LIKE '% src_ord %' ?
johan.o > Nej, der er et ord imellem hver '% %', det der sker er at Str_replace() fjerner mellemrum og smider "%' OR LOWER(Titel) LIKE '%" ind i stedet for. Paa den maade seperere den soegeordene, og de bliver beggeslaaet op, saa det ikke kun er tekster med et soegeord der bliver vist, men alle tekster der indeholder enten det ene eller det andet.
$search_org="gnu"; $search = " ".$search_org; $search_titel = "LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search)."%'"; $search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search)."%'"; $search_kode = "LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search)."%'"; $query = "SELECT * FROM koder WHERE ".$search_titel." OR ".$search_beskrivelse." OR ".$search_kode." AND Godkendt = 'Y'";
echo $query; ?>
Ovenstående som er klippet fra toppen af din side laver dette output :
SELECT * FROM koder WHERE LOWER(Titel) LIKE '%%' OR LOWER(Titel) LIKE '%gnu%' OR LOWER(Beskrivelse) LIKE '%%' OR LOWER(Beskrivelse) LIKE '%gnu%' OR LOWER(Kode) LIKE '%%' OR LOWER(Kode) LIKE '%gnu%' AND Godkendt = 'Y'
Så tror jeg bare du skal droppe den linje der hedder :
$search=" ".$search_org;
Hvis du vil teste det hurtigt så skal linjen blot hedde :
$search=$search_org;
Men det ændrer jo ikke på dit oprindelige 'problem' at LIKE '%gnu%' også 'går på' gnubbe. Prøvede du at kigge på reg_exp forslaget ? er det noget du kan indopererer i din kode ?
Jeg har kigget lidt på din kode og fik lavet det her. Er det sådan noget du forsøger at lave ?
<?php if(!empty($_POST['sSearch'])) { $search=$_POST['sSearch']; $search_titel="LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search)."%'"; $search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search)."%'"; $search_kode="LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search)."%'"; $query=mysql_query("SELECT * FROM koder WHERE $search_titel OR $search_beskrivelse OR $search_kode AND Godkendt = 'Y'") or die(mysql_error()); if(mysql_num_rows($query)>0) { $tCount=0; $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'>";
$oOutput.="<tr>\n<td class='tekst'><b>".$row['Titel']."</b><br>\n"; $oOutput.=$Beskrivelse."(".$iCount.")<br>\n"; $oOutput.="<a href='index.php?H=Koder&K=".$row['ID']."'>Gå til koden »</a></td>\n</tr>"; }
$oOutput.="<tr>\n<td>Der blev fundet ialt ".$tCount." matches.</td>\n</tr></table>"; } else { $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'><tr><td>Der var ingen matches.</td></tr></table>"; } }
echo $oOutput; ?>
Jeg har ikke kunnet teste det da jeg jo ikke har databasen og connecte til.
Ja, og så havde jeg jo lige glemt dit oprindelige problem :) tsk tsk
Koden herunder søger også i $row['Kode'] men du får ingen indikation af at det er i 'Kode' at matchen er fundet men det er måske heller ikke meningen :)
Jeg testede koden på en af mine egne databaser og der fungerer den fint, du skal lige inkludere din mysql_connect rutine, så skulle den spille :)
<?php
if(!empty($_POST['sSearch'])) { $search_org=$_POST['sSearch']; $search_titel="LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search_org)."%'"; $search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search_org)."%'"; $search_kode="LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search_org)."%'"; $query=mysql_query("SELECT * FROM koder WHERE $search_titel OR $search_beskrivelse OR $search_kode AND Godkendt = 'Y'") or die(mysql_error()); if(mysql_num_rows($query)>0) { $tCount=0; $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'>";
if($tCount>0) { $oOutput.="<tr>\n<td>Der blev fundet ialt ".$tCount." matches på : ".$search_org."</td>\n</tr></table>"; } else { $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'><tr><td>Der var ingen matches på : ".$search_org."</td></tr></table>"; } } else { $oOutput="<table width='100%' border='0' cellspacing='0' cellspan='0'><tr><td>Der var ingen matches på : ".$search_org."</td></tr></table>"; } }
Du har aendret alt for meget i koden, for nu goer koden IKKE foelgende: - Sortere efter hvor mange gange de forskaellige soegeord optraeder i en kode. - Resultater er ikke antallet af koder der bliver vist, men antallet af soegeord der bliver fundet.
Det eneste jeg vil have dig til at goere er at tage min kode, og faa scriptet til at tjekke at soegeordene staar alene og at alle tegn bliver ignoreret bortset fra + og mellemrum, da de skal fungere som soegeords seperatorer.
Jeg prøvede at læse mig igennem din kode og troede faktisk det var ovenstående du forsøgte - sorry.
Jeg er nu med på at du vil have sorteret resultaterne således at det med flest 'hits' står først. Men jeg forstår ikke lige det næste du skriver med antallet af koder vs. antallet af søgeord - kan du ikke forklare ?
Nå, nu har jeg forsøgt at ændre din originale kode men da jeg ikke har din database og referere til så har jeg ikke kunne teste helheden.
<?php if(!empty($_POST['sSearch'])) {
$search_org = mysql_escape_string(strtolower($_POST['sSearch'])); $search = " ".$search_org; $search_titel = "LOWER(Titel) LIKE '%".str_replace(" ", "%' OR LOWER(Titel) LIKE '%", $search)."%'"; $search_beskrivelse = "LOWER(Beskrivelse) LIKE '%".str_replace(" ", "%' OR LOWER(Beskrivelse) LIKE '%", $search)."%'"; $search_kode = "LOWER(Kode) LIKE '%".str_replace(" ", "%' OR LOWER(Kode) LIKE '%", $search)."%'"; $query = mysql_query("SELECT * FROM koder WHERE $search_titel OR $search_beskrivelse OR $search_kode AND Godkendt = 'Y'") or die(mysql_error()); $maxCount = 0; $result = array();
Det med antallet kan jeg selv ordne, bare faa koden til at slaa hele ord op, og saa maa den ikke blive paavirket af tegn udover + og mellemrums tasten, som skal seperere soegeord.
I 24/11-2005 22:43:13 giver jeg dig en løsning på din database query. Som jeg skriver så kan jeg ikke fortælle dig hvordan du bruger reg_exp i sql query's derfor må disse komme senere.
Den query streng du får ved at fjerne det første mellemrum, er såvidt jeg kan se ikke årsagen til at tekst bliver til ekst. Men da jeg ikke kan teste herhjemme så er ovenstående konstatering af hvad dit ønske er, bare ikke nok til at jeg kan regne ud hvor problemet er.
Lige nu aner jeg ikke hvor dit problem er. Jeg har kigget på query strengen, jeg har kigget på søgning i de individuelle strenge og jeg har kigget på sammentællingen af forekomster men det lader ikke til at du prøver det jeg foreslår og så er det jo svært at vide om det er det rigtige man har gang i.
Første linje fjerner alle tegn der IKKE står imellem [^ og ] så hvis du vil have flere med så skriver du dem der f.eks. [^a-z0-9æøå+ ] så accepteres æøå også. Både store og små bogstaver accepteres pga. det lille 'i' der står efter ]/.
Næste linje erstatter '+' og ' +' med et mellemrum som jo så erstattes senere i koden.
Da der i den 'løsning' du referere til stadig sættes et mellemrum på foran strengen har jeg ikke ændret dette her, selvom jeg ikke kan forstå hvorfor det ikke virker uden den, men prøv det og lad mig høre resultatet.
Kan vi ombygge den, saa du faar chancen for at vaere med lidt fra starten?
alle tegn der ikke er bogstever eller tal, specielle bogstaver som f.eks. é eller bindestreg bliver accepteret som seperatorer imellem soegeord. saa f.eks. noget+andet vil vaere to soege ord, men Anne-Marie vil vaere et.
Saa skal den bare kigge i tabellerne 'koder' og 'tutorial' i kolonnerne titel, og beskrivelse efter et match. Naar den udskriver resulteterne efter sogningen skal soegeordene smides med fed hvis det er i beskrivelse, men ikke hvis det er i titlen. resultaterne skal sorteres efter hvor mange matches der var i den raekke i databasen, starter med de fleste match foerst, og saa ned efter.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.