Avatar billede janorakel Nybegynder
08. juli 2003 - 21:43 Der 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.

Jeg håber at nogen kan hjælpe.

./jan
Avatar billede detox Nybegynder
08. juli 2003 - 21:56 #1
Når du siger alle ord, hvordan ser din tabel da ud er det flere felter den skal søge i, eller måske ligefrem flere tabeller?
Avatar billede janorakel Nybegynder
08. juli 2003 - 22:05 #2
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.
Avatar billede detox Nybegynder
08. juli 2003 - 22:32 #3
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.
Avatar billede detox Nybegynder
08. juli 2003 - 22:35 #4
Så er det måske bedre at lave flere muligheder, hvor man eks. kan søge på noget tekst i et felt, eller en dato i et andet.
Avatar billede janorakel Nybegynder
08. juli 2003 - 22:49 #5
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.
Avatar billede detox Nybegynder
08. juli 2003 - 23:22 #6
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)
Avatar billede janorakel Nybegynder
09. juli 2003 - 10:03 #7
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.

./jan
Avatar billede janorakel Nybegynder
09. juli 2003 - 20:32 #8
Er der ikke nogen som kan hjælpe???
Avatar billede janorakel Nybegynder
10. juli 2003 - 12:05 #9
Smid et svar, så får du nogle point
Avatar billede detox Nybegynder
10. juli 2003 - 18:42 #10
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&oslash;ge i Databasen<br>
Skriv et eller flere s&oslash;geord.<br>
<form action="check.php" method="post" name="S&oslash;g" target="_self">
S&oslash;geord: <input name="soeg" type="text">
<input name="send" type="submit" value="S&oslash;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.
Avatar billede janorakel Nybegynder
11. juli 2003 - 11:58 #11
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.

./jan
Avatar billede janorakel Nybegynder
11. juli 2003 - 21:48 #12
Men jeg får faktisk sådan en efter 1. led.
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in \check.php on line 10

Hvad tror du kan kan betyde?
Avatar billede detox Nybegynder
11. juli 2003 - 21:53 #13
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());
Avatar billede kappel Nybegynder
29. august 2003 - 12:52 #14
detox >>
Er dette det hele der skal rettes til mht databasen i ckeck.php

$sql = "SELECT id, dag, maaned FROM bfid_back WHERE MATCH (tekst, uover, under) AGAINST ('$hvad')";

Dette ved jeg ikke hvad betyder?!
(tekst, uover, under) AGAINST

Håber du kan hjælpe...
Avatar billede detox Nybegynder
29. august 2003 - 13:19 #15
(tekst, uover, under) er nogle felter i en tabel, de skal selvfølgelig rettes til noget der passer med din tabel.
Avatar billede kappel Nybegynder
29. august 2003 - 14:33 #16
hvad med :

id, dag, maaned
Avatar billede kappel Nybegynder
29. august 2003 - 14:41 #17
Jeg kan ikke få det til at virke!

Jeg har en tabel news under databasen kappels_net
Felter: id, dato, overskrift og text

Der skal søges på disse felter og skrives et link ud med et resume til hele teksten.

jeg includer denne fil:
$server = 'localhost';
$username = 'kappels_net';
$password = '...';
$database = 'kappels_net';


Hvad er der galt?
Avatar billede detox Nybegynder
29. august 2003 - 15:00 #18
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.
Avatar billede detox Nybegynder
29. august 2003 - 15:18 #19
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.
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