Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist der Unterschied zwischen den Addslashes von PHP und mysql(i)_escape_string?

Zuallererst:verwenden Sie mysql_escape_string nicht , es ist (aus einem bestimmten Grund) veraltet!

Wenn Sie eine ältere Anwendung unterstützen müssen, die über mysql eine Verbindung zur Datenbank herstellt Erweiterung (die veraltet wurde ). ), verwenden Sie mysql_real_escape_string stattdessen. Andernfalls sofort wechseln zu mysqli , wobei vorbereitete Anweisungen und gebundene Parameter einen robusteren Mechanismus zum Escapezeichen von Benutzereingaben bieten.

Die Antwort findet sich jedoch in der Beschreibung von mysql_real_escape_string und addslashes :

Unterschied #1

addslashes weiß nichts über MySql-Verbindungskodierungen. Wenn Sie ihm eine Zeichenfolge übergeben, die Bytes enthält, die eine andere Codierung als die von der MySql-Verbindung verwendete Codierung darstellen, werden alle Bytes mit den Werten der Zeichen fröhlich maskiert ' , " , \ und \x00 . Dies ist möglicherweise nicht dasselbe wie alle Zeichen ' , " , \ und \x00 wenn Sie eine andere Codierung als 8-Bit-Codierungen und UTF-8 verwenden. Das Ergebnis wird sein, dass die von MySql empfangene Zeichenfolge beschädigt wird.

Um diesen Fehler auszulösen, versuchen Sie es mit iconv um Ihre Variable in UTF-16 zu konvertieren und ihr dann mit addslashes zu entkommen . Sehen Sie, was Ihre Datenbank empfängt.

Dies ist einer der Gründe, warum addslashes sollte nicht zum Entkommen verwendet werden.

Unterschied #2

Im Gegensatz zu addslashes , mysql_real_escape_string maskiert auch die Zeichen \r , \n , und \x1a . Anscheinend müssen diese Zeichen bei der Kommunikation mit MySql ebenfalls maskiert werden, da sonst eine fehlerhafte Abfrage das Ergebnis sein kann

Dies ist der andere Grund für addslashes sollte nicht zum Entkommen verwendet werden.