08. juli 2003 - 21:43Der er
18 kommentarer og 1 løsning
Søgning i mysql-database
PHP er rimeligt nyt for mig, så jeg har lidt svært ved at lave en søgefunktion til min mysql-database. Man skal via et søgefelt(form) kunne søge på alle ord i en bogdatabase, og skabe et output af det. Outputtet skal have 10 resultater pr. side som hver kun består af en kort resumélinje som man kan klikke på, for at se hele posten. Lidt ala google - bare til databasen.
Jeg har kigget det meste af eksperten igennem, men har ikke fundet noget der ligner.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Der er kun en tabel som hedder second, og den indeholder følgende felter: id forfatternavn_fornavn forfatternavn_efternavn originalvaerkets_titel udgivelsestidspunkt_original genre oversaetterens_fornavn oversaetterens_efternavn udgivelsessted forlag udgivelsestidspunkt_oversaettelse antal_sider antal_bind bogserie_notat oversættelsens_titel notater forkortet_udgave illustreret_udgave t forord efterskrift stort_format_kunstudgave land Og nogle af dem er til yes/no checkbokse og det ville også være fordelagtigt at søge på dem.
Jeg tror løsningen må være at lave en fulltext søgning (MATCH/AGAINST) på alle de felter du kan lave til fulltext typen (som vel er de fleste). Men hvis du samtidig vil søge på fx "antal_sider" begynder det at blive lidt kringlet.
Hvis det er nemmere, at lave flere søgefelter i formen er det fint. Det vil måske også indsnævre outputtet bedre, da der bliver oprettet mange poster i den.
Jeg har desværre ikke tid til at hjælpe med særlig meget lige nu, men et forslag til hvordan du kan gøre vil være:
1. Lav en form med mulighed for at indtaste søgetekst i et felt. Dato (eller måske bedre en periode) i et andet eller to felter. Evt. nogle checkboxe svarende til dem i tabellen.
2. Lav en tjekside med forespørgsel til databasen, hvor du henter de relevante oplysninger (som fx titel og måske et uddrag af forordet eller lign.) udfra en søgning ala: "SELECT id,titel,genre FROM second WHERE (MATCH (felt1,felt2,felt3,...) AGAINST '$søgestreng') AND land='$land' AND etc...."
3. Vis outputet som links til den fulde visning. (fx som: vis_side.php?id=$id)
4. Lav en side til at vise de enkelte links.
5. Udbyg det med formatering og fx kun 10 links pr. visning o.l. (fx: Highlight af søgeord)
Ja, det var lidt sådan jeg havde forestillet mig det, men jeg aner ikke hvordan jeg skal sammensætte det. Det ville være fint hvis der var en, som havde lavet noget lignende og havde mulighed for at smide det op.
Ja, ok. Jeg har faktisk lavet noget lignende. Du er da velkommen til at se om der er noget af det du kan bruge. Det består af 4 sider. Side 1. viser en simpel formel med et felt: ------------------------------------------- <? session_start();?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Find et eller andet</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> Her kan du søge i Databasen<br> Skriv et eller flere søgeord.<br> <form action="check.php" method="post" name="Søg" target="_self"> Søgeord: <input name="soeg" type="text"> <input name="send" type="submit" value="Søg"> </form> </body> </html> ------- Side 2. "check.php" søger efter matches i 3 kolonner i min tabel, sender resultatet videre til "vis.php" ved hjælp af nogle sessionvariabler. --------------- <? session_start(); include ('connect.inc.php'); $str = ""; if (isset($_POST['soeg'])) { $hvad = $_POST['soeg']; $_SESSION['what'] = $hvad; $sql = "SELECT id, dag, maaned FROM bfid_back WHERE MATCH (tekst, uover, under) AGAINST ('$hvad')"; $res = mysql_query($sql); $antal_hit = mysql_num_rows($res); if ($antal_hit) { $str = "<h3>Du har søgt på \"$hvad\"<br></h3>"; $str .= "<h3>Der blev fundet <font color='#CC0000'>$antal_hit</font> sider.</h3><br>"; while($hit = mysql_fetch_array($res)) { extract ($hit); $str .= "<a href=\"vis_side.php?id=" . $id . "\">Bare for i dag: " . $dag . " " . $maaned . "</a><br>"; } } else $str .= "<h3>Der blev ikke fundet nogen resultater på: \"" . $hvad . "\"<br>"; } $_SESSION['result'] = $str; header('Location: vis.php'); ?> -- Side. 3 "vis.php" viser resultatet som links. ---------------- <? session_start(); echo $_SESSION['result']; ?> <title>Resultat</title> ------ Side 4. "vis_side" hiver den enkelte side ud fra tabellen ud fra id og viser siden. ---------- <? session_start();?> <title>Enkelt side</title> <? // START FUNCTION highlight // Funktion der incasesensitive highlighter en given streng function highlight($x,$var) {//$x is the string, $var is the text to be highlighted if ($var != "") { $temp = split(" ",$var); foreach ($temp as $var) { $xtemp = ""; $i=0; while($i<strlen($x)){ if((($i + strlen($var)) <= strlen($x)) && (strcasecmp($var, substr($x, $i, strlen($var))) == 0)) { $xtemp .= "<b><font color='#CC0000'>" . substr($x, $i , strlen($var)) . "</font></b>";//this version bolds the text. you can replace the html tags with whatever you like. $i += strlen($var); } else { $xtemp .= $x{$i}; $i++; } } $x = $xtemp; } } return $x; } // END FUNCTION highlight
if (isset($_GET['id'])) { $id = $_GET['id']; include ('connect.inc.php'); $str = ""; $aar = date("Y"); $hvad = $_SESSION['what']; $sql = "SELECT * FROM bfid_back WHERE id='$id'"; $res = mysql_query($sql); while($hit = mysql_fetch_array($res)) { extract ($hit); $over = highlight($over,$hvad); $uover = highlight($uover,$hvad); $tekst = highlight($tekst,$hvad); $under = highlight($under,$hvad); $dato = "$dag $maaned $aar"; $str .= "<div class='dato'>dato " . $dato . "</div>"; $str .= "<div class='over'>". $over . "</div></br>"; $str .= "<div class='uover'>". $uover . "</div>"; $str .= "<div class='kilde'>". $kilde . "</div></br>"; $str .= "<div class='tekst'>". $tekst . "</div></br>"; $str .= "<div class='under'>". $under . "</div></br>"; } print $str; } ?> ----- Formateringen styres ved hjælp af css, som jeg dog ikke har taget med i dette eksempel. PS.: Du er velkommen til at spørge, hvis der er mere jeg kan hjælpe med.
Jeg takker mange gange for hjælpen og jeg vender bare tilbage til denne kategori, hvis jeg får yderligere udfordringer. wow, det var godt nok helt iorden.
At der går noget galt i din søgning! Prøv at tjekke din $sql streng og du kan evt. prøve at skrive: $res = mysql_query($sql) or die("Fejl i forespørgsel: " . mysql_error());
Det eksempel jeg har postet er jo tilpasset mine behov. Du kan lave fulltext søgning på overskrift og text, men du skal lave felterne fulltext indexeret. Hvis du osse vil søge på fx id og dato, må du tilpasse din søgning med datatyper der passer på de felter.
id, dag, maaned er de felter jeg henter ud i mit tilfælde, hvor jeg så laver et link til siden: 'vis.php' med id til den fundne række tilknyttet url'en (vis.php?id=$id). Hvis du vil have 10 resultater/side er det nok mere hensigtsmæssigt at printe de 10 links ud med det samme, men på samme måde med id i url'en.
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.