Avatar billede stengaard Praktikant
30. november 2005 - 22:46 Der er 8 kommentarer og
1 løsning

et søge script i php fra mysql med flere kategorier

hej jeg kan ikke få dette script til at virke det eneste der kommer frem er en hvid skærm ???

scriptet ser således ud

<?php

// en funktion, der skal bruges. Se forklaring på http://exp.dk/artikler/190
function my_addslashes($streng){
    return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

// Og en anden funktion, der laver selectboksene på en hurtig og let måde
function makeselect($navn, $liste, forvalg) {
    $s = "<select name='$navn'>\n";
    foreach($liste as $felt => $tekst) {
        $s .= "    <option value='$felt'";
        if($forvalg==$felt) {
            $s .= " selected='selected'";
        }
        $s .= ">$tekst</option>\n"; 
    }
    $s .= "</select>\n";
    return $s;
}

// Først oprettes de lister, der skal bruges. Bemærk, at de bruges både
// til at lave formularen og til at kontrollere forespørgslen, så hvis
// der skal tilføjes muligheder, skal det bare gøres i listen.
// Kategorilisten kunne det måske være en ide at lægge i en include-fil,
// så den også kan bruges af formularen til at indtaste nye opskrifter.


// liste over kategorier. Første streng i hver linie, er den,
// der benyttes som værdi i tabeller og formularer. Anden streng er
// den, der vises for brugeren.

         
$katlist = array(
    'Forret' => 'Forret',
    'Drinks' => 'Drinks',
    'Morgenmad' => 'Morgenmad',
    'Velkomst' => 'Velkomst',
    'Supper' => 'Supper',
    'Frokost' => 'Frokost',
    'Natmad' => 'Natmad',
    'Vegetar' => 'Vegetar',
    'Hovedret' => 'Hovedret',
    'Dessert' => 'Dessert',
    'fedtfattig' => 'Fedtfattig',
    'Orientalsk' => 'Orientalsk',
    'Pasta' => 'Pasta' );

// Liste over felter at sortere efter.
// Er du forresten sikker på, at Dato skal sortere efter id, når du har et date-felt?
$sortlist = array(
    'titel' => 'Opskrifter',
    'name' => 'Forfatter',
    'id' => 'Dato' );

$sortorderlist = array(
    'asc' => 'Stigende (a->z)',
    'desc' => 'Faldende (z->a)' );

// Standard-værdier for formularfelterne, som de er sat til, når man kommer til siden
$kategori = 'Hovedret';
$sort = 'titel';
$order = 'asc';
$offset = 0;
$range = 10; // Hvor mange vil du have på hver side?

// Nu sætter jeg en variabel, som længere nede bruges til at bestemme
// om der er tale om en gyldig forespørgsel, der skal sendes til databasen.
// Den bliver sat til falsk, hvis der findes fejl i input.

$formOK = true;

// har vi overhovedet modtaget en formular?

if(isset($_GET['q']) || isset($_GET['kategori']) ||
  isset($_GET['sort']) || isset($_GET['order']) || isset($_GET['offset']) ) {

    // er der søgt efter noget?

    if(empty(trim($_GET['q']))) {
        echo "Skriv venligst et søgeord. ";
        $formOK = false;
    } else {
        $q=trim($_GET['q']);
        $q=my_addslashes($q);
    }

    // Har vi en kategori?

    if(isset($katlist[$_GET['kategori']])) {
        $kategori = $_GET['kategori'];
    } else {
        echo "Forkert kategori! ";
        $formOK = false;
    }

    // og tilsvarende for de to andre select-bokse.
    if(isset($sortlist[$_GET['sort']])) {
        $sort = $_GET['sort'];
    } else {
        echo "Forkert sorteringsfelt! ";
        $formOK = false;
    }

    if(isset($sortorderlist[$_GET['order']])) {
        $order = $_GET['order'];
    } else {
        echo "Forkert sorteringsorden! ";
        $formOK = false;
    }

    // og offset skal også kontrolleres, men da den ikke er med på
    // første resultatside, gør jeg det med to gange if
    if(isset($_GET['offset'])) {
        if(is_numeric($_GET['offset']) &&
          intval($_GET['offset']) == $_GET['offset'] && $_GET['offset'] > 0) {
            $offset = $_GET['offset'];
        } else {
            echo "Forkert offset! ";
            $formOK = false;
        }
    }
} else {
    // Vi har ikke modtaget en formular
    $formOK = false;
}

// når scriptet kommer hertil har alle variablerne fornuftige værdier.
// Muligvis bortset fra $offset, som i princippet kunne være højere end antallet af rækker.

?>

<form action="soeg.php" method="get">
<table><tr>
<td>Søgeord:<br><input type="text" name="q" value="<?php echo stripslashes($q);?>">
</td>
<td>Sorter efter:<br>
<?php echo makeselect("sort", $sortlist, $sort); ?>
<td>Kategori:<br>
<?php echo makeselect("kategori", $katlist, $kategori); ?>
</td>
<td>Sortering:<br>
<?php echo makeselect("order", $sortorderlist, $order); ?>
</td>
</tr></table>
<input type="submit" value="Udfør">
</form>

<?php
// så ser vi, om vi har en OK formular.

if ($formOK) {
    echo '<hr>';
    echo '<h2>Resultater af din søgning på: "'.$q.'"</h2>';
    include('config.php');
    // Her jeg jeg kun slettet $kategori et sted og lavet linieskift, så det er mere læseligt
    $query = mysql_query("SELECT id,titel,name,portioner,kategori,DATE_FORMAT(date,'%e/%c-%y %T') AS date
                          FROM opskrift
                          WHERE parent=0
                            AND (titel LIKE '%$q%' OR kategori LIKE '%$q%' OR message LIKE '%$q%')
                          ORDER BY $sort $order
                          LIMIT $offset,$range") or die(mysql_error());
    if (mysql_num_rows($query) == 0){
        echo 'Ingen resultater af din søgning!<br>';
    } else {
        echo '<table id="list"><tr>';
        echo '<th width="50%">Opskrifter</th><th width="15%">Portioner</th><th width="15%">Kategori</th><th width="15%">Forfatter</th>';
        echo '</tr>';
        while($row = mysql_fetch_assoc($query)) {
            echo '<tr>';
            echo "<td width='50%'><a href='laes.php?id=$row[id]'>$row[titel]</a></b></td>";
            echo '<td width="15%">'.$row['portioner'].'</td>';
            echo '<td width="15%">'.$row['kategori'].'</td>';
            echo '<td width="15%">'.$row['name'].'</td>';
            echo '</tr>';
        }
        echo '</table>';
    }
    echo '<br>';

    $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM opskrift WHERE parent=0 AND (titel LIKE '%$q%' OR kategori LIKE '%$q%' OR message LIKE '%$q%')"),0);
    if ($offset > 0) {
        $forrige = $offset-$range;
        if($forrige < 0) {
            $forrige = 0;
        }
        echo "<a href='?q=$q&sort=$sort&order=$order&offset=$forrige'>Forrige</a> | ";
    } else {
        echo 'Forrige | ';
    }
    if ($antal >= $offset+$range) {
        $naeste = $offset+$range;
        echo "<a href='?q=$q&sort=$sort&order=$order&offset=$naeste'>Næste</a>";
    } else {
        echo 'Næste';
    }
}
?>
Avatar billede jakobdo Ekspert
30. november 2005 - 22:52 #1
En ting er næsten altid sikker på hvid skærm, og det er en php fejl!
Hvis du kigger output, så ser du garanteret kun:
<html><body></body></html>
Ved ikke om du kan bruge dette:

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

Smid det i toppen, og se om du kan få nogle fejlmeddelser.
Avatar billede stengaard Praktikant
30. november 2005 - 22:59 #2
ingen ting stadig hvis skærm scriptet ser således ud nu

<?php

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

// en funktion, der skal bruges.
function my_addslashes($streng){
    return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

// Og en anden funktion, der laver selectboksene på en hurtig og let måde
function makeselect($navn, $liste, forvalg) {
    $s = "<select name='$navn'>\n";
    foreach($liste as $felt => $tekst) {
        $s .= "    <option value='$felt'";
        if($forvalg==$felt) {
            $s .= " selected='selected'";
        }
        $s .= ">$tekst</option>\n"; 
    }
    $s .= "</select>\n";
    return $s;
}

// Først oprettes de lister, der skal bruges. Bemærk, at de bruges både
// til at lave formularen og til at kontrollere forespørgslen, så hvis
// der skal tilføjes muligheder, skal det bare gøres i listen.
// Kategorilisten kunne det måske være en ide at lægge i en include-fil,
// så den også kan bruges af formularen til at indtaste nye opskrifter.


// liste over kategorier. Første streng i hver linie, er den,
// der benyttes som værdi i tabeller og formularer. Anden streng er
// den, der vises for brugeren.

         
$katlist = array(
    'Forret' => 'Forret',
    'Drinks' => 'Drinks',
    'Morgenmad' => 'Morgenmad',
    'Velkomst' => 'Velkomst',
    'Supper' => 'Supper',
    'Frokost' => 'Frokost',
    'Natmad' => 'Natmad',
    'Vegetar' => 'Vegetar',
    'Hovedret' => 'Hovedret',
    'Dessert' => 'Dessert',
    'fedtfattig' => 'Fedtfattig',
    'Orientalsk' => 'Orientalsk',
    'Pasta' => 'Pasta' );

// Liste over felter at sortere efter.
// Er du forresten sikker på, at Dato skal sortere efter id, når du har et date-felt?
$sortlist = array(
    'titel' => 'Opskrifter',
    'name' => 'Forfatter',
    'id' => 'Dato' );

$sortorderlist = array(
    'asc' => 'Stigende (a->z)',
    'desc' => 'Faldende (z->a)' );

// Standard-værdier for formularfelterne, som de er sat til, når man kommer til siden
$kategori = 'Hovedret';
$sort = 'titel';
$order = 'asc';
$offset = 0;
$range = 10; // Hvor mange vil du have på hver side?

// Nu sætter jeg en variabel, som længere nede bruges til at bestemme
// om der er tale om en gyldig forespørgsel, der skal sendes til databasen.
// Den bliver sat til falsk, hvis der findes fejl i input.

$formOK = true;

// har vi overhovedet modtaget en formular?

if(isset($_GET['q']) || isset($_GET['kategori']) ||
  isset($_GET['sort']) || isset($_GET['order']) || isset($_GET['offset']) ) {

    // er der søgt efter noget?

    if(empty(trim($_GET['q']))) {
        echo "Skriv venligst et søgeord. ";
        $formOK = false;
    } else {
        $q=trim($_GET['q']);
        $q=my_addslashes($q);
    }

    // Har vi en kategori?

    if(isset($katlist[$_GET['kategori']])) {
        $kategori = $_GET['kategori'];
    } else {
        echo "Forkert kategori! ";
        $formOK = false;
    }

    // og tilsvarende for de to andre select-bokse.
    if(isset($sortlist[$_GET['sort']])) {
        $sort = $_GET['sort'];
    } else {
        echo "Forkert sorteringsfelt! ";
        $formOK = false;
    }

    if(isset($sortorderlist[$_GET['order']])) {
        $order = $_GET['order'];
    } else {
        echo "Forkert sorteringsorden! ";
        $formOK = false;
    }

    // og offset skal også kontrolleres, men da den ikke er med på
    // første resultatside, gør jeg det med to gange if
    if(isset($_GET['offset'])) {
        if(is_numeric($_GET['offset']) &&
          intval($_GET['offset']) == $_GET['offset'] && $_GET['offset'] > 0) {
            $offset = $_GET['offset'];
        } else {
            echo "Forkert offset! ";
            $formOK = false;
        }
    }
} else {
    // Vi har ikke modtaget en formular
    $formOK = false;
}

// når scriptet kommer hertil har alle variablerne fornuftige værdier.
// Muligvis bortset fra $offset, som i princippet kunne være højere end antallet af rækker.

?>

<form action="soeg.php" method="get">
<table><tr>
<td>Søgeord:<br><input type="text" name="q" value="<?php echo stripslashes($q);?>">
</td>
<td>Sorter efter:<br>
<?php echo makeselect("sort", $sortlist, $sort); ?>
<td>Kategori:<br>
<?php echo makeselect("kategori", $katlist, $kategori); ?>
</td>
<td>Sortering:<br>
<?php echo makeselect("order", $sortorderlist, $order); ?>
</td>
</tr></table>
<input type="submit" value="Udfør">
</form>

<?php
// så ser vi, om vi har en OK formular.

if ($formOK) {
    echo '<hr>';
    echo '<h2>Resultater af din søgning på: "'.$q.'"</h2>';
    include('config.php');
    // Her jeg jeg kun slettet $kategori et sted og lavet linieskift, så det er mere læseligt
    $query = mysql_query("SELECT id,titel,name,portioner,kategori,DATE_FORMAT(date,'%e/%c-%y %T') AS date
                          FROM opskrift
                          WHERE parent=0
                            AND (titel LIKE '%$q%' OR kategori LIKE '%$q%' OR message LIKE '%$q%')
                          ORDER BY $sort $order
                          LIMIT $offset,$range") or die(mysql_error());
    if (mysql_num_rows($query) == 0){
        echo 'Ingen resultater af din søgning!<br>';
    } else {
        echo '<table id="list"><tr>';
        echo '<th width="50%">Opskrifter</th><th width="15%">Portioner</th><th width="15%">Kategori</th><th width="15%">Forfatter</th>';
        echo '</tr>';
        while($row = mysql_fetch_assoc($query)) {
            echo '<tr>';
            echo "<td width='50%'><a href='laes.php?id=$row[id]'>$row[titel]</a></b></td>";
            echo '<td width="15%">'.$row['portioner'].'</td>';
            echo '<td width="15%">'.$row['kategori'].'</td>';
            echo '<td width="15%">'.$row['name'].'</td>';
            echo '</tr>';
        }
        echo '</table>';
    }
    echo '<br>';

    $antal = mysql_result(mysql_query("SELECT COUNT(*) FROM opskrift WHERE parent=0 AND (titel LIKE '%$q%' OR kategori LIKE '%$q%' OR message LIKE '%$q%')"),0);
    if ($offset > 0) {
        $forrige = $offset-$range;
        if($forrige < 0) {
            $forrige = 0;
        }
        echo "<a href='?q=$q&sort=$sort&order=$order&offset=$forrige'>Forrige</a> | ";
    } else {
        echo 'Forrige | ';
    }
    if ($antal >= $offset+$range) {
        $naeste = $offset+$range;
        echo "<a href='?q=$q&sort=$sort&order=$order&offset=$naeste'>Næste</a>";
    } else {
        echo 'Næste';
    }
}
?>
Avatar billede jakobdo Ekspert
01. december 2005 - 07:52 #3
2 rettelser til dit script:

function makeselect($navn, $liste, $forvalg)
Du har glemt $ foran forvalg.

// er der søgt efter noget?
//if(empty(trim($_GET['q'])))
//Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).
if(empty($_GET['q'])) //Den må ikke hedde: if(empty(trim($_GET['q'])))
Avatar billede dustie Mester
01. december 2005 - 08:07 #4
Er der en grund til at du ikke poster det på dansk?

Er det copy&paste fra php.net?
Avatar billede jakobdo Ekspert
01. december 2005 - 08:09 #5
Jep, copy/paste fra php.net :o)
Avatar billede stengaard Praktikant
01. december 2005 - 10:20 #6
tak det virker send dit svar jakobdo
Avatar billede jakobdo Ekspert
01. december 2005 - 10:29 #7
Svar!
Avatar billede jakobdo Ekspert
01. december 2005 - 10:38 #8
Takker for point!
Avatar billede dustie Mester
01. december 2005 - 11:07 #9
Okay, så virker det pludselig ikke så mystisk :)
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