Avatar billede cyberdude Nybegynder
17. januar 2002 - 14:48 Der er 8 kommentarer og
1 løsning

MEGET avanceret søgning.......

Hejsa!!

Jeg prøver på at lave en temelig avanceret søgning. men jeg kan ikke helt overskue det.....

Jeg har et array med de tabeller der skal/må søges i

$tabel_arr(\"sel_kunde, sel_lok_typpe, sel_fest_typpe, sel_belig\");

den første tabel indeholder 50 felter....
(entlig er det kun ca. 25 af felterne det er nødvendigt at søge i... så skal der evt laves et array med disse felters navne ?)
de 3 sidste tabeller indeholder 3 felter hver
id, kunde_id & opt

kunde_id referere til sel_kunde tabellen\'s id felt

Jeg vil så gerne lave en fritekst søgning hvor søgestrengen kreres \"on the fly\"

Jeg indtaster eks. søgeorene
\"Catering møde\"
(feltet de indtastes i hedder fri)

Så skal der kreres en søgning der søger i alle ovennævnte tabeller og i alle ovennævnte felter

Jeg kan ikke hitte ud af at få den til at lave det sådant her

select kunde_id, opt from sel_lok_typpe where kunde_id like \'%catering%\' or kunde_id like \'%møde%\'or opt link \'%catering%\' or opt like \'%møde%\'

o gtil slut skal den søge i sel_kunde og så sotere efter et bestemt felt i sel_kunde tabellen.... så det skal vel entlig laves som en join søgning....... vil det blive alt for langsomt at gøre det på den måde ??

Hvordan skal jeg evt. ellers gøre det ??
Vi starter med 60 point... og kan snilt hæve det hvis de re rnogen der kan hitte ud af det!
Avatar billede morw Nybegynder
19. januar 2002 - 01:08 #1
<?

$felter = array(\"fee\", \"foo\", \"foom\");
$sogeord = \"ord\";

$komma_sep = implode(\", \",$felter);

$sql = \"SELECT $komma_sep FROM bar WHERE \";

foreach($felter as $f) {

$where[] = \"$f LIKE \'%$sogeord %\'\";
}

$sql .= implode(\" OR \", $where);

print($sql);
?>

Byg selv videre hvis den skal søge med flere ord...
Avatar billede cyberdude Nybegynder
19. januar 2002 - 11:14 #2
kan du forklare lidt om hvad de forskellige linier gør. så det er muligt selv at bygge vidre :-) ??

$felter = array(\"fee\", \"foo\", \"foom\"); // her lister jeg de felter der skal søges i
$sogeord = \"ord\"; // dette er de ord der skal søges på... de kommer dog fra en formular. og det skal svære muligt at sæge på mere end 1 ord uafhængigt af hinanden........

$komma_sep = implode(\", \",$felter); // listen med felter der skal søges i her.... ?

$sql = \"SELECT $komma_sep FROM bar WHERE \"; // starten på min søgning, bar erstattes med mit database navn ?

foreach($felter as $f) {  // ??

$where[] = \"$f LIKE \'%$sogeord %\'\"; // $where[] hvad gør den... syntes ikke variablen er defineret nogen steder før ??
}

$sql .= implode(\" OR \", $where); // ??

print($sql); // ??
?>
Avatar billede morw Nybegynder
19. januar 2002 - 11:44 #3
$komma_sep = implode(\", \",$felter); // limer alle felter sammen \", \" som lim så det bliver en lang streng

foreach($felter as $f) {  // gentag en lykke for alle felter. $f bliver navnet på hvert felt.

$sql = \"SELECT $komma_sep FROM bar WHERE \"; // starten på min søgning, bar erstattes med mit database navn ? JEPS


$where[] = \"$f LIKE \'%$sogeord %\'\"; //  $where blever en dynamisk array, med et element for hvert felt i $felter


$sql .= implode(\" OR \", $where); // tager vores start sql som vi før lavede og sætter den sammen med det nye $where array som ci somer om til en streng med \" OR \" som lim.

print($sql); // skriver bare hele sætningen ud

du skal i stedet bruge $sql sammen med mysql_query() ... men start bare med at få den til at skrive en sql sætning ud der virker

Avatar billede cyberdude Nybegynder
19. januar 2002 - 16:23 #4
hm den laver det ikke helt korekt....

her er scriptet som det ser ud nu.....

<?
$felter = array(\"tlf_paa_stedet\", \"website\", \"pris_eks_lok\");
$sogeord = \"98 198\";

$komma_sep = implode(\", \",$felter);

$sql1 = \"SELECT $komma_sep FROM sel_kunde WHERE \";

foreach($felter as $f) {

$where[] = \"$f LIKE \'%$sogeord %\'\";
}

$sql1 .= implode(\" OR \", $where);

print($sql1);
?>

Og her er strengen der kommer ud af det
SELECT tlf_paa_stedet, website, pris_eks_lok FROM sel_kunde WHERE tlf_paa_stedet LIKE \'%98 198%\' OR website LIKE \'%98 198%\' OR pris_eks_lok LIKE \'%98 198%\'

De 2 søgeord skal opfattes som enkelte ord.. så snart der er  mellemrum i orene så skal de opfattes som enkelte ord....
således at strengen komme rtil at se sådant her ud

SELECT tlf_paa_stedet, website, pris_eks_lok FROM sel_kunde WHERE tlf_paa_stedet LIKE \'%98%\' OR tlf_paa_stedet LIKE \'%198%\' OR website LIKE \'%98%\' OR website LIKE \'%198 %\' OR pris_eks_lok LIKE \'%98%\' OR pris_eks_lok LIKE \'%198%\'

Hvordan får jeg den til det... ?
Avatar billede cyberdude Nybegynder
19. januar 2002 - 16:26 #5
variablen $sogeord er den streng der vil komme fra søgeformularen.....

Kunne forestille mig noget ala
$sogeord_sep = implode(\" \",$sogeord);

Men hvor skal det ind og hvordan skal det bygges på så der laves en xxxx LIKE \'%xxx%\' OR
Det skal jo gentages x antal gange afh. hvor mange søgeord der er....
Avatar billede morw Nybegynder
19. januar 2002 - 16:41 #6
Så kan du jo lave endnu en foreach:

http://www.webprojects.dk/sql.php4
Avatar billede cyberdude Nybegynder
19. januar 2002 - 16:49 #7
de få test data jeg har til rådighed lige her fra hvor jeg befinder mig nu. så ser det faktisk ud til at funge......

Og den der OR den kan man vel entlig også gøre dynamisk så folk selv kan bestemme om det skal være
OG (AND) eller om det skal være ELLER (OR)

Jeg tester det når jeg kommer hjem, hvor jeg har nogle flere data at teste med!
Avatar billede cyberdude Nybegynder
19. januar 2002 - 16:50 #8
kom lige til at tænke på om man kan gøre det sådant at hvis folk skriver \"du er sød\"
altså i mellem \" \" så bliver det opfattet som én streng og ikke som 3 selvstændige ord... ?
Avatar billede cyberdude Nybegynder
19. januar 2002 - 16:54 #9
evt bare lave det med et + tegn mellem hvet ord
du+er+sød fest

så vil der blive søgt på like \'%du er sød%\' OR like \'%fest%\'
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
Computerworld tilbyder specialiserede kurser i database-management

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