Sebastian König: $_REQUEST überprüfen lassen...

Hallo zusammen,

ich bastel für meine Arbeit an einem PHP-Script, welches Ordner aus den Eingaben automatisch erstellt... aber eher unwichtig für mein Problem :)
Allgemein läuft mein Script einwandfrei, nur möchte ich, dass Ä Ö Ü usw. ersetzt werden. Und das läuft nicht so recht. Ich bin auch eher ein Noob, bzw Anfänger, in PHP :)
Hier, die ich denke wichtigen Schnipsel:
___________________

Das Kästchen für die zu überprüfenden Werte:
(in html eingebunden)
<input type="text" name="Projekt" maxlength="30" size="27" value="<?php echo $_REQUEST['Projekt']; ?>"/>

Wenn das dann abgeschickt wird, soll der dann nach den Sonderzeichen suchen, meine Idee (Fund):

$Projekt = str_replace (
array('ä','ö','ü','Ä','Ö','Ü','?','/','&'),
array('ae','oe','ue','Ae','Oe','Ue',' ',' ','und'), $_REQUEST['Projekt']);

Nun die Ordnererstellung:
mkdir ("$Folderpath".$_REQUEST['MACNR']." $Projekt", 0777);

___________________

Das Problem ist, dass die Ordner erstellt werden ohne den Eintrag zu überprüfen, d.h. die Ordner werden mit ä ö ü.... erstellt.

Als Noob habe ich mal die Vermutung, dass der Eintrag nicht richtig gelesen kann, da  wenn ich das wie folgt mache, läuft es:

$Projekts = ÄÖÄÖÄ;
$Projekt = str_replace (
array('ä','ö','ü','Ä','Ö','Ü','?','/','&'),
array('ae','oe','ue','Ae','Oe','Ue',' ',' ','und'), $Projekts);

und der Ordner heisst dann "... AeOeAeOeAe".

Zur Info, es handelt sich um 50 eingetragene Werte, die überprüft werden sollen.

Hat jemand eine Idee? :)

Vieeeelen lieben Dank schon einmal.

Gruß Sebastian

  1. Moin!

    Wenn das dann abgeschickt wird, soll der dann nach den Sonderzeichen suchen, meine Idee (Fund):

    $Projekt = str_replace (
    array('ä','ö','ü','Ä','Ö','Ü','?','/','&'),
    array('ae','oe','ue','Ae','Oe','Ue',' ',' ','und'), $_REQUEST['Projekt']);

    Das Problem ist, dass die Ordner erstellt werden ohne den Eintrag zu überprüfen, d.h. die Ordner werden mit ä ö ü.... erstellt.

    Du hast, ohne es zu bemerken, ein Zeichencodierungsproblem.

    $Projekts = ÄÖÄÖÄ;
    $Projekt = str_replace (
    array('ä','ö','ü','Ä','Ö','Ü','?','/','&'),
    array('ae','oe','ue','Ae','Oe','Ue',' ',' ','und'), $Projekts);

    und der Ordner heisst dann "... AeOeAeOeAe".

    Der Unterschied zwischen diesen beiden Varianten: Methode 2 nutzt, da du die Strings mit demselben Editor in der gleichen Datei speicherst, für die Umlaute (sowie auch alle anderen Zeichen des Programmtextes) die gleiche Codierung.

    Wenn hingegen die Eingabe vom $_REQUEST (schöner, weil eindeutiger, wäre die Verwendung von $_POST) kommt, dann ist die Codierung abhängig vom Browser. Wenn dessen Codierung eines "Ä" anders aussieht, als die Codierung deines "Ä" im str_replace, dann findet die Funktion keines deiner "Ä" und ersetzt auch nichts.

    Du mußt also erstmal Klarheit und Einigkeit schaffen über die verwendete Codierung.

    Zweitens, und das ist noch viel wichtiger: Für Datei- oder Ordnernamen verfolgst du eigentlich den falschen Ansatz. Du bist optimistisch: "Der User wird wohl nur Umlaute reinschreiben, und die ersetze ich einfach." Diese Taktik versagt, wenn der User auf die Idee kommt, mal richtig böse Zeichen zu benutzen. Was hältst du z.B. von "*", oder auch von chinesischen Zeichen etc...?

    Die richtige Taktik ist Pessimismus. Du definierst eine Menge von erlaubten Zeichen, also beispielsweise große und kleine Buchstaben und Zahlen, Bindestrich und Unterstrich. Alle Zeichen, die dem nicht entsprechen, werden in eine ungefährliche Variante umgewandelt: Entweder werden sie zu einem Unterstrich, einem Bindestrich, oder ganz entfernt. Vorher könnte man, wie du es schon vorhast, für ausgewählte Zeichen eine zur Zeichenvorschrift kompatible Ersatzdarstellung für z.B. Umlaute einfließen lassen. Damit wäre dann sichergestellt, dass am Ende auf jeden Fall ein nach deinen Vorgaben gültiger Verzeichnisname rauskommt, auch wenn die Codierung falsch ist.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Vielen lieben Dank :)
      Ich hab mal alles in $_POST geändert und alle files als UTF-8 gespeichert. Nun klappt alles einwandfrei.

      Gruß Sebastian