wassx: "Joker" bei WHERE MYSQL

Hallo!

Ich habe folgenden Code der mir Kopfzerbrechen bereitet:

$mergedQuery=sprintf("SELECT Product.product_name, Product.shop_pic_url, Product.product_shop_id, Product.product_price FROM  Product WHERE Product.use_id='%s' AND Product.product_colour='%s'", mysql_real_escape_string($cat, $link), mysql_real_escape_string($col, $link));

Es geht darum, dass in diesem Query die Variablen $col oder $cat den Wert 0 haben, was in diesem Falle (gewünscht) heissen sollte: "Nimm alles, egal was z.b. Product.prodcut_color hat"

Ich mach gerade einen Webshop mit diversen Filterkriterien und ich möchte nicht jeden Fall von 4 Kriterien mit IF/ELSE Abfragen abdecken.

Darum möchte ich fragen, ob es sowas wie eine Wildcard gibt, die ich in der form z.b. "WHERE var1=#" mir alle einträge gibt, egal was var1 als Wert hat.

Sry wenn ich da jetzt eines der Grundbasics verpasse, aber es ist schon ein Zeiterl her dass ich mit mysql herumgebastelt hab.

  1. Hallo,

    Darum möchte ich fragen, ob es sowas wie eine Wildcard gibt, die ich in der form z.b. "WHERE var1=#" mir alle einträge gibt, egal was var1 als Wert hat.

    lass die entsprechende Bedingung einfach weg.
    Sprich:
    Bau Dir eine Funktion/Methode, die Dir die gewünschte WHERE-Klausel liefert.
    Mach' es nicht so, wie man es tausendfach sieht:

    WHERE 1 AND <kette weiterer Bedingungen>

    Freundliche Grüße

    Vinzenz

    1. Hallo!

      Danke für die Antwort!

      Wenn ich das recht verstehe, soll ich halt den Query zusammenbasteln.
      Aber ich komm nicht darum um die ganzen Fälle abzuprüfen?
      z.B. productcat = 1, color=0, attrib1=0, attrib2=1
      oder productcat = 0, color=0, attrib1=1, attrib2=0
      usw....
      in prosa: wenn alles null dann SELECT *
      wenn das eine 1 das andere 0 dann....usw..
      also 4^4 IF's (hoff ich hab mich da jetzt nicht vertan) bis ich alle Fälle durch hab und dann den Query zusammenstoppeln?

      lg!
      stefan

      Hallo,

      Darum möchte ich fragen, ob es sowas wie eine Wildcard gibt, die ich in der form z.b. "WHERE var1=#" mir alle einträge gibt, egal was var1 als Wert hat.

      lass die entsprechende Bedingung einfach weg.
      Sprich:
      Bau Dir eine Funktion/Methode, die Dir die gewünschte WHERE-Klausel liefert.
      Mach' es nicht so, wie man es tausendfach sieht:

      WHERE 1 AND <kette weiterer Bedingungen>

      Freundliche Grüße

      Vinzenz

      1. @Frank: Danke! Leider muss ich da noch für PHP4 proggen (4.4.7) :/

        Hallo!

        Danke für die Antwort!

        Wenn ich das recht verstehe, soll ich halt den Query zusammenbasteln.
        Aber ich komm nicht darum um die ganzen Fälle abzuprüfen?
        z.B. productcat = 1, color=0, attrib1=0, attrib2=1
        oder productcat = 0, color=0, attrib1=1, attrib2=0
        usw....
        in prosa: wenn alles null dann SELECT *
        wenn das eine 1 das andere 0 dann....usw..
        also 4^4 IF's (hoff ich hab mich da jetzt nicht vertan) bis ich alle Fälle durch hab und dann den Query zusammenstoppeln?

        lg!
        stefan

        Hallo,

        Darum möchte ich fragen, ob es sowas wie eine Wildcard gibt, die ich in der form z.b. "WHERE var1=#" mir alle einträge gibt, egal was var1 als Wert hat.

        lass die entsprechende Bedingung einfach weg.
        Sprich:
        Bau Dir eine Funktion/Methode, die Dir die gewünschte WHERE-Klausel liefert.
        Mach' es nicht so, wie man es tausendfach sieht:

        WHERE 1 AND <kette weiterer Bedingungen>

        Freundliche Grüße

        Vinzenz

        1. @Frank: Danke! Leider muss ich da noch für PHP4 proggen (4.4.7) :/

          Naja, dann pappst du die Query halt wieder mit sprintf zusammen und verwendest trotzdem COALESCE .. und dazu NULLIF und den Surrogatwert -1.

          NULLIF(arg1, arg2) gibt NULL zurück wenn arg1 = arg2
          Und den Fall mit NULL können wir ja schon mit COALESCE behandeln

          WHERE Spalte = COALESCE(NULLIF(%s,-1), Spalte)

          -1 ist gebräuchlich, da auto_increment spalten meistens mit +1 anfangen zu zählen und du für einen Schlüsselwert -1 äussert selten Daten haben wirst, in einer normalen Welt, auch unter MySQL

          Gruss, Frank

          P.S: bitte nicht immer alles zitieren wenn du dich gar nicht darauf beziehst. TOFU Problem ;))

          1. DANKE! Das sieht sehr elegant aus! War aus Zeitgründen gedrungen es mit 4*4 ifs zu machen, werde aber deinen Vorschlag ASAP umsetzen. Dankesehr.

            Sry.. wie man sieht bin ich neu hier ;) lg!

            P.S: bitte nicht immer alles zitieren wenn du dich gar nicht darauf beziehst. TOFU Problem ;))

  2. Hi,

    wenn du PHP 5 einsetzt und dein Datenbanksystem (MYSQL) in Version ???? die Funktion COALESCE unterstützt würde ich folgendes verwenden:

    mysqli, prepared statements, parameter, NULL-Werte und

    WHERE  
            Product.use_id = COALESCE(?, Product.use_id) AND  
            Product.product_colour = COALESCE(?, Product.product_colour)
    

    COALESC() bewirkt, dass der erste NICHT-NULL Wert aus der eingeschlossenen Liste verwendet wird. Was im Falle NULL für den Parameter dann der Spaltenwert selbst wieder ist.

    Beispiel für dieses mysqli Zeugs: http://li.php.net/manual/en/mysqli-stmt.bind-param.php

    HTH, Frank