Willi: Problem

Hi,

hoffe ihr könnt mir helfen ;)

Hab folgendes Problem:

Ich wollte ne Suche mit Checkboxen machen, je nachdem welche Checkboxen man markiert, soll in den entsprechenden Feldern in der Sql Tabelle gesucht werden, dazu hatte ich mir die folgende "Where-Klausel" überlegt:
WHERE $pname LIKE '%$suche%' OR $pjahr LIKE '%$suche%'

wobei $pname und $pjahr jeweils eine Checkbox repräsentieren und den entsprechenden Tabellennamen enthalten. Das Problem ist jetzt nur, wenn man nur in einem Feld sucht, gibts nen Fehler, da die andere Variable ja leer ist. Meine Frage ist nun ob ich das irgendwie umgehen kann.
Danke im Vorraus

Willi

  1. Hi,

    meine bevorzugte Variante ist der dynamische Zusammenbau des SQL-Statements - Achtung, PHP-Fähigkeiten stark eingerostet...
    (Angenommen die Checkboxen "heißen" so und senden den Wert "true")

    $spalte1 = ($checkbox1 == "true") ? "OR spalte1 LIKE '%$suche%'" : "";
    $spalte2 = ($checkbox2 == "true") ? "OR spalte2 LIKE '%$suche%'" : "";

    $sql = "SELECT ... FROM ... WHERE 0=1 $spalte1 $spalte2 ..."
    (0=1 nur für den Fall, das keine Checkbox gesetzt ist; in diesem Fall werden keine Sätze zurück gegeben)

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Moin!

      meine bevorzugte Variante ist der dynamische Zusammenbau des SQL-Statements - Achtung, PHP-Fähigkeiten stark eingerostet...
      (Angenommen die Checkboxen "heißen" so und senden den Wert "true")

      $spalte1 = ($checkbox1 == "true") ? "OR spalte1 LIKE '%$suche%'" : "";
      $spalte2 = ($checkbox2 == "true") ? "OR spalte2 LIKE '%$suche%'" : "";

      $sql = "SELECT ... FROM ... WHERE 0=1 $spalte1 $spalte2 ..."
      (0=1 nur für den Fall, das keine Checkbox gesetzt ist; in diesem Fall werden keine Sätze zurück gegeben)

      Das einzige, was hier zwingend verbessert werden muß: $suche muß durch mysql_real_escape_string() gejagt werden, um SQL-Injections zu verhindern - das gilt außerdem für alle anderen Werte, die vom Benutzer übernommen werden.

      Sollte magic_quotes_gpc eingeschaltet sein, ist vorher bei allen Feldern stripslashes() anzuwenden, da sonst das Escaping unnötig verdoppelt und nach den falschen Strings gesucht wird.

      Als Schönheitsmaßnahme könnte man das Erscheinen von "WHERE 0=1" auch noch eliminieren, indem man "WHERE" mit IF reinsetzt - und die Spaltendefinitionen könnten flexibler in ein Array geschrieben und mit implode() zusammengesetzt werden.

        
      $spalte = array();  
      if ($_POST['checkbox1'] == "true") {$spalte[] = "spalte1 LIKE '%".mysql_real_escape_string($_POST['suche'])."%'"};  
      if ($_POST['checkbox2'] == "true") {$spalte[] = "spalte2 LIKE '%".mysql_real_escape_string($_POST['suche'])."%'"};  
        
      $sql = "SELECT ... FROM ... ".(!empty($spalte)?"WHERE ".implode(" OR ",$spalte):"") ..."  
      
      

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. So - wollte mich nur bei euch beiden für die Hilfe bedanken - nach nen "bisschen" Fummelei hats geklappt ;) .
        War nur nen kleiner Fehler drin, da die Checkboxen nach == "on" geprüft werden müssen. Aber ansonsten astreine Hilfe.

        Willi

        1. Moin!

          War nur nen kleiner Fehler drin, da die Checkboxen nach == "on" geprüft werden müssen. Aber ansonsten astreine Hilfe.

          Richtig, wenn die Checkbox nur einen Namen, aber keinen Value hat, wird "on" gesendet.

          Ich persönlich finde das nicht schön, deshalb setze ich immer auch einen passenden Value. Und sei es nur value="1".

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
          1. Richtig, wenn die Checkbox nur einen Namen, aber keinen Value hat, wird "on" gesendet.

            Ich persönlich finde das nicht schön, deshalb setze ich immer auch einen passenden Value. Und sei es nur value="1".

            • Sven Rautenberg

            Ahso, jop hast Recht "fühlt" sich schon irgendwie besser an mit "true" ^^
            Ne kleine Frage hätt ich aber trotzdem noch ;)

            $sql = "SELECT ... FROM ... ".(!empty($spalte)?"WHERE ".implode(" OR ",$spalte):"") ..."

            wofür  steht der ':' und die beiden '""' am Ende der Anweisung

            1. Hallo Willi.

              Ne kleine Frage hätt ich aber trotzdem noch ;)

              $sql = "SELECT ... FROM ... ".(!empty($spalte)?"WHERE ".implode(" OR ",$spalte):"") ..."

              wofür  steht der ':' und die beiden '""' am Ende der Anweisung

              Das ist die Kurznotation einer Abfrage und ist wie folgt aufgebaut:

                 (zu_prüfender_ausdruck ? tue_wenn_wahr      : tue_wenn_falsch)  
              if (zu_prüfender_ausdruck) {tue_wenn_wahr} else {tue_wenn_falsch}
              

              Die Klammern um das Konstrukt dienen der Abgrenzung vom umliegenden Code.

              Einen schönen Dienstag noch.

              Gruß, Ashura

              --
              sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
              mathbr:del.icio.us/ mathbr:w00t/
              1. Hallo Ashura,

                Das ist die Kurznotation einer Abfrage und ist wie folgt aufgebaut:

                Der Trinitäts-Operator ist auch bei den Vergleichs-Operatoren (unter der Tabelle) beschrieben - du musst also nicht auf einen Benutzerkommentar verweisen (wobei die idR ja auch lesenswert sind).

                Grüße aus Nürnberg
                Tobias

                1. Hallo Tobias.

                  Der Trinitäts-Operator ist auch bei den Vergleichs-Operatoren (unter der Tabelle) beschrieben - du musst also nicht auf einen Benutzerkommentar verweisen (wobei die idR ja auch lesenswert sind).

                  Ah, dort ist dieser dokumentiert.
                  (Zumindest ein Querverweis von if zum Trinitäts-Operator wäre meiner Meinung nach nicht schlecht.)

                  Einen schönen Dienstag noch.

                  Gruß, Ashura

                  --
                  sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                  mathbr:del.icio.us/ mathbr:w00t/
  2. Hallo Willi,

    denk doch bei der Formulierung des Topic bitte auch an die, die dein Posting später eventuell lesen und wähle einen aussagekräftigen Titel. Postings, die in der Forumshauptdatei nur mit dem Topic "Problem" oder "Brauche Hilfe!" aufgeführt sind, haben generell geringere Aussichten auf Erfolg als solche, die das Problem bereits im Topic kurz und knapp auf den Punkt bringen, etwa "(PHP) Wahlweise verschiedene SQL-Tabellen durchsuchen".

    Schönen Tag noch,
     Martin

    --
    why the heck do you jerk think, that wir ein doppelposting nicht bemerken, wenn you zwischendurch the sprache wechselst?
      (wahsaga, http://forum.de.selfhtml.org/?t=110904&m=697006, leider nicht archiviert)
    1. Hi,

      denk doch bei der Formulierung des Topic bitte auch an die, die dein Posting später eventuell lesen und wähle einen aussagekräftigen Titel. Postings, die in der Forumshauptdatei nur mit dem Topic "Problem" oder "Brauche Hilfe!" aufgeführt sind, haben generell geringere Aussichten auf Erfolg als solche, die das Problem bereits im Topic kurz und knapp auf den Punkt bringen, etwa "(PHP) Wahlweise verschiedene SQL-Tabellen durchsuchen".

      du bist zu anspruchsvoll. Was das an Zeit kosten würde.

      Schöne Grüße
      Julian

      1. echo $begrüßung;

        Was das an Zeit kosten würde.

        Vermutlich kostet das ein Bruchteil der Verzögerung mit der potentielle Beantworter später drauf aufmerksam werden. Das ist natürlich unvertretbar ...

        echo "$verabschiedung $name";

    2. Hallo Martin!

      […]

      Wo wir schonmal beim Postingtitel wären: Besonders schön sind auch
      immer die Leerzeichen am Ende des Themas. Wäre das nicht mit einer
      „abschneidenden“ Funktion zu beheben?

      ℆, ℒacℎgas

      --
      Bei der intendierten Realisierung der linguistischen Simplifizierung
      des regionalen Idioms resultiert die Evidenz der Opportunität extrem
      apparent, den elaborierten und quantitativ opulenten Usus nicht assi-
      milierter Xenologien konsequent zu eliminieren!
      1. Hi Lachgas,

        Wo wir schonmal beim Postingtitel wären: Besonders schön sind auch
        immer die Leerzeichen am Ende des Themas. Wäre das nicht mit einer
        „abschneidenden“ Funktion zu beheben?

        Ich könnte mir nicht vorstellen, warum das nicht gehen sollte, melde
        es doch als Feature Request ;-)

        MfG, Dennis.

    3. Hi Martin,

      da hast du natürlich recht, sorry von hierraus. Das Problem war das mir erst keine passende Überschrift einfiel und ich deswegen dachte schreibst erstmal nur "Problem" hin und guckst dir anschliessend die Beschreibung an - dann fällt dir bestimmt was ein. Nur hat ich das  natürlich nicht mehr im Kopf nachdem ich die Beschreibung fertig hatte (ja es war spät gestern ;) ). Als ich dann den Fehler bemerkte war es (traurig aber wahr) bereits zu spät.
      So sitze ich jetzt hier in tiefer Demut und hoffe auf ein wenig Nachsicht. Also nochmal dickes Sorry.

      Willi