Avatar billede stengaard Praktikant
29. november 2005 - 00:08 Der er 10 kommentarer og
1 løsning

hvorfor kan dette script ikke søge

følgende fejl kommer

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'kategori LIMIT 0,4' at line 1

scriptet:

<form action="soeg.php">
<table><tr>
<td>Søgeord:<br><input type="text" name="q">&nbsp;</td>
<td>Sorter efter:<br><select name="sort">
<option value="titel">Opskrifter</option>
<option value="name">Forfatter</option>
<option value="id">Dato</option>
</select>&nbsp;</td>
<td>Kategori:<br><select name="categori">
<option value="kategori">Forret</option>
<option value="kategori">Hovedret</option>
<option value="kategori">Dessert</option>
<option value="kategori">Fedtfattig</option>
<option value="kategori">Orientalsk</option>
<option value="kategori">Pasta</option>
</select>&nbsp;</td>
<td>Sortering:<br><select name="order">
<option value="desc">Faldende [z-a]</option>
<option value="asc">Stigende [a-z]</option>
</select></td>
</tr></table>
<input type="submit" value="Udfør">
</form>

<?php
if (isset($_GET['q'])) {
    echo '<hr>';
    echo '<h2>Resultater af din søgning på: "'.$_GET['q'].'"</h2>';
    include('config.php');
    $q =  $_GET['q'];
    $sort = $_GET['sort'];
    $kategori = $_GET['categori'];
    $order = $_GET['order'];
    $query = mysql_query("SELECT id,titel,name,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 $kategori 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%">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['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 >= $range) {
        $forrige = $offset-$range;
        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 Slettet bruger
29. november 2005 - 01:02 #1
Du bør kontrollere dit input istedet for bare at smide det direkte i databasen. Ellers kan hvemsomhelst gøre hvadsomhelst ved din database.

Det vil for eksempel sige med kode i stil med

if($_GET['order']=="asc") {
  $order="asc";
} else {
  $order="desc";
}

Noget tilsvarende skal gøres for ALLE felter.

Derudover skyldes den specifikke fejl, at du har $kategori stående efter $sort $order i din querystring, og det skal ikke stå der.
Avatar billede stengaard Praktikant
29. november 2005 - 20:40 #2
ok har du eventuelt et forslag til hvordan hele scriptet ser ud med "asc" og "desc" bygget ind i det
Avatar billede Slettet bruger
29. november 2005 - 21:43 #3
Ja, det kommer om lidt. Det tager lige noget tid, for jeg vil egentlig gerne omstrukturere det en smule også, således at der først kontrolleres for input og eventuelt udskrives fejlmeddelelser, og så formularen indeholder det, man søgte på, så man kan tilrette sin søgning.
Avatar billede stengaard Praktikant
29. november 2005 - 22:38 #4
ok glæder mig allerede
Avatar billede Slettet bruger
30. november 2005 - 00:05 #5
Så kommer det endelig. Jeg har i høj grad forsøgt at holde mig op ad din oprindelige kode, så det er ikke alting, der er nøjagtig, som jeg ville have lavet det for mig selv - men nu er det jo heller ikke kun mig, der skal læse koden.

Hvis du har spørgsmål, så bare skyd løs.

Og jeg vil ikke garantere, at det er helt fejlfrit, for da jeg ikke har din database med dine data, kan jeg ikke afprøve det, så jeg har slet ikke prøvekørt. Jeg har dog forsøgt at undgå de værste tastefejl.

<?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',
    '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">&nbsp;</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,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%">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['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 Slettet bruger
30. november 2005 - 00:09 #6
Hov, jeg glemte da helt at få søgeteksten med i formularen. Den stump skal se således ud:

<input type="text" name="q" value="<?php echo stripslashes($q);?>">
Avatar billede stengaard Praktikant
30. november 2005 - 21:54 #7
mmmmm kommer ikke noget frem kun hvis skærm
Avatar billede Slettet bruger
01. december 2005 - 00:16 #8
Pis. Så er der garanteret en tastefejl et sted, som resulterer i en parse-error, og din server er sat op til ikke at vise fejl. Jeg undersøger lige.
Avatar billede Slettet bruger
01. december 2005 - 00:59 #9
Ja, der var lige to ting, der forhindrede det i at køre. De er rettet nu.

<?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',
    '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($_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,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%">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['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 stengaard Praktikant
01. december 2005 - 10:22 #10
det virker tak sandbox
Avatar billede Slettet bruger
01. december 2005 - 10:27 #11
Så lægger jeg et svar
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