In einer Umgebung, in der vorbereitete Anweisungen keine Option sind, ist es wichtig, Benutzereingaben vor der Übermittlung an MySQL gründlich zu maskieren, um eine SQL-Injection zu verhindern. Für diesen Zweck wird häufig die PHP-Funktion „mysql_real_escape_string“ verwendet, die jedoch nicht in der Lage ist, die MySQL-Platzhalterzeichen „%“ und „_“ zu maskieren.
Um dies zu berücksichtigen, können zusätzlich addcslashes verwendet werden. Wie ein Benutzer jedoch beobachtet hat, kommt es zu einer Diskrepanz in den angezeigten Ergebnissen, wenn Eingaben mit Platzhaltern an die Datenbank gesendet und abgerufen werden.
The Escaping Enigma
Der Benutzer ist auf ein eigenartiges Verhalten gestoßen, bei dem dem Zeichen „_“ ein umgekehrter Schrägstrich („_“) vorangestellt wurde, den Zeichen „““ und „‘“ hingegen kein umgekehrter Schrägstrich (‚_‘), obwohl dies bei allen der Fall war drei wurden mit '' maskiert. Dies wirft die Frage auf: Warum werden diese Zeichen unterschiedlich behandelt?
MySQL-Kontext verstehen
Der Schlüssel zur Lösung dieses Rätsels liegt im Verständnis der Kontext des LIKE-Matchings in MySQL. „_“ und „%“ gelten im allgemeinen MySQL-Verbrauch nicht als Platzhalter und sollten beim Erstellen eines String-Literals nicht maskiert werden. mysql_real_escape_string erfüllt die Escape-Anforderungen für diesen Zweck.
Bei der Vorbereitung von Zeichenfolgen für die Verwendung in einer LIKE-Anweisung gelten jedoch andere Escape-Regeln. Um sicherzustellen, dass Literale korrekt interpretiert werden, ist zusätzliches LIKE-Escape erforderlich.
Double Escape Dilemma
In Im Kontext der LIKE-Übereinstimmung werden „_“ und „%“ zu Sonderzeichen. MySQL verwendet den Backslash ('') als Escape-Zeichen sowohl für die LIKE-Escape-Schritte als auch für die String-Literal-Escape-Schritte. Dies kann zu Verwirrung führen, wie das Beispiel des Benutzers zeigt, bei dem für die Übereinstimmung eines wörtlichen Prozentzeichens mit LIKE ein doppelter Backslash-Escapezeichen erforderlich ist.
Richtiges LIKE-Escapezeichen
Um Portabilität zu vermeiden Bei Problemen schreibt ANSI SQL die Verwendung eines bestimmten Escape-Zeichens für LIKE-Anweisungen vor. Eine Möglichkeit, dies in PHP zu erreichen, ist die Verwendung der folgenden Funktion:
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Verwendung mit vorbereiteten Anweisungen
Für zusätzliche Sicherheit und Portabilität empfiehlt sich die Verwendung von Prepared Erklärungen, sofern verfügbar. Dadurch entfällt die Notwendigkeit manueller Escape-Operationen und gleichzeitig wird eine ordnungsgemäße Datenverarbeitung gewährleistet.
Das obige ist der detaillierte Inhalt vonWie entgeht man MySQL-Platzhaltern in LIKE-Anweisungen ordnungsgemäß?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!