Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelle est la différence entre les addlashes de PHP et mysql(i)_escape_string ?

Tout d'abord :n'utilisez pas mysql_escape_string , il est obsolète (pour une raison) !

Si vous devez prendre en charge une application héritée qui se connecte à la base de données via mysql extension (qui a été obsolète ), utilisez mysql_real_escape_string Au lieu. Sinon basculer immédiatement vers mysqli , où les instructions préparées et les paramètres liés fournissent un mécanisme plus robuste pour échapper à l'entrée de l'utilisateur.

Cela dit, la réponse peut être trouvée en lisant la description de mysql_real_escape_string et addslashes :

Différence #1

addslashes ne sait rien des encodages de connexion MySql. Si vous lui passez une chaîne contenant des octets représentant un encodage autre que l'encodage utilisé par la connexion MySql, il échappera volontiers tous les octets ayant les valeurs des caractères ' , " , \ et \x00 . Cela peut ne pas être le même que tous les personnages ' , " , \ et \x00 si vous utilisez un encodage autre que les encodages 8 bits et UTF-8. Le résultat sera que la chaîne reçue par MySql sera corrompue.

Pour déclencher ce bogue, essayez d'utiliser iconv pour convertir votre variable en UTF-16 puis l'échapper avec addslashes . Voyez ce que votre base de données reçoit.

C'est l'une des raisons pour lesquelles addslashes ne doit pas être utilisé pour s'échapper.

Différence #2

Contrairement à addslashes , mysql_real_escape_string échappe également les caractères \r , \n , et \x1a . Il semble que ces caractères doivent également être échappés lorsque vous parlez à MySql, sinon une requête mal formée peut en résulter

C'est l'autre raison pour laquelle addslashes ne doit pas être utilisé pour s'échapper.