friction: SELECT

Hallo,

Ich habe ein Problem mit einem SELECT und zwar habe ich eine Tabelle art, diese hat eine Kolonne show vom typ INT, zum filtern(0=nicht zeigen , 1=zeigen)
In den andern Kolonnen sind Texte oder Bezeichungnen.
Ich habe jetzt ein Suchfeld gemacht indem man ein wort oder eine zahl angeben kann, und es dann per GET senden.

'searchkey' ist der name des input's vom typ text

Dann rufe ich folgendes query auf:

<?
$q="
SELECT * FROM art
WHERE show='1'
AND bez1\_fr LIKE '%$_GET[searchkey]%'
OR bez1\_en LIKE '%$_GET[searchkey]%'
OR bez1\_de LIKE '%$_GET[searchkey]%'
OR art\_nr LIKE '%$_GET[searchkey]%'
";
?>

Wieso werden auch reihen angezeigt wo show=0 ist ?
Ich habe doch ein AND nach der ersten Bedingung angegeben!

danke

  1. hi,

    Wieso werden auch reihen angezeigt wo show=0 ist ?
    Ich habe doch ein AND nach der ersten Bedingung angegeben!

    ja, aber AND bindet stärker als OR.

    du hast also alle sätze selektiert auf die

    WHERE show='1'
    AND bez1\_fr LIKE '%$_GET[searchkey]%'

    oder

    bez1\_en LIKE '%$_GET[searchkey]%'

    oder

    bez1\_de LIKE '%$_GET[searchkey]%'

    oder

    art\_nr LIKE '%$_GET[searchkey]%'

    zutrifft.

    nutze klammerung, um die teilausdrücke in der "richtigen", von dir gewünschten reihenfolge zu binden.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hallo,

      nutze klammerung, um die teilausdrücke in der "richtigen", von dir gewünschten reihenfolge zu binden.

      tut mir leid, hab noch nie mit klammerungen in querys gearbeitet,

      kannst du mit bitte ein Beispiel geben?

      danke

      1. Klammerung:

        $q="
        SELECT * FROM art
        WHERE show='1'
        AND
        bez1\_fr LIKE '%$_GET[searchkey]%'
        OR bez1\_en LIKE '%$_GET[searchkey]%'
        OR bez1\_de LIKE '%$_GET[searchkey]%'
        OR art\_nr  LIKE '%$_GET[searchkey]%')";

        BEDEUTET
        Wähle alles aus art aber nur wenn gilt

        1. show = 1

        UND

        bez1_fr LIKE blubber
        ODER
        bez2_fr LIKE blubber
        ODER
        ...

        CHEERS

        1. hallo,

          BEDEUTET
          Wähle alles aus art aber nur wenn gilt

          1. show = 1

          UND

          bez1_fr LIKE blubber
          ODER
          bez2_fr LIKE blubber
          ODER
          ...

          CHEERS

          ja wunderbar, dankeschön :-)

  2. Hi!

    Dann rufe ich folgendes query auf:

    <?
    $q="
    SELECT * FROM art
    WHERE show='1'
    AND bez1\_fr LIKE '%$_GET[searchkey]%'
    OR bez1\_en LIKE '%$_GET[searchkey]%'
    OR bez1\_de LIKE '%$_GET[searchkey]%'
    OR art\_nr LIKE '%$_GET[searchkey]%'
    ";
    ?>

    Neben den bereits erwähnten Punkten solltest du es tunlichst _vermeiden_, einen Parameter ungeprüft in dein Skript zu übernehmen, weil du dich dadurch für SQL-Injections anfällig machst. Aus diesem Grund solltest du $_GET['searchkey'] mit mysql_real_escape_string behandeln. Ferner muss der Key «searchkey» in Anführungszeichen stehen, wenn es sich bei searchkey um keine Konstante handelt, was ich bei diesem Beispiel jetzt mal annehme.

    Grüße,
    Fabian St.