<html><head> <title>søgeresultat</title> </head><body> <h3>Søgning</h3> <h1>Resultat af din søgning</h1> <?php mysql_connect("localhost","yyyy","xxxx"); if($search){ mysql_select_db("_db"); $noResult = "<BR>Din søgning gav intet resultat."; $query = mysql_query("SELECT * FROM sider WHERE (indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%') AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling"); echo mysql_num_rows($query) . " resultater blev fundet og vist efter nr.<BR><BR>"; while($row = mysql_fetch_array($query)){ $id = $row["id"]; $afd = $row["afd"]; $afdeling = $row["afdeling"]; $overskrift = $row["overskrift"]; $filnavn = $row["filnavn"]; $indhold = $row["indhold"]; $indhold = strip_tags($indhold); echo ("$afdeling<BR>"); echo ("<a href=/$filnavn>$overskrift</a><BR>"); echo strlen($indhold) > 120 ? '<i>' . substr($indhold, 0, 120) . '...</i>' : $indhold; echo ("<BR><BR>"); } if (!$id){ print ("$noResult"); } mysql_close(); } ?> <?php include "test_search2.php"; ?> </body></html>
---------------------------
1. problem
efter tilføjelse af:
OR (overskrift LIKE '%".addslashes($search)."%')
virker valg af nr. ikke mere - den søger i alt
2. problem
AND godkendt='ja'
her viser den alligevel de felter som har nej
1. ekstra ?
ville gerne oprette ekstra felt i DB med ekstra søgeord, således at hvis folk skriver et ord der ikke er i teksten, så kan jeg alligevel diregerer dem til rette side. Det ville så kunne erstatte problem 1: OR (overskrift LIKE '%".addslashes($search)."%') da denne så ville være unødvendig
2. ekstra ?
det ekstra DB søgefelt skal så hente en stump tekst fra: echo strlen($indhold) > 120 ? '<i>' . substr($indhold, 0, 120) . '...</i>' : $indhold; altså ikke fra det ekstra felt - lad os kalde det $ord
3. ekstra ?
når alt ovenfor virker ville jeg gerne udvide søgning til at omfatte en ekstra tabel - altså helt ny, men mere om det senere.
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
"SELECT * FROM sider WHERE ((indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%')) AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling");
Ektra-1: Er det ikke bare at tage dit søgeordsfelt og bruge det istedet for "..overskrift LIKE '%..." ?
Ektra-2:
Er det samme søgefelt vi snakker om? I ekstra-1 skriver du at det indeholder ord der ikke er i teksten - her virker det som om (som jeg har forstået det) at det skal være 120 karakter af teksten? Har jeg misforstået noget?
Jeg skal prøve at uddybe det. Det er samme søgefelt. Det ekstra felt $ord skal jeg bruge til ekstra ord, som enten ikke findes i $indhold eller som erstatning for stavefejl f.eks plastik, hvor der så i $ord står plastic osv. Hvis der så søges på plastic, som ligger i $ord, så skal den vises resultat som hvis der søgtes på plastik, som ligger i $indhold. Den skal så vise et vilkårligt udsnit af $indhold f.eks 120 karakterer, det kunne være de første 120 af $indhold og ikke omkring ordet, da det jo ikke findes i $indhold. Endvidere skal der ikke opstå problemer hvis $ord er tomt.
"SELECT * FROM sider WHERE ((indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%') OR (ekstraord LIKE '%".addslashes($search)."%') AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling");
$ord har jeg kaldt `ekstraord`
Mht til de første 120 karakter kan du;
SELECT left(indhold,121) as indhold FROM sider ..
og så
if( strlen($indhold) > 120 ) $indhold = substr($indhold,0,-1) . '...'; // eller bare $indhold .= '...';
virker dette ikke efter hensigten? echo strlen($indhold) > 120 ? '<i>' . substr($indhold, 0, 120) . '...</i>' : $indhold;
men her: $query = mysql_query("SELECT left(indhold,121) as indhold, id, afd, afdeling, overskrift, filnavn FROM sider WHERE ((indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%') OR (ord LIKE '%".addslashes($search)."%') AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling");
Jeg synes ikke den virker helt optimalt, den er ok når den henter fra $ord (fejlord), så viser den 120 tegn fra start af $indhold og dette skal den også hvis det findes i $overskrift. Men jeg vil gerne have den til at vise 60 tegn på hver side af søgeordet i $indhold, altså her ikke fra start af $indhold men nede i hvor søgeordet er. Kan det sættes sammen på denne måde?
Den sidste du skrev: $query = mysql_query("SELECT left(indhold,121)gør den ikke det, at den kun søger i de første 120 tegn og ikke i hele indholdet - den selecter jo kun left(indhold,121)eller har jeg misforstået!!! Never mind, det er nu det første afsnit jeg gerne ville have til at fungere optimalt. :-)
>Den sidste du skrev: $query = mysql_query("SELECT left(indhold,121)gør den ikke det, at den kun søger i de første 120 tegn og ikke i hele indholdet - den selecter jo kun left(indhold,121)eller har jeg misforstået!!!
Du har misforstået.
Det du selecter bliver først brugt når dine betingelser er opfyldt. Så betingelserne er ligeglad med hvad du selecter - så i eksemplet søges der i hele feltet.. Hvis vi skulle lave det sådan at den kun søger i de første 120 tegn så ville din where se sådan her ud: WHERE ((substr(indhold,120) LIKE '% ...
men det er jo ikke det du ønsker. Det du selecter kommer først i sving når MySQL ved hvilke rækker der opfylder dine betingelser (i where-delen).
Men hvis du vil have den til at vise 60 tegn på begge sider skal du bare bruge SELECT * FROM .. ligesom i starten.. så har du hele feltet.. Så skal vi bare lave noget php-kode der kan vise den del der er interessant.
Hej igen, jeg har prøvet at kombinere koden men får en fejl
kode:
$noResult = "<BR>Din søgning gav intet resultat.<br><br>Prøv eventuelt igen med samme ord skrevet på en anden måde."; $query = mysql_query("SELECT * FROM sider WHERE ((indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%') OR (ord LIKE '%".addslashes($search)."%')) AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling"); echo mysql_num_rows($query) . " resultater blev fundet og vist efter nr.<BR><BR>"; while($row = mysql_fetch_array($query)){ $id = $row["id"]; $afd = $row["afd"]; $afdeling = $row["afdeling"]; $overskrift = $row["overskrift"]; $filnavn = $row["filnavn"]; $indhold = $row["indhold"]; $indhold = strip_tags($indhold); echo ("$afdeling<BR>"); echo ("<a href=/$filnavn>$overskrift</a><BR>");
Hej det virkede, nu ser koden ud som følger - kan den optimeres eller er den ok?
kode:
<?php mysql_connect("localhost","dk","xx"); if($search){ mysql_select_db("_db"); $noResult = "<BR>Din søgning gav intet resultat.<br><br>Prøv eventuelt igen med samme ord skrevet på en anden måde."; $query = mysql_query("SELECT * FROM sider WHERE ((indhold LIKE '%".addslashes($search)."%') OR (overskrift LIKE '%".addslashes($search)."%') OR (ord LIKE '%".addslashes($search)."%')) AND godkendt='ja' AND afd='".addslashes($afd)."' ORDER BY afdeling"); echo mysql_num_rows($query) . " resultater blev fundet og vist efter nr.<BR><BR>"; while($row = mysql_fetch_array($query)){ $id = $row["id"]; $afd = $row["afd"]; $afdeling = $row["afdeling"]; $overskrift = $row["overskrift"]; $filnavn = $row["filnavn"]; $indhold = $row["indhold"]; $indhold = strip_tags($indhold); echo ("$afdeling<BR>"); echo ("<a href=/$filnavn>$overskrift</a><BR>");
Udmiddelbart ser det fint ud. Det er nok mere databasen der skal ses på hvis du får performance problemer.. Men hvorfor ikke bare se om det overhovedet giver problemer - før du piller yderligerer :) .. De fleste får problemer med båndbredde før de får performance-problemer - så brug energien på noget andet, indtil du kan se at det er et problem / ved at blive et problem.
Jeg ville nok flytte denne klump kode ud af while-løkken.
Det den gør, er at hvis stripos ikke findes som funktion, så definerer vi een. Dette tjek behøver vi kun at gøre een gang. I mit eksempelkode placerede jeg den helt op i toppen.
Hej det funker - 1000 tak for denne del - så er det om du er frisk på 3. ekstra?
Det handler om, at jeg gerne vil have nogle data i en anden tabel. dvs. at søgningen nu skal checke 2 tabeller og udskrive på samme måde, dog skal data fra tabel-2 nok vise færre tegn.
Jeg har nu 2 tabeller men har læst et sted at det ikke er smart at nogle af felterne hedder det samme i begge tabeller - hvis så, så skal jeg lige have oprettet en ny tabel-2.
Men kan det lade sige gøre at indflette tabel-2 i søgningen??? og hvis ja er der noget jeg fra start skal tage hensyn til udover evt feltnavn?
Det er ikke noget problem at to tabeller har samme feltnavne. Men hvis de er næsten ens (eller helt ens) så er det nok et tegn på at du bør overveje at slå dem sammen.
Den anden tabel har jeg behov for, idet det er en pristabel, hvor jeg pt bare har pristabellen liggende i tabel-1 i et felt i en <table>, så det er bedst at får den til at ligge for sig selv også men hensyn til rettelser.
Jeg er bare lidt i tvivl om hvordan jeg skal strukturere den, da feks filnavn osv skal gentages for hver pris af hensyn til linket i søgningen - der kan være optil 50 forskellige priser på en side, så det ville være smart hvis man kunne nøjes med at skrive alt andent en indhold og pris 1 gang, men det går vel ikke mht søgningen.
Lige nu ser den sådanne ud:
CREATE TABLE priser ( id int(11) NOT NULL auto_increment, indeks tinytext NOT NULL, godkendt tinytext NOT NULL, filnavn tinytext NOT NULL, afd tinytext NOT NULL, list tinytext NOT NULL, afdeling tinytext NOT NULL, overskrift tinytext NOT NULL, indhold text NOT NULL, pris tinytext NOT NULL, dag tinytext NOT NULL, PRIMARY KEY (id), FULLTEXT KEY tekst (indhold,pris) ) TYPE=MyISAM COMMENT='alle almindelige sider';
men det er kun indhold og pris der varierer for hver side.
Dvs. jeg skal måske have 10 sider hvor der er 3 til 50 forskellige prider på hver side.
Du må hellere spørge så skal jeg prøve at uddybe mere...
felter: Der skal søges i $indhold og vises hele $indhold og så linkes til $filnavn.
indeholder: nej for det er meningen at det skal overførs som her i den nye tabel, altså den gamle prisside slettes fra tabel-1 - eller måske hvis bedre - kan det beholdes i tabel 1 og så kun indhold og pris i tabel 2, men så skal der jo kaldes 2 tabeller fra siderne...
... både ja og nej, jeg har lavet et lille rettesystem hvor indhold kan rettes i browser, men her er det ikke noget problem og nok det bedste at lave et rettesystem kun for priser - så faktisk nej der behøver ikke være relationer.
$afd er for at der ikke skal stå formeget i value, idet $afdeling kan være mange tegn og med æøå, men jeg mener jeg bruger den andets sted også kan bare ikke lige se det
jeg bruger så $indeks så denne er $afd + 3tal feks afd 090030 er så side 3 i afd 090 og hvor jeg så har ydeligere mulighed for under sider til side 3 nemlig 090031,31,33 osv. *S*
$indeks er istedet for $id da denne bare gives i rækkefølge som siderne oprettes og det kan jeg ikke bruge når jeg sorterer.
Hvsi ejg fik fat i din kode + database struktur samt lidt prøve data. Så kunne jeg komme med et forslag der er mere konkret. Så kan vi måske bruge tiden bedre på finde en løsning og så gennemgå det, så du er med på hvad dit script så gør..
Det kommer lidt an på hvordan de bedst arbejeder :).
jeg har ikke helt haft overskud til at genneskue det endnu, men vil hellere for god ordens skyld have du smider et svar så du kan få dine points, så må jeg kontakte dig på andet tidspunkt*S*
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.