Sascha: Was falsch an AND bzw. OR Suchabfrage /-formular?

Hallo,

ich will unter MySQL per PHP-Script eine Suchfunktion einbauen, und zwar mit folgenden Bedingungen:

  • 1 Suchbegriff alleine
  • 2 Suchbegriffe mit Operator AND
  • 2 Suchbegriffe mit Operator OR

Dazu ist folgendes noch anzumerken:
Es soll pro Wort in 2 Feldern / Spalten gesucht werden, und zwar in titel und beschreibung.

Hierzu habe ich folgende Scripte geschrieben:

Inhalt von Suchformularseite:

<?php
require("config-softdatabase.php4");

echo "<h1><font color="#FFFF00" face="Arial">Suchen</font></h1>
<form method="POST" action="index.php4">
<input type=hidden name="session" value="gefunden_mich.php4">
    <p><font face="Arial" color="#FFFF00" size="2">Nach welchem Begriff soll gesucht werden?<br><br>
1. Suchbegriff:  
<input type="text" name="wort1" size="40" maxlength="490"><br>
<br>
Operator (Bitte wählen!):   <select name="operator1" size="1">
    <option value="">----
    <option value="UND">UND
    <option value="ODER">ODER
   </option>
  </select><br><br>
2. Suchbegriff:  
<input type="text" name="wort2" size="40" maxlength="490"><br>
  <p><font face="Arial" size="2"><input type="submit" value="Abschicken" name="B1"><input type="reset" value="Zurücksetzen" name="B2"></font></p>
</form>
";
?>

Inhalt von Verarbeitungsscript:

[....]

// Suche für 1 Wort ohne AND bzw. OR
if ($operator1 == "" AND $wort2 == ""){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%'",$verbindung);
}

// Suche für 2 Wörter mit Operator AND
if ($operator1 == "UND"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}

// Suche für 2 Wörter mit Operator AND
if ($operator1 == "ODER"){
$daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
}

//$a= fetch_result($datencounter);
//echo "<div align=center><font color="#ffff00"><h3>Es wurden $a //Einträge gefunden ... </h3></font></div>";

while($row = mysql_fetch_array($daten)) { [....]

=> Ergebnis:

Eingabe von 1 Suchbegriff im Formularfeld für 1. Wort
=> funktioniert bestens und fehlerfrei

Eingabe von 2 Suchbegriffen im Formularfeld für 1. Wort und 2. Wort (je 1 Wort/Feld) mit Operatorauswahl AND (UND) bzw. OR (ODER)
führt zu einem Fehler!
=> Warning: Supplied argument is not a valid MySQL result resource in ... [zeigt auf while($row.... ]

Kann mir jemand sagen was ich falsch gemacht habe, bzw. einen Tipp zur Problemlösung nennen? Im voraus besten Dank.

Mfg.

Sascha

  1. Hallo,

    if ($operator1 == "UND"){
    $daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);

    Oft hilt es, mal ein bißchen umzuformatieren:

    SELECT * FROM downloadprogramme
        WHERE titel LIKE '%$wort1%'
        OR    beschreibung LIKE '%$wort1%'
        AND   LIKE '%$wort2%'
        OR    beschreibung LIKE '%$wort2%'

    uups, In Zeile 4 hat sich ein Fehler eingeschlichen;-)

    Abgesehen davon, Du solltest wenn, dann schon etwas schalteln, weil ich denke eigentlich willst Du ja  daß wort1 und wort2 in entweder  titel oder beschreibung vorkommen. Hui klingt das jetzt kompliziert.
    Also
    SELECT * FROM downloadprogramme
        WHERE ( titel LIKE '%$wort1%'
                OR beschreibung LIKE '%$wort1%')
        AND   ( titel LIKE '%$wort2%'
                OR beschreibung LIKE '%$wort2%')

    Und noch was,
    wenn Du

    SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
        WHERE  suchtext LIKE '%$wort1%'
        AND    suchtext LIKE '%$wort2%'

    b
    verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
    und viertens von mir mal so hingeschrieben und nicht getestet :-(

    Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.

    if ($operator1 == "ODER"){
    $daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
    }

    "SELECT * FROM downloadprogramme
         WHERE titel LIKE '%$wort1%'
         OR beschreibung LIKE '%$wort1%'
         OR LIKE '%$wort2%'
         OR beschreibung LIKE '%$wort2%'"

    Und schon wieder die vermaledeite Zeile 4.

    Und noch was,
    wenn Du

    SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
        WHERE  suchtext LIKE '%$wort1%'
        AND    suchtext LIKE '%$wort2%'

    bzw.

    SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
        WHERE  suchtext LIKE '%$wort1%'
        OR    suchtext LIKE '%$wort2%'

    verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
    und viertens von mir mal so hingeschrieben und nicht getestet :-(

    Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.

    Grüße
      Klaus

    PS.: vielleicht siehst Du Dir auch noch REGEXP/RLIKE in der Doku an. Steht irgendwo bei der Whereklausel, nicht weit vom LIKE

    1. Hallo Klaus,

      also besten Dank.

      Das war mal eine Antwort, mir fehlen echt die Worte, die war sehr gut! Zum einen war sie sehr lehrreich fand ich, zum anderen wurde das Problem beseitigt und man hat zugleich auch noch was verstanden und gelernt dabei ...

      ... mach weiter so!

      Mfg.

      Sascha

      Hallo,

      if ($operator1 == "UND"){
      $daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%' OR beschreibung LIKE '%$wort1%' AND LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);

      Oft hilt es, mal ein bißchen umzuformatieren:

      SELECT * FROM downloadprogramme
          WHERE titel LIKE '%$wort1%'
          OR    beschreibung LIKE '%$wort1%'
          AND   LIKE '%$wort2%'
          OR    beschreibung LIKE '%$wort2%'

      uups, In Zeile 4 hat sich ein Fehler eingeschlichen;-)

      Abgesehen davon, Du solltest wenn, dann schon etwas schalteln, weil ich denke eigentlich willst Du ja  daß wort1 und wort2 in entweder  titel oder beschreibung vorkommen. Hui klingt das jetzt kompliziert.
      Also
      SELECT * FROM downloadprogramme
          WHERE ( titel LIKE '%$wort1%'
                  OR beschreibung LIKE '%$wort1%')
          AND   ( titel LIKE '%$wort2%'
                  OR beschreibung LIKE '%$wort2%')

      Und noch was,
      wenn Du

      SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
          WHERE  suchtext LIKE '%$wort1%'
          AND    suchtext LIKE '%$wort2%'

      b
      verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
      und viertens von mir mal so hingeschrieben und nicht getestet :-(

      Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.

      if ($operator1 == "ODER"){
      $daten = MYSQL_QUERY( "SELECT * FROM downloadprogramme WHERE titel LIKE '%$wort1%'OR beschreibung LIKE '%$wort1%'OR LIKE '%$wort2%' OR beschreibung LIKE '%$wort2%'",$verbindung);
      }

      "SELECT * FROM downloadprogramme
           WHERE titel LIKE '%$wort1%'
           OR beschreibung LIKE '%$wort1%'
           OR LIKE '%$wort2%'
           OR beschreibung LIKE '%$wort2%'"

      Und schon wieder die vermaledeite Zeile 4.

      Und noch was,
      wenn Du

      SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
          WHERE  suchtext LIKE '%$wort1%'
          AND    suchtext LIKE '%$wort2%'

      bzw.

      SELECT alle,felder,der,tabelle,und,CONCAT(titel,beschreibung) suchtext FROM downloadprogramme
          WHERE  suchtext LIKE '%$wort1%'
          OR    suchtext LIKE '%$wort2%'

      verwendest, ist das erst mal hübscher, zweitens übersichtlicher, drittens weniger fehleranfallig ...
      und viertens von mir mal so hingeschrieben und nicht getestet :-(

      Abgesehen davon, daß ich '*' nicht so gerne verwende, da es mir schon zu viele Probleme bereitet hat.

      Grüße
        Klaus

      PS.: vielleicht siehst Du Dir auch noch REGEXP/RLIKE in der Doku an. Steht irgendwo bei der Whereklausel, nicht weit vom LIKE

    2. Hallo,

      *grmpflml* Ich denke ich sollte wieder an meiner Cut&Paste-Technik arbeiten:-(
      Sowas aber auch. Naja, also wenn Ihr die doppelten Zeilen ins richtige Verhältnis bringt, könnte das Ganze auch wieder Sinn machen.

      Grüße
        Klaus