Mehrere Zeichenketten ersetzen; Überschneidungen vermeiden

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

  • Mehrere Zeichenketten ersetzen; Überschneidungen vermeiden

    Ich habe eine String-Variable aus einem Suchformular,...

    z.B. "((Biertrinker OR Bierliebhaber) AND (Bier))"

    ... in welchem ich die Suchwörter um SQL-Angaben ergänzen will. Das Ergebnis soll so aussehen:

    "WHERE ( (Feld_1 LIKE '%Biertrinker%' OR Feld_2 LIKE '%Biertrinker%' ) OR (Feld_1 LIKE '%Bierliebhaber%' OR Feld_2 LIKE '%Bierliebhaber%' ) ) AND ((Feld_1 LIKE '%Bier%' OR Feld_2 LIKE '%Bier%' ) )"

    Das Problem dabei ist, daß das Suchwort "Bier" auch in "Biertrinker" und "Bierliebhaber" ersetzt würde. Ich müßte also jeweils die anderen Suchbegriffe beim Ersetzen des aktuellen ausschließen. Kann mir bitte jemand den rettenden Hinweis geben ?

  • #2
    WHERE ( (Feld_1 LIKE '%Biertrinker%' OR Feld_2 LIKE '%Biertrinker%' ) OR (Feld_1 LIKE '%Bierliebhaber%' OR Feld_2 LIKE '%Bierliebhaber%' ) ) AND ((Feld_1 LIKE '%Bier%' OR Feld_2 LIKE '%Bier%' ) )
    ist doch ziemlich unsinnig!
    Entweder
    PHP-Code:
    WHERE ( (Feld_1 LIKE 'Biertrinker' OR Feld_2 LIKE 'Biertrinker' ) OR 
    (
    Feld_1 LIKE 'Bierliebhaber' OR Feld_2 LIKE 'Bierliebhaber' ) ) AND 
    ((
    Feld_1 LIKE 'Bier' OR Feld_2 LIKE 'Bier' ) )
    oder
    PHP-Code:
    WHERE ( (Feld_1 LIKE 'Biertrinker%' OR Feld_2 LIKE 'Biertrinker%' ) OR 
    (
    Feld_1 LIKE 'Bierliebhaber%' OR Feld_2 LIKE 'Bierliebhaber%' ) ) AND
    ((
    Feld_1 LIKE 'Bier' OR Feld_2 LIKE 'Bier' ) )
    oder einfach nur
    PHP-Code:
    Feld_1 LIKE '%Bier%' OR Feld_2 LIKE '%Bier%' 
    Was willst du bei dem Ganzen bezwecken, bzw. warum willst du so unsinnig suchen?

    lg, bernie

    Kommentar


    • #3
      Danke, aber Sinngehalt der SQL-Formulierung ist hier zweitrangig. Mir geht´s dabei erstmal nur um die String-Operation, mit der ich die Suchwörter austausche. Ich will verhindern, daß, wenn einer der Suchbegriffe in einem weiteren Suchbegriff vorkommt, er in diesem auch ausgetauscht wird.

      Um mich nochmal auf mein Beispiel zu beziehen: "Bier" darf in "Bierliebhaber" oder "Biertrinker" nicht ersetzt werden.

      Oder verallgemeinert: Das Suchwort darf nur dann ersetzt werden, wenn es nicht Teil eines der anderen Suchwörter ist.


      Nachtrag: Die Suchwörter sind von mir nicht beeinflußbar. Die kommen vom Anwender, über´s Suchformular.
      Zuletzt geändert von Wodan; 28.09.2004, 00:22.

      Kommentar


      • #4
        Weil ich auch mit den regexp nich so richtig zurecht komme, habe ich bei meinen suchfunktionen das so gemacht, dass ich erst um alle Klammern ein leerzeichen eingefügt habe (per str_replace()). Dann werden die einzelnen Wörter in ein array geschrieben (per explode()) und dann alles was kein AND, OR oder Klammer ist in ein SQL-Statement umgewandelt.

        Kommentar


        • #5
          Und nochmal - das einzige Problem, daß (im Moment) ich dabei habe, ist: Das Suchwort darf nur dann ersetzt werden, wenn es nicht Teil eines der anderen Suchwörter ist

          (Die Suchwörter werden übrigens vorher aus dem zu bearbeitenden String herausgesammelt und in einem Array gespeichert. In einer Zählschleife sollen dann die einzelnen Suchwörter ersetzt werden.)

          Kommentar


          • #6
            Grundsätzlich hilft hier NOT weiter:

            (LIKE "Bier%" AND NOT LIKE "Biertrinker%" AND NOT LIKE "Bierliebhaber%") usw.

            Dazu mußt Du allerdings den Such-String des Users (Den nach dem Muster "((Biertrinker OR Bierliebhaber) AND (Bier))") vor der Übergabe an mySQL im Skript parsen. Das solltest Du schon aus Sicherheitsgründen aber sowieso... Wird ein Haufen Arbeit. Dafür gibts nachher ein Super-Tool für den Benutzer - eine so großzügige Such-Syntax gibts selten in Suchfunktionen.

            Kommentar


            • #7
              "AND", "OR" und "NOT" (und Klammern) dürfen hierbei vom Anwender festgelegt werden, das geht mich und mein Script nichts an. Sicherheitsrisiken dürften da nicht bestehen. Es kann höchstens passieren, daß der Anwender eine Fehlermeldung bekommt, wenn er eine Klammer nicht schließt oder dergleichen. Dann muß er´s eben nochmal probieren, bis er das richtig kann.

              Mein Problem ist lediglich, daß sich die Suchwörter beim Ersetzen ineinander "verhaken" können, wenn eines der Suchwörter zufällig als Teilzeichenkette in einem der anderen Suchwörter vorkommt.

              Vorbeugend möchte ich noch erwähnen, daß ich unbedingt davon Abstand nehmen will, die SQL-Formulierung neu zusammenzusetzen mit all den Klammern, auf und zu, oder gar deren Richtigkeit prüfen - dann hätte ich wohl ein ungleich größeres Problem.

              Mein Problem ist kein SQL-Problem, sondern ein String-Operations-Problem, deshalb habe ich es auch nicht in das SQL-Forum gesetzt. Warum es hierher verschoben wurde, ist mir nicht klar.


              Keiner versteht mich. *seufz* Ich glaube, besser kann ich es leider nicht beschreiben.

              Kommentar


              • #8
                Original geschrieben von Wodan
                Mein Problem ist kein SQL-Problem, sondern ein String-Operations-Problem, deshalb habe ich es auch nicht in das SQL-Forum gesetzt. Warum es hierher verschoben wurde, ist mir nicht klar.
                du hast kein bisschen von dem PHP-code gepostet, mit dem du bisher arbeitest,
                und auch nicht angegeben, mit was du die suchbegriffe den "ersetzen" willst ...
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Original geschrieben von Wodan
                  "AND", "OR" und "NOT" (und Klammern) dürfen hierbei vom Anwender festgelegt werden, das geht mich und mein Script nichts an. Sicherheitsrisiken dürften da nicht bestehen.
                  oh doch, schon mal von SQL-Injection gehört?
                  Es kann höchstens passieren, daß der Anwender eine Fehlermeldung bekommt, wenn er eine Klammer nicht schließt oder dergleichen. Dann muß er´s eben nochmal probieren, bis er das richtig kann.
                  es kann/wird viel mehr passieren, als deine naive Annahme, s.o.
                  Mein Problem ist lediglich, daß sich die Suchwörter beim Ersetzen ineinander "verhaken" können, wenn eines der Suchwörter zufällig als Teilzeichenkette in einem der anderen Suchwörter vorkommt.
                  der User kann per Radiobutton AND, OR und per Select-Box gleich, ungleich, ...setzen. DU musst die Abfrage anhand dessen zusammensetzen und dabei alles abfängst, was für die DB schädlich ist.
                  Vorbeugend möchte ich noch erwähnen, daß ich unbedingt davon Abstand nehmen will, die SQL-Formulierung neu zusammenzusetzen mit all den Klammern, auf und zu, oder gar deren Richtigkeit prüfen - dann hätte ich wohl ein ungleich größeres Problem.
                  es ist aber deine Aufgabe, für Sicherheit zu sorgen.
                  Mein Problem ist kein SQL-Problem, sondern ein String-Operations-Problem, deshalb habe ich es auch nicht in das SQL-Forum gesetzt. Warum es hierher verschoben wurde, ist mir nicht klar.
                  Dein Problem ist eher dass du dir nicht im Klaren bist, was du da tutst. Andererseits ein bisschen Code wäre von Vorteil.

                  Kommentar


                  • #10
                    Ich schließe mich meinem Vorredner an. Wir haben durchaus verstanden, worum es Dir geht, nur so einfach wie du das vorhast, geht es nicht. Wenn Du Überlappungen in Suchbegriffen vermeiden willst, ist NOT LIKE das Mittel der Wahl. Parsen mußt Du den User-Input aber so oder so, weil Du erstmal via PHP rausfinden mußt, welche Begriffe sich überhaupt überlappen (Hier ist übrigens stristr() dein Freund). Wahllos NOT LIKEs reinzusetzen, unabhängig davon, ob Überlappungen vorkommen, frißt nämlich Performance wie die Sau.

                    Wenn Du mehr Input willst => Code posten.

                    Kommentar


                    • #11
                      Ich habe inzwischen eine ebenso einfache wie plumpe Lösung gefunden, bin aber etwas neugierig geworden ob der neuen Antworten und lasse mich gerne eines Besseren belehren.


                      @asp2php
                      schon mal von SQL-Injection gehört?
                      Nein - beim Leibhaftigen! - was ist das?
                      DU musst die Abfrage anhand dessen zusammensetzen und dabei alles abfängst, was für die DB schädlich ist.
                      Alles, was anders lautet als AND,NOT,OR,(,),",' wird von meinem Script als Suchwort betrachtet und kann auch nur als solches in die SQL-Abfrage gelangen. Ist das zu naiv gedacht? Was könnte dabei für die DB schädlich sein?


                      @wahsaga
                      du hast kein bisschen von dem PHP-code gepostet, mit dem du bisher arbeitest, und auch nicht angegeben, mit was du die suchbegriffe den "ersetzen" willst ...
                      Weil ich nicht auf der Suche nach einem Fehler im Code war, sondern auf der Suche nach einer Funktion, die das Gewünschte zu leisten vermag. Ich hatte an eine jener ..._replace-Funktionen gedacht, aber mit diesen komplizierten Ausdrücken bin ich noch nicht so firm.





                      So, und hier ist der PHP-Kot:

                      $this->suchbegriff enthält das, was im Suchformular eingegeben wurde, z.B. "(Biertrinker) AND NOT (Bierliebhaber ODER Bierdurst)".
                      Die Tabellenfelder, in denen gesucht werden soll, sind voreingestellt.

                      PHP-Code:
                              //-----Suchwörter werden vom Rest und vom Rand durch Leerzeichen getrennt-----------
                              
                      $this->suchbegriff="     ".stripslashes($this->suchbegriff."     ");

                              
                      $this->suchbegriff=str_replace("(","     (     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace(")","     )     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace(chr(34),"     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace(chr(39),"     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("AND","     AND     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("UND","     UND     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("OR","     OR     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("ODER","     ODER     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("NOT","     NOT     ",$this->suchbegriff);
                              
                      $this->suchbegriff=str_replace("NICHT","     NICHT     ",$this->suchbegriff);

                              
                      //-----Alles, was nicht als Suchwort zu betrachten ist, wird durch | ersetzt---------
                              
                      $sb_filter=$this->suchbegriff;

                              
                      $sb_filter=str_replace("AND","|",$sb_filter);
                              
                      $sb_filter=str_replace("UND","|",$sb_filter);
                              
                      $sb_filter=str_replace("OR","|",$sb_filter);
                              
                      $sb_filter=str_replace("ODER","|",$sb_filter);
                              
                      $sb_filter=str_replace("NOT","|",$sb_filter);
                              
                      $sb_filter=str_replace("NICHT","|",$sb_filter);
                              
                      $sb_filter=str_replace("(","|",$sb_filter);
                              
                      $sb_filter=str_replace(")","|",$sb_filter);
                              
                      $sb_filter=str_replace(chr(34),"|",$sb_filter);
                              
                      $sb_filter=str_replace(chr(39),"|",$sb_filter);

                              
                      //-----Suchwörter feststellen und in einem Array speichern-----------------------------
                              
                      $sb=explode("|",$sb_filter);
                              
                      $suchbegriffe=array();
                              for(
                      $z=0$z<sizeOf($sb); $z++)
                                  {
                                  
                      // Die Leerzeichen verhindern, daß der Suchbegriff in einem der anderen Suchbegriffe gefunden wird.
                                  
                      if (trim($sb[$z])!='') {$suchbegriffe[]="     ".trim($sb[$z])."     ";}
                                  }

                              
                      //-----Such-query bearbeiten-------------------------------------------------------
                              
                      $Such_query=$this->suchbegriff;
                              for(
                      $z=0$z<sizeOf($suchbegriffe); $z++)
                                  {
                                  if (
                      $z>0) {$Teilquery=$Teilquery." OR ";}
                                  
                      $Teilquery="(";
                                  for(
                      $zz=0$zz<sizeOf($suchfelder); $zz++)
                                      {
                                      if (
                      $zz>0) {$Teilquery=$Teilquery." OR ";}
                                      
                      $Teilquery=$Teilquery."(";
                                      
                      $Teilquery=$Teilquery.trim($suchfelder[$zz])." LIKE '%".$suchbegriffe[$z]."%' ";
                                      
                      $Teilquery=$Teilquery.")";
                                      }
                                  
                      $Teilquery=$Teilquery.")";
                                  
                      $Such_query=str_replace($suchbegriffe[$z],$Teilquery,$Such_query);
                                  }
                              
                      $Such_query=str_replace("UND","AND",$Such_query);
                              
                      $Such_query=str_replace("ODER","OR",$Such_query);
                              
                      $Such_query=str_replace("NICHT","NOT",$Such_query);
                              while (
                      ereg("% ",$Such_query)) {$Such_query=str_replace("% ","%",$Such_query);}
                              while (
                      ereg(" %",$Such_query)) {$Such_query=str_replace(" %","%",$Such_query);}

                              if (
                      trim($Such_query)!='') {$Such_query="WHERE (".$Such_query.")";} else {$Such_query='';} 
                      Vielleicht schlagt Ihr jetzt die Hände über´m Kopf zusammen, aber es funzt prima. Einwände?

                      Kommentar


                      • #12
                        Nein - beim Leibhaftigen! - was ist das?
                        sarkasmus?

                        sql-injektionen sind in diesem sinne suchbegriffe, die den syntax deiner query ungültig machen, um durch fehlermeldungen etc. mehr über deine db-struktur zu erfahren, oder, noch viel schlimmer, die gültigen syntax erzeugen, aber solchen, der (vom user) niemals hätte ausgeführt werden sollen/dürfen ...
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          @derHund
                          Sowas habe ich mir schon gedacht, aber der Begriff "sql-injektionen" war mir bisher fremd. Welche Zeichen oder Zeichenfolgen müßte ich denn noch rausfiltern, um das Ganze sicher zu machen?

                          Nachtrag: Gibt´s keine Kritik an dem Code? Mich würde Eure Meinung dazu interessieren.
                          Zuletzt geändert von Wodan; 29.09.2004, 06:46.

                          Kommentar


                          • #14
                            Original geschrieben von Wodan
                            Sowas habe ich mir schon gedacht, aber der Begriff "sql-injektionen" war mir bisher fremd. Welche Zeichen oder Zeichenfolgen müßte ich denn noch rausfiltern, um das Ganze sicher zu machen?
                            zu dem thema wurde hier und andernorts schon mehr als genug geschrieben - bitte benutze die suchfunktion oder google.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar

                            Lädt...
                            X