2010-12-14 14 views
1

Das war verrückt, aber ich kann keine Antwort finden. Wir betreiben eine technische Wissensdatenbank, die manchmal Windows-Samba-Pfade für die Zuordnung zu Netzlaufwerken enthält.PHP 'addslashes' verhält sich nicht wie erwartet

Zum Beispiel: \\servername\sharename

Wenn wir Pfade enthalten, die zwei Schrägstriche haben von einander gefolgt, sie sind richtig nicht entgangen, wenn ‚addslashes‘ läuft. Meine erwarteten Ergebnisse wären "\\\\servername\\sharename", aber es gibt "\\servername\\sharename" zurück. Offensichtlich ist das doppelte Backslash-Präfix nur ein einzelner Schrägstrich, wenn später 'stripslashes' ausgeführt wird. Ich habe auch versucht, eine str_replace("\\", "\", $variable); verwenden, aber es gibt "\servername\sharename" zurück, wenn ich "\\servername\sharename" erwarten würde.

Also mit addslashes, ignoriert es die erste Reihe von Doppel-Backslashes und mit Str_replace ändert es die Doppel-Backslashes in einen einzigen, codierten Backslash.

Wir müssen addslashes und stripeslashes für die Datenbankeinfügung ausführen; Die Verwendung von pg_escape_string funktioniert in unserem speziellen Fall nicht.

Dies läuft auf PHP 5.3.1 auf Apache.

EDIT: Beispielcode
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
Das gibt: In the box labeled Folder type: \\servername\\sharename

EDIT: Beispielcode # 2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
Das gibt: In the box labeled Folder type: \servername\sharename

Ich würde auch würde gerne stelle fest, dass die Verwendung von einfachen Anführungszeichen oder doppelten Anführungszeichen keine anderen Ergebnisse liefert (wie zu erwarten war). Die Verwendung von beiden oder von beiden gibt mir die gleichen genauen Ergebnisse.

Hat jemand irgendwelche Vorschläge, was ich tun kann?

+4

Ich führe nur addslashes auf eine Zeichenfolge mit zwei Backslashes und erhielt vier Backslashes als Gegenleistung. Ich denke, ein Codebeispiel wird benötigt. – StasM

+1

Warum funktioniert pg_escape_string in Ihrem Fall nicht? – babonk

+0

Das Codebeispiel wird abgeglichen. Ich stelle mir vor, dass dies der Unterschied zwischen der Behandlung von "" (kein Entkommen) und "" (Entkommen) zu Strings sein wird. – lotsoffreetime

Antwort

-1

Ich habe festgestellt, mit mehr Tests, dass es in der Tat ist, wie PHP hard-codierte Strings behandelt. Da hardcodierte Zeichenfolgen nicht das sind, woran ich interessiert bin (ich habe sie nur zum Testen verwendet/dieses Beispiel), habe ich ein Formular mit einem einzigen Textfeld und einer Senden-Schaltfläche erstellt. würde die POST-Daten auf diese Weise korrekt umgehen.

Um noch mehr Nachforschungen anzustellen, stellte ich fest, dass das Problem darin bestand, wie PostgreSQL entgangene Daten akzeptiert. Beim Einfügen von Daten in eine PostgreSQL-Datenbank werden alle Escapezeichen entfernt, die beim Einfügen der Daten in die Tabelle vorhanden sind. Daher ist stripslashes nicht erforderlich, um Escape-Zeichen zu entfernen, wenn die Daten wieder herausgezogen werden.

Dieses Problem rührte von Code-Migration von PHP 4.1 (mit Magic Quotes on) zu PHP 5.3 (Magic Quotes ist veraltet). Im bestehenden System (PHP4) waren wir uns nicht bewusst, dass Magic Quotes aktiv waren. Daher wurden alle POST-Daten bereits maskiert und dann entkamen wir diese Daten erneut mit addslashes vor dem Einfügen. Wenn es in PostgreSQL eingefügt wurde, würde es eine Reihe von Schrägstrichen abreißen und die andere verlassen, weshalb wir stripslashes auf dem Weg nach draußen benötigen. Jetzt, mit Magic Quotes off, entkommen wir mit addslashes, sind aber nicht verpflichtet, stripslashes auf dem Weg nach draußen zu verwenden.

Es war sehr schwer zu organisieren und genau zu bestimmen, wo das Problem lag, so weiß ich, dass diese Antwort ein wenig zu meiner ursprünglichen Frage ist. Ich danke jedoch allen, die dazu beigetragen haben. Wenn andere Leute ihre Ideen aufgreifen, hilft das immer dabei, über Wege nachzudenken, die du vielleicht nicht alleine hast.

1

Ich denke, ich weiß, wo ein Problem ist. Versuchen Sie einfach, diese zu laufen:

echo addslashes('\\servername\sharename'); 

Und dieser

echo addslashes('\\\\servername\sharename'); 

PHP entkommt doppelte Schrägstriche, auch mit einfachen Anführungszeichen, weil es verwendet wird Apostroph zu entkommen.

+0

Meine Ergebnisse sind '\\ Servername \\ Freigabename \ bzw. \\\\ Servername \\ Freigabename \. –

1

Es gab einen Test für das von Ihnen beschriebene Problem, und die einzige Möglichkeit, das von Ihnen gewünschte Verhalten zu erzielen, bestand darin, eine Bedingung mit einer Regex zu koppeln und die doppelten Schrägstriche am Anfang vorherzusehen.

$str = '\\servername\sharename'; 
    if(substr($str,0,1) == '\\'){ 
    //String starts with double backslashes, let's append an escape one. 
    //Exclaimation used for demonstration purposes. 
    $str = '\\'.$str; 
    echo addslashes(preg_replace('#\\\\\\\\#', '!',$str)); 

    } 

Diese Ausgänge:

!servername\\sharename 

Während dies nicht ein völliges Antwort sein, es funktioniert und zeigt einen Unterschied, wie die Escape-Zeichen durch diese beiden Konstrukte behandelt wird. Wenn verwendet, die! könnte leicht mit den gewünschten Zeichen mit einem anderen Regex ersetzt werden.

+0

Ihr Code-Beispiel funktionierte auch für mich. Freigabenpfade können jedoch niemals im Hauptteil eines Artikels erscheinen, sie können einmal vorkommen oder sie erscheinen mehr als einmal im Ermessen des Autors. Ich müsste einen preg_replace schreiben, der alle zusammenbringt und sie ersetzt, was nicht ideal ist. Aber wenn es die einzige Sache ist, die ich zur Arbeit bringen kann, dann denke ich, dass ich es vielleicht so machen muss. Vielen Dank für Ihr Codebeispiel. –

1

Dies ist kein Problem mit addslashes, es ist ein Problem mit der Art, wie Sie die Zeichenfolge Ihrer Variablen zuweisen.

$variable = 'In the box labeled Folder type: \\servername\sharename'; 
echo $variable; 

Das gibt: im Feld Ordnertyp markiert: \ Server \ Freigabe

Dies ist, weil der doppelte Backslash als Escape Backslash interpretiert wird. Verwenden Sie stattdessen diese Zuweisung.

+0

Ich habe keine Kontrolle darüber, was "Variable" ist. Es war nur ein Beispiel, das ich für diese Frage erstellt habe. "Variable" ist, was von der Form, die der Benutzer ausfüllt, POST ist. –

+0

@mririgo In jedem Fall, aus dem Beispiel 2, das Sie in Ihrer Frage gegeben haben, ist es klar, dass die Zeichenfolge nicht 2 Backslashes hintereinander enthält, nur eine: \ Servername \ Freigabename. Das Problem ist nicht mit addslashes, es ist mit Ihrer Zeichenfolge. –

Verwandte Themen