Problem mit geparster WHERE Bedingung

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Last edited by markusschmitt; 22-09-2003, 14: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

    Comment


    • #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
      Last edited by markusschmitt; 22-09-2003, 14:23.

      Comment


      • #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

        Comment


        • #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;

          Comment


          • #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;

            Comment


            • #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;

              Comment


              • #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;

                Comment


                • #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

                  Comment


                  • #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

                    Comment


                    • #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...

                      Comment


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

                        OK Danke

                        Mfg Markus

                        Comment

                        Working...
                        X