Problem mit geparster WHERE Bedingung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit geparster WHERE Bedingung

    Hab ein parser für eine WHERE Bedingung geschrieben.
    OR wird als erstes behandelt, gefolgt von AND / NOT (gleichwertig).
    Als Ergebnis vom parser bekomm ich (SELECT wurde ergänzt):
    PHP-Code:
    SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE UPPER('%co%')) OR 
    (
    UPPER(serverlink.directoryLIKE UPPER('%co%')) AND (UPPER(serverlink.file
    LIKE UPPER('%val%')) OR (UPPER(serverlink.directoryLIKE UPPER('%val%')))

    Array
    (
        [
    0] => Array
            (
                [
    0] => 1
                
    [id] => 1
                
    [1] => C:/j2sdk1.4.2/doc/docs/api/java/awt/class-use/
                [
    path] => C:/j2sdk1.4.2/doc/docs/api/java/awt/class-use/
                [
    2] => 
                [
    directory] => 
                [
    3] => GraphicsConfiguration.html
                
    [file] => GraphicsConfiguration.html
            
    )

        [
    1] => Array
            (
            ....
                [
    2] => 
                [
    directory] => 
                [
    3] => GraphicsConfigTemplate.html
                
    [file] => GraphicsConfigTemplate.html
            
    )
            ...
        [
    994] => Array
            (
                ....
                [
    2] => 
                [
    directory] => 
                [
    3] => constant-values.html
                
    [file] => constant-values.html
            

    Wieso bekomm ich z.B. GraphicsConfiguration.html im Ergebnis zu Gesicht? Da ist doch "val" überhaupt nicht drin?

    Und warum liefert mir:
    PHP-Code:
    SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE
    UPPER
    ('%val%')) OR (UPPER(serverlink.directoryLIKE
    UPPER
    ('%val%')) NOT (UPPER(serverlink.fileLIKE
    UPPER
    ('%co%')) OR (UPPER(serverlink.directoryLIKE UPPER('%co%'))) 
    überhaupt kein Ergebnis: Wenigstens im letzterem müsste es doch vorhanden sein.

    Mfg Markus
    Zuletzt geändert von markusschmitt; 22.09.2003, 15:00.

  • #2
    kleines klammerproblem? sollte das nicht so aussehen:
    PHP-Code:
    SELECT FROM serverlink WHERE
    (
     (
     
    UPPER(serverlink.fileLIKE UPPER('%co%')
     OR
     
    UPPER(serverlink.directoryLIKE UPPER('%co%')
     )
     AND
     (
      
    UPPER(serverlink.fileLIKE UPPER('%val%')
      OR
      
    UPPER(serverlink.directoryLIKE UPPER('%val%')
     )

    Kissolino.com

    Kommentar


    • #3
      Hab's mal von Hand nachgetippt
      PHP-Code:
      SELECT FROM serverlink WHERE
      (
       (
         
      UPPER(serverlink.fileLIKE UPPER('%co%'
          OR 
         
      UPPER (serverlink.directoryLIKE UPPER ('%co%')
        ) 
        AND
        (
          
      UPPER(serverlink.fileLIKE UPPER ('%val%')
           OR
          
      UPPER (serverlink.directoryLIKE UPPER ('%val%')
        )

      Ergebnis: NICHTS ????????? bzw. in PHPmyAdmin bekomm ich 20 results nur wenn ichs im normal ausführe "nichts".
      Wenigstens der unter Datensatz hätte doch ausgegeben werden müssen.

      Mfg Markus
      Zuletzt geändert von markusschmitt; 22.09.2003, 15:23.

      Kommentar


      • #4
        ich weiss ja nicht so genau, was du haben willst, aber and bindet stärker als or demzufolge sollte bei meiner auflistung zumindest "constant-values.html" gefunden werden, da in der spalte "file" sowohl "val" als auch "co" im begriff enthalten sind.
        lass mal die zwei äusseren klammern weg:
        PHP-Code:
        SELECT FROM serverlink WHERE
        //(
         
        (
           
        UPPER(serverlink.fileLIKE UPPER('%co%'
            OR 
           
        UPPER (serverlink.directoryLIKE UPPER ('%co%')
          ) 
          AND
          (
            
        UPPER(serverlink.fileLIKE UPPER ('%val%')
             OR
            
        UPPER (serverlink.directoryLIKE UPPER ('%val%')
          )
        //) 
        Kissolino.com

        Kommentar


        • #5
          OK habs nochmal umgeschrieben.
          Hab deins 1 zu 1 kopiert. PHPmyAdmin liefert mir 20 richtige Results. Wenn ich es jedoch im Skript ausführe bekomm ich gar kein Ergebnis. Woran könnte das liegen?
          Hab mal alles relevate geschwind zusammengeschrieben.
          PHP-Code:
          // Parser Ergebnis

          SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE UPPER('%co%')) OR 
          (
          UPPER(serverlink.directoryLIKE UPPER('%co%')) AND (UPPER(serverlink.file
          LIKE UPPER('%val%')) OR (UPPER(serverlink.directoryLIKE UPPER('%val%')))

          // Abgeschriebenes Ergebnis:

          SELECT FROM serverlink WHERE(UPPER(serverlink.fileLIKE UPPER('%co%') OR 
          UPPER (serverlink.directoryLIKE UPPER ('%co%')) AND (UPPER(serverlink.file
          LIKE UPPER ('%val%') OR UPPER (serverlink.directoryLIKE UPPER ('%val%'))


          ausführende Datei

          include("functions.inc.php");
          include(
          "class_db.inc.php");
          $string "co AND val";
          $arr = array("serverlink.file","serverlink.directory");
          if(
          $home parse_where($string,$arr,2))
          {
              
          $sql "SELECT * FROM serverlink ".$home;
              echo 
          $sql."<br><br>";
              
          $sql "SELECT * FROM serverlink WHERE(UPPER(serverlink.file) LIKE UPPER('%co%') OR UPPER (serverlink.directory) LIKE UPPER ('%co%')) AND (UPPER(serverlink.file) LIKE UPPER ('%val%') OR UPPER (serverlink.directory) LIKE UPPER ('%val%'))";
              echo 
          $sql."<br>";
              
          $db = new MySQL;
              if(
          $db->init())
              {
                  
          $result $db->select($sql);
                  echo 
          "<pre>";
                  
          print_r($result);
                  echo 
          "</pre>";
              }
              else
              {echo 
          "Fehler";}
          }
          else
          {
              echo 
          "FEHLER";
          }

          DB Select Funktion:

          function 
          select($sql="")
          {
              if(empty(
          $sql)) {return false;}
              if(!
          eregi("^select",$sql))
              {
                  echo 
          "<h2>Falscher Befehl!</h2>\n";
                  return 
          false;
              }
              if(empty(
          $this->CONN)) { return false; }
              
          $conn $this->CONN;
              
          $results mysql_query($sql,$conn);
              if((!
          $results) or (empty($results)))
              {
                  return 
          false;
              }
              
          $count 0;
              
          $data = array();
              while(
          $row mysql_fetch_array($results))
              {
                  
          $data[$count] = $row;
                  
          $count++;
              }
              return 
          $data;

          Kommentar


          • #6
            OK habs nochmal umgeschrieben.
            Hab deins 1 zu 1 kopiert. PHPmyAdmin liefert mir 20 richtige Results. Wenn ich es jedoch im Skript ausführe bekomm ich gar kein Ergebnis. Woran könnte das liegen?
            Hab mal alles relevate geschwind zusammengeschrieben.
            PHP-Code:
            // Parser Ergebnis

            SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE UPPER('%co%')) OR 
            (
            UPPER(serverlink.directoryLIKE UPPER('%co%')) AND (UPPER(serverlink.file
            LIKE UPPER('%val%')) OR (UPPER(serverlink.directoryLIKE UPPER('%val%')))

            // Abgeschriebenes Ergebnis:

            SELECT FROM serverlink WHERE(UPPER(serverlink.fileLIKE UPPER('%co%') OR 
            UPPER (serverlink.directoryLIKE UPPER ('%co%')) AND (UPPER(serverlink.file
            LIKE UPPER ('%val%') OR UPPER (serverlink.directoryLIKE UPPER ('%val%'))


            ausführende Datei

            include("functions.inc.php");
            include(
            "class_db.inc.php");
            $string "co AND val";
            $arr = array("serverlink.file","serverlink.directory");
            if(
            $home parse_where($string,$arr,2))
            {
                
            $sql "SELECT * FROM serverlink ".$home;
                echo 
            $sql."<br><br>";
                
            $sql "SELECT * FROM serverlink WHERE(UPPER(serverlink.file) LIKE UPPER('%co%') OR UPPER (serverlink.directory) LIKE UPPER ('%co%')) AND (UPPER(serverlink.file) LIKE UPPER ('%val%') OR UPPER (serverlink.directory) LIKE UPPER ('%val%'))";
                echo 
            $sql."<br>";
                
            $db = new MySQL;
                if(
            $db->init())
                {
                    
            $result $db->select($sql);
                    echo 
            "<pre>";
                    
            print_r($result);
                    echo 
            "</pre>";
                }
                else
                {echo 
            "Fehler";}
            }
            else
            {
                echo 
            "FEHLER";
            }

            DB Select Funktion:

            function 
            select($sql="")
            {
                if(empty(
            $sql)) {return false;}
                if(!
            eregi("^select",$sql))
                {
                    echo 
            "<h2>Falscher Befehl!</h2>\n";
                    return 
            false;
                }
                if(empty(
            $this->CONN)) { return false; }
                
            $conn $this->CONN;
                
            $results mysql_query($sql,$conn);
                if((!
            $results) or (empty($results)))
                {
                    return 
            false;
                }
                
            $count 0;
                
            $data = array();
                while(
            $row mysql_fetch_array($results))
                {
                    
            $data[$count] = $row;
                    
            $count++;
                }
                return 
            $data;

            Kommentar


            • #7
              OK habs nochmal umgeschrieben.
              Hab deins 1 zu 1 kopiert. PHPmyAdmin liefert mir 20 richtige Results. Wenn ich es jedoch im Skript ausführe bekomm ich gar kein Ergebnis. Woran könnte das liegen?
              Hab mal alles relevate geschwind zusammengeschrieben.
              PHP-Code:
              // Parser Ergebnis

              SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE UPPER('%co%')) OR 
              (
              UPPER(serverlink.directoryLIKE UPPER('%co%')) AND (UPPER(serverlink.file
              LIKE UPPER('%val%')) OR (UPPER(serverlink.directoryLIKE UPPER('%val%')))

              // Abgeschriebenes Ergebnis:

              SELECT FROM serverlink WHERE(UPPER(serverlink.fileLIKE UPPER('%co%') OR 
              UPPER (serverlink.directoryLIKE UPPER ('%co%')) AND (UPPER(serverlink.file
              LIKE UPPER ('%val%') OR UPPER (serverlink.directoryLIKE UPPER ('%val%'))


              ausführende Datei

              include("functions.inc.php");
              include(
              "class_db.inc.php");
              $string "co AND val";
              $arr = array("serverlink.file","serverlink.directory");
              if(
              $home parse_where($string,$arr,2))
              {
                  
              $sql "SELECT * FROM serverlink ".$home;
                  echo 
              $sql."<br><br>";
                  
              $sql "SELECT * FROM serverlink WHERE(UPPER(serverlink.file) LIKE UPPER('%co%') OR UPPER (serverlink.directory) LIKE UPPER ('%co%')) AND (UPPER(serverlink.file) LIKE UPPER ('%val%') OR UPPER (serverlink.directory) LIKE UPPER ('%val%'))";
                  echo 
              $sql."<br>";
                  
              $db = new MySQL;
                  if(
              $db->init())
                  {
                      
              $result $db->select($sql);
                      echo 
              "<pre>";
                      
              print_r($result);
                      echo 
              "</pre>";
                  }
                  else
                  {echo 
              "Fehler";}
              }
              else
              {
                  echo 
              "FEHLER";
              }

              DB Select Funktion:

              function 
              select($sql="")
              {
                  if(empty(
              $sql)) {return false;}
                  if(!
              eregi("^select",$sql))
                  {
                      echo 
              "<h2>Falscher Befehl!</h2>\n";
                      return 
              false;
                  }
                  if(empty(
              $this->CONN)) { return false; }
                  
              $conn $this->CONN;
                  
              $results mysql_query($sql,$conn);
                  if((!
              $results) or (empty($results)))
                  {
                      return 
              false;
                  }
                  
              $count 0;
                  
              $data = array();
                  while(
              $row mysql_fetch_array($results))
                  {
                      
              $data[$count] = $row;
                      
              $count++;
                  }
                  return 
              $data;

              Kommentar


              • #8
                OK habs nochmal umgeschrieben.
                Hab deins 1 zu 1 kopiert. PHPmyAdmin liefert mir 20 richtige Results. Wenn ich es jedoch im Skript ausführe bekomm ich gar kein Ergebnis. Woran könnte das liegen?
                Hab mal alles relevate geschwind zusammengeschrieben.
                PHP-Code:
                // Parser Ergebnis

                SELECT FROM serverlink WHERE ( (UPPER(serverlink.fileLIKE UPPER('%co%')) OR 
                (
                UPPER(serverlink.directoryLIKE UPPER('%co%')) AND (UPPER(serverlink.file
                LIKE UPPER('%val%')) OR (UPPER(serverlink.directoryLIKE UPPER('%val%')))

                // Abgeschriebenes Ergebnis:

                SELECT FROM serverlink WHERE(UPPER(serverlink.fileLIKE UPPER('%co%') OR 
                UPPER (serverlink.directoryLIKE UPPER ('%co%')) AND (UPPER(serverlink.file
                LIKE UPPER ('%val%') OR UPPER (serverlink.directoryLIKE UPPER ('%val%'))


                ausführende Datei

                include("functions.inc.php");
                include(
                "class_db.inc.php");
                $string "co AND val";
                $arr = array("serverlink.file","serverlink.directory");
                if(
                $home parse_where($string,$arr,2))
                {
                    
                $sql "SELECT * FROM serverlink ".$home;
                    echo 
                $sql."<br><br>";
                    
                $sql "SELECT * FROM serverlink WHERE(UPPER(serverlink.file) LIKE UPPER('%co%') OR UPPER (serverlink.directory) LIKE UPPER ('%co%')) AND (UPPER(serverlink.file) LIKE UPPER ('%val%') OR UPPER (serverlink.directory) LIKE UPPER ('%val%'))";
                    echo 
                $sql."<br>";
                    
                $db = new MySQL;
                    if(
                $db->init())
                    {
                        
                $result $db->select($sql);
                        echo 
                "<pre>";
                        
                print_r($result);
                        echo 
                "</pre>";
                    }
                    else
                    {echo 
                "Fehler";}
                }
                else
                {
                    echo 
                "FEHLER";
                }

                DB Select Funktion:

                function 
                select($sql="")
                {
                    if(empty(
                $sql)) {return false;}
                    if(!
                eregi("^select",$sql))
                    {
                        echo 
                "<h2>Falscher Befehl!</h2>\n";
                        return 
                false;
                    }
                    if(empty(
                $this->CONN)) { return false; }
                    
                $conn $this->CONN;
                    
                $results mysql_query($sql,$conn);
                    if((!
                $results) or (empty($results)))
                    {
                        return 
                false;
                    }
                    
                $count 0;
                    
                $data = array();
                    while(
                $row mysql_fetch_array($results))
                    {
                        
                $data[$count] = $row;
                        
                $count++;
                    }
                    return 
                $data;

                Kommentar


                • #9
                  Komisch: Hab nach UPPER die Leerzeichen entfernt und jetzt funktionierts.

                  Danke für die Hilfe

                  Noch ne Frage: Wo finde ich die Wertgkeitstabelle von OR, NOT usw. Hab in der Doc von mysql.de schon nachgeschaut aber nichts gefunden.


                  Mfg Markus

                  Kommentar


                  • #10
                    Hab nochmal ne Frage bezüglich der Reihenfolge und der Klammerung.
                    Also wenn ich z.B. 2 OR und 2 And Bedingungen habe, soll alles in AND zwingend sein.
                    Nur wie erreiche ich dass?
                    So klappt es nicht
                    PHP-Code:
                    SELECT 
                    FROM serverlink
                    WHERE 
                    (
                    UPPERserverlink.file 
                    LIKE UPPER'%ex%' ) OR UPPERserverlink.directory 
                    LIKE UPPER'%ex%' 
                    ) AND (
                    UPPERserverlink.file 
                    LIKE UPPER'%val%' ) OR UPPERserverlink.directory 
                    LIKE UPPER'%val%' 
                    ) OR (
                    UPPERserverlink.file 
                    LIKE UPPER'%co%' ) OR UPPERserverlink.directory 
                    LIKE UPPER'%co%' 
                    ) OR (
                    UPPERserverlink.file 
                    LIKE UPPER'%o%' ) OR UPPERserverlink.directory 
                    LIKE UPPER'%o%' 

                    Wie müsste die Abfrage richtig lauten?
                    (AND muss zwingend sein. Von Or muss in dem Fall nur eins zutreffen.)

                    Mfg Markus

                    Kommentar


                    • #11
                      Code:
                      WHERE
                        (bedingung1-1 OR bedingung 1-2)
                        AND
                        (bedingung 2-1 OR bedingung 2-2)
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Also ich muss dann alle OR AND sowie NOT Bedingungen zusammenfassen.

                        OK Danke

                        Mfg Markus

                        Kommentar

                        Lädt...
                        X