Zeichen aus String entfernen

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich muss eine SQL Abfrage absichern.

Ich gebe in ein Formular eine Reihe von Zahlen ein, getrennt mittels Beistrich.
Der String wird dann beim Beistrich in einen Array aufgesplittet. Die einzelnen Arrayfelder werden mit einer Datenbank abgeglichen.

Aktuell sieht der Code so aus:

PHP:
if( preg_match('/\d+ ?(, ?\d+)*/', $_POST['liste']) === 1 ){
      $sql=(" SELECT
                    Pfad,
                    Partie
                FROM
                    suchmaschine
                WHERE
                     Partie IN (".$_POST['liste'].")");
               
    $stmt = $db_conn->prepare($sql);
    //$stmt->bindValue(':suchbegriff', "{$_POST['liste']}", PDO::PARAM_STR);
    $stmt->execute();
   
    if($stmt->rowCount()>=1) {
        foreach($stmt->fetchAll() as $row) {
                $partie[] = $row['Partie'];               
            }
        }
    }

Wenn allerdings jetzt ein Sonderzeichen im String vorkommt, bekomme ich folgenden MySQL Fehler.

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 7' in C:\xampp\suchmaschine\inc\sendmassmail.php:23 Stack trace: #0 C:\xampp\suchmaschine\inc\sendmassmail.php(23): PDOStatement->execute() #1 C:\xampp\suchmaschine\lib\content.lib.php(3): include('C:\\xampp\\suchma...') #2 C:\xampp\suchmaschine\index.php(123): include('C:\\xampp\\suchma...') #3 {main} thrown in C:\xampp\suchmaschine\inc\sendmassmail.php on line 23

Ein Versuch, den das Feld $_POST['liste'] mittels trim oder preg_replace zu bereinigen, funktioniert nur bedingt, weil auch alle Sonderzeichen in der Mitte des Strings entfernt werden wodurch ich kein Ergebnis retourkriege.

Auch mittels RTRIM und LTRIM habe ich es versucht, leider kommt dabei wieder nur ein MySQL Fehler raus.

Kann mir von euch wer einen Rat geben?
 
Ich verstehe nicht ganz wie dein String aussieht. Mach bitte mal ein Beispiel mit IST und SOLL Strings.
Auch mit den Sonderzeichen mittendrin, die erhalten bleiben sollen.
 
Also ein normaler String in meinem Fall sieht so aus:

74125 Bei einem Paket
74125,74126,74127,74128 usw. bei mehreren Paketen.

Wenn ich jetzt aber eingebe z.b. 74125, wirft mit MySQL den oben genannten Fehler aus.
Die Zahlen zwischen den Beistrichen sind aktuell 5 Zahlen lang, ich komme aber immer schneller Richtung 6 Stellen.

Kannst man sich jetzt ungefähr vorstellen, was ich meine?
 
Ein Versuch, den das Feld $_POST['liste'] mittels trim oder preg_replace zu bereinigen, funktioniert nur bedingt, weil auch alle Sonderzeichen in der Mitte des Strings entfernt werden wodurch ich kein Ergebnis retourkriege.

Auch mittels RTRIM und LTRIM habe ich es versucht, leider kommt dabei wieder nur ein MySQL Fehler raus.
Und was willst du Bereinigen?
In deinem Beispiel sehe ich nix, was es zu bereinigen gibt
 
Sorry, im Stress vergessen.

Wenn jetzt im Textfeld z.b. eingeben wird

,74125, muss der String von den Beistrichen bereinigt werden.

Mit einem Paket kein Problem. Wenn allerdings mehrere Pakete benötigt werden und schaut der String so aus
,74125,74126,74127,74128,

muss der String vom ersten und vom letzten Beistrich bereinigt da sonst der bereits erwähnte MySQL Error kommt.

Es geht mir um Fehlerbehandlung bzw. vermeidung.

//EDIT

Ich könnte mich gerade selber Ohrfeigen. Man sollte natürlich die Arbeit auch speichern bevor man was testet....

PHP:
$charlist =",.-;:_+*#!§$%&/()=?`´öäüÖÄÜ ";
   $trimmedtext = ltrim($_POST['liste'], $charlist);
   $trimmedtext = rtrim($trimmedtext, $charlist);
   
   if( preg_match('/\d+ ?(, ?\d+)*/', $trimmedtext) === 1 ){
       $sql=(" SELECT
                            Pfad,
                            Partie
                        FROM
                            suchmaschine
                        WHERE
                             Partie IN (".$trimmedtext.")");
               
   $stmt = $db_conn->prepare($sql);
   $stmt->execute();
   
   if($stmt->rowCount()>=1) {
       foreach($stmt->fetchAll() as $row) {
               $partie[] = $row['Partie'];               
           }
       }
   }

Frage: Gibt es eine schönere Lösung?
 
Zuletzt bearbeitet:
Zurück