Alex: mysql - where mit 20 suchmöglichkeiten

hi,

ich habe ein array mit 20 zahlen.

jetzt muss ich bei einer tabelle eine select-anweisung durchführen, es sollen nur datensätze ausgewählt werden die eine zahl von den 20 zahlen enthalten.

also ein beispiel:

$array = qw(1234 7654 4576 6578 ...); # array mit den 20 zahlen

select * from tabelle where number="$array[0]" or number="$array[1]" ... or number="$array[19]";

jetzt meine frage:

macht es jetzt was, dass 20 where-bedingungen am ende von der select-anweisung stehen?

datenbank ist mysql.

  1. Hello,

    mach ein Set aus dem Array und frag es mit

    select $primaray from $table where number in ($set);

    ab

    $set = "'".implode("','",$_array)."'";

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hallo,

      select $primaray from $table where number in ($set);
      $set = "'".implode("','",$_array)."'";

      Ich frage mich gerade zum wiederholten Male, warum denn viele Leute Zahlenwerte unter Anführungszeichen setzen, wenn sie ein SQL-Statement formulieren. Ich halte das für unsinnig.
      Kann mir irgendjemand gute Gründe für diese Vorgehensweise nennen?

      Grüße
        Klaus

      1. Hello Klaus,

        select $primaray from $table where number in ($set);
        $set = "'".implode("','",$_array)."'";

        Ich frage mich gerade zum wiederholten Male, warum denn viele Leute Zahlenwerte unter Anführungszeichen setzen, wenn sie ein SQL-Statement formulieren. Ich halte das für unsinnig.
        Kann mir irgendjemand gute Gründe für diese Vorgehensweise nennen?

        ...weil es bei MySQL erlaubt ist und die Sache dadurch erheblich vereinfacht. Für den Fall, dass doch keine Zahl drinsteht, gibt's wenigstens auch keine Injektion. Siehe hierzu auch [pref:t=69312&m=398925]

        Anderenefalls müsste jeder als numerisch erwartete Wert vorher auch auf numerisch überprüft werden. Eine Maskierung reicht gegen Injektionsgefahr nicht aus. (Ich spreche _nicht_ von Infektionsgefahr, die interessiert mich hier nicht).

        Ich hoffe, ich konnte Dir weiterhelfen.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hello,

          schade, explizit kann ich die Stelle nicht finden, an der das steht.

          Aber http://www.mysql.de/doc/de/Comparison_Operators.html gibt schon mal die geeigneten Hinweise.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Hallo,

          ...weil es bei MySQL erlaubt ist und die Sache dadurch erheblich vereinfacht. Für den Fall, dass doch keine Zahl drinsteht, gibt's wenigstens auch keine Injektion.

          Allerdings verbirgt sich dadurch auch im Statement die Tatsache, dass bestimmte Felder numerisch sind.

          Ausserdem stelle ich mir die Frage wie die Datenbank (unabhängig vom Hersteller oder von der Version) beispielsweise auf folgendes Statement reagiert:

          UPDATE tabelle SET
             numeric1 = '1test';
             numeric2 =  'test'
             WHERE id = '123test';

          Siehe hierzu auch [pref:t=69312&m=398925]

          Ich bevorzuge bei Parametern an sich sowieso Databinding. Und in den Programmiersprachen, mit denen ich arbeite, sind Datenbankschnittstellen verfügbar, die das Maskieren von "L'Oreal" Datenbank-spezifisch beim Databinding automatisch erledigen. Diesen Komfort gönne ich mir;-)

          Anderenefalls müsste jeder als numerisch erwartete Wert vorher auch auf numerisch überprüft werden.

          _Das_ sollte bei externen Daten (Benutzereingaben, Textdateien usw.) sowieso passieren. Allein schon um unschöne oder nichtssagende Frehlermeldungen zu vermeiden.

          Eine Maskierung reicht gegen Injektionsgefahr nicht aus.

          Nur Anführungszeichen helfen da auch nicht:

          $numeric = "1', secret='0";
          $id = "123' OR id > '-999999";

          $sql = "UPDATE tabelle SET public_numeric ='$numeric' WHERE id = '$id'";
          $sql2 = "UPDATE tabelle SET public_numeric =$numeric WHERE id = $id";

          Ergebnis:

          $sql == "UPDATE tabelle SET public_numeric ='1', secret='0' WHERE id = '$id'"
          -> SQL-Syntax ist OK

          $sql2 = "UPDATE tabelle SET public_numeric =1', secret='0 WHERE id = 123' OR id > '-999999"
          -> Wenn sie hier auch noch von der Datenbank akzeptiert wird, solltest Du das DBMS dringen wechseln;-)

          Nochmals: Kann mir irgendjemand _wirklich_ gute Gründe für diese Vorgehensweise nennen?

          Grüße
            Klaus

          1. Hello,

            Ausserdem stelle ich mir die Frage wie die Datenbank (unabhängig vom Hersteller oder von der Version) beispielsweise auf folgendes Statement reagiert:

            UPDATE tabelle SET
               numeric1 = '1test';
               numeric2 =  'test'
               WHERE id = '123test';

            Probier es aus und tel es hier mit!
            Das dürfte noch mehr Leute interessieren.

            Eine Maskierung reicht gegen Injektionsgefahr nicht aus.

            Nur Anführungszeichen helfen da auch nicht:

            Das habe ich auch nicht behauptet. Ich maskiere grundsätzlich

            $numeric = "1', secret='0";

            $numeric = "1', secret='0";    # wo bitteschön

            $id = "123' OR id > '-999999";

            $id = "123' OR id > '-999999"; # ist hier noch nein Problem

            ... außer, dass es natürlich Fehlermeldungen oder keine Ergebnisse gibt.

            Nochmals: Kann mir irgendjemand _wirklich_ gute Gründe für diese Vorgehensweise nennen?

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen