Avatar billede morell Nybegynder
28. oktober 2001 - 03:11 Der 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..

Mvh.

Asbjørn Morell
Avatar billede tdaugaard Nybegynder
28. oktober 2001 - 03:15 #1
Fordi du skal bruge:

$resultat = mysql_query(\"SELECT * FROM knowledgedb WHERE emne LIKE \'%$soeg%\' OR tekniker LIKE \'%$soeg%\' Or omraade LIKE \'%$soeg%\' OR note LIKE \'%$soeg%\'\");

altså en LIKE \'%$soeg%\' på HVERT felt.
Avatar billede tdaugaard Nybegynder
28. oktober 2001 - 03:18 #2
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.
Avatar billede limemedia Nybegynder
28. oktober 2001 - 03:31 #3
Abbjørn,

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

/ LJ
Avatar billede morell Nybegynder
28. oktober 2001 - 03:33 #4
til tdaugaard 

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?

Mvh.

Asbjørn Morell
Avatar billede tdaugaard Nybegynder
28. oktober 2001 - 03:35 #5
ljweb kom med en fremragende forklaring til at få dig i gang :o)
Men ja, din søgestreng ER helt håbløs ..
Avatar billede limemedia Nybegynder
28. oktober 2001 - 03:39 #6
tdaug >> ligefrem glimragende ? *lool*

morell >> tak for point ... det havde jeg ikke umiddelbart forventet :D
Avatar billede morell Nybegynder
28. oktober 2001 - 03:39 #7
Jeg bukker i ærefrygt... og trækker mig ydmygt tilbage til mine tykke manualer.
Tak for de hurigere (og gode) respons en lørdag nat kl 3.45.

Mvh.

Asbjørn Morell
Avatar billede limemedia Nybegynder
28. oktober 2001 - 03:47 #8
morell >> 11:31 even :)

Jeg assisterer med glæde når du går igang, er vi dygtige får vi lavet noget en masse andre kan genbruge igen og igen :) det kunne være fedt
Avatar billede Slettet bruger
28. oktober 2001 - 10:51 #9
En simpel rutine som jeg strikkede sammen:

$betingelse = \"WHERE id > \'0\'\";

$words = str_replace(\"&\",\" \",$soegeord);
$words = str_replace(\"+\",\" \",$words);
$words = str_replace(\",\",\" \",$words);
$words = ereg_replace(\'( +)$\',\',\',$words) .\".\";
$words = str_replace(\",,\",\",\",$words);
$words = str_replace(\".\",\"\",$words);
$words2 = $words;
$words = split(\",\", $words);
$number_of_words = count($words);

$i = -1;
do {
++$i;
$betingelse = \"$betingelse AND (felt like \'%$words[$i]%\' OR\";

} while ($tal-1 > $i);
$betingelse = \"$betingelse felt like \'%$words[$i]%\')\";

Den er ret simpel, og deler bare søgestrengen op i enkelte ord.

Her søger den kun i et specifikt felt, men det var bare ligesom for at give dig en ide..
Avatar billede morell Nybegynder
28. oktober 2001 - 13:35 #10
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




Avatar billede 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 (\";

$words = str_replace(\"&\",\" \",$soegeord);
$words = str_replace(\"+\",\" \",$words);
$words = str_replace(\",\",\" \",$words);
$words = str_replace(\"  \",\" \",$words);
$words = ereg_replace(\'( +)$\',\',\',$words) .\".\";
$words = str_replace(\",,\",\",\",$words);
$words = str_replace(\".\",\"\",$words);
$words = str_replace(\" \",\",\",$words);
$words = split(\",\", $words);
$tal = count($words);

$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 :)
Avatar billede morell Nybegynder
28. oktober 2001 - 18:30 #12
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.

Mvh.

Asbjørn Morell 
Avatar billede morell Nybegynder
28. oktober 2001 - 18:46 #13
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

Avatar billede 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);

echo \"$row[film] $row[type] $row[profil]\";
}

Ovenstående burde virke :)
Avatar billede Slettet bruger
28. oktober 2001 - 19:00 #15
ups...
$row[film], $row[type] og $row[profil] burde vel være
$row[emne] $row[tekniker] osv....:)

Det var bare min kode jeg ikke havde rettet i..
Avatar billede morell Nybegynder
28. oktober 2001 - 19:20 #16
det kan jeg ikke helt få til at spille...

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å...):

http://webcafe.dk/php/artikler/250/gbog-ting/mysql-funktioner.phps

Hvad skal der ændres i den for at det kommer til at virke?

Mvh.

Asbjørn Morell
Avatar billede Slettet bruger
28. oktober 2001 - 22:41 #17
Jeg kan ikke se nogen extract funktion på det link...

Men hvis du bruger

$betingelse = \"SELECT * FROM knowledgedb WHERE id > \'0\' AND (\";

$words = str_replace(\"&\",\" \",$soegeord);
$words = str_replace(\"+\",\" \",$words);
$words = str_replace(\",\",\" \",$words);
$words = str_replace(\"  \",\" \",$words);
$words = ereg_replace(\'( +)$\',\',\',$words) .\".\";
$words = str_replace(\",,\",\",\",$words);
$words = str_replace(\".\",\"\",$words);
$words = str_replace(\" \",\",\",$words);
$words = split(\",\", $words);
$tal = count($words);

$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);

echo \"$row[emne] $row[tekniker] $row[område] $row[note]\";
}

Ovenstående burde virke...skriv evt. hvilken fejl du får..

Har du det liggende online?
Avatar billede morell Nybegynder
28. oktober 2001 - 23:24 #18
følgende er pastet ind i en ren php fil:

<?php       

require(\"settings/connection-status.php\");
aabn_forbindelse_og_vaelgdb();   

$betingelse = \"SELECT * FROM knowledgedb WHERE id > \'0\' AND (\";

$words = str_replace(\"&\",\" \",$soegeord);
$words = str_replace(\"+\",\" \",$words);
$words = str_replace(\",\",\" \",$words);
$words = str_replace(\"  \",\" \",$words);
$words = ereg_replace(\'( +)$\',\',\',$words) .\".\";
$words = str_replace(\",,\",\",\",$words);
$words = str_replace(\".\",\"\",$words);
$words = str_replace(\" \",\",\",$words);
$words = split(\",\", $words);
$tal = count($words);

$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);

echo \"$row[emne]&nbsp;$row[tekniker]&nbsp;$row[område]&nbsp;$row[note]\";
}

luk_forbindelse();
?>


jeg får følgende fejl...

Parse error: parse error in /usr/local/apache/htdocs/atm/test.php on line 32

Jeg har siddet og stirret på koden i noget tid nu... men jeg kan ikke se hvad der er galt...

Mvh.

Asbjørn Morell
Avatar billede morell Nybegynder
28. oktober 2001 - 23:48 #19
Jeg fandt fejlen...
linjen $query = mysql_query(\"$betingelse order by id asc) or die(mysql_error());

er ændret til:
$query = mysql_query(\"$betingelse order by id asc\") or die(mysql_error());

Nu får jeg godtnok følgende fejl:
Unknown column \'id\' in \'where clause\'

Men jeg har ikke noget id felt i min knowledgedb tabel. Hvad er lige strengen for at oprette sådan et felt?

Mvh.

Asbjørn Morell
Avatar billede Slettet bruger
29. oktober 2001 - 07:26 #20
id feltet er i min database blot et autoincrement felt...det behøver du ikke, du kan blot bruge den du ellers sorterer efter..evt. emne...

Men hvis du skulle få brug for et id felt skal det være auto_increment, og pirmary key..:

id int(10) DEFAULT \'0\' NOT NULL auto_increment

Så får hver ny post du smider i db\'en sit helt eget unikke id, som du senere kan sortere/udvælge ud fra.

Men du bruger vel PHPMyAdmin, ikke?
Avatar billede morell Nybegynder
29. oktober 2001 - 10:16 #21
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


Mvh.

Asbjørn Morell
Avatar billede morell Nybegynder
29. oktober 2001 - 10:43 #22
jeg har oprettet en ny tråd... da de vidst ikke har så meget med denne tråd at gøre...

Mvh.

Asbjørn Morell
Avatar billede morell Nybegynder
29. oktober 2001 - 10:43 #23
og tråden er:
http://www.eksperten.dk/spm/126930

Mvh.

Asbjørn Morell
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester