插入数据库
将数据插入 MySQL 数据库时,您应该使用准备好的语句或适当的转义函数,例如mysql_real_escape_string
. addslashes
与数据库无关,不应使用。转义是一个通用术语,但实际上涵盖了大量的操作。这里似乎正在讨论转义的两种用途:
- 转义可能插入数据库的危险值
- 转义字符串引号以避免损坏的字符串
大多数数据库转义函数不仅仅是转义引号。它们会转义非法字符以及 \0 等不可见字符 ...这是因为根据您使用的数据库,有很多方法可以破坏插入 - 而不仅仅是添加右引号。
因为似乎有人错过了我关于提及 PDO 的评论,所以我将在这里再次提及。使用 PDO 或其他一些数据库抽象系统以及准备好的语句要好得多,这是因为您不再需要担心转义您的值。
输出/转储数据库值
在提到的备份您的数据库脚本中,原始编码器addslashes
用作快速速记,以确保 mysql 转储中的输出字符串格式正确并且不会在重新插入时中断。它与安全无关。
从数据库中选择值
即使您在插入数据库时转义了您的值,当将该数据写回任何使用字符串的导出文件时,您也需要再次转义引号。这只是因为您希望保护您的字符串以使其格式正确。
将转义数据插入数据库时,使用的“转义序列”将转换回其原始值。例如:
INSERT INTO table SET field = "my \"escaped\" value"
一旦进入数据库,该值实际上将是:
my "escaped" value
因此,当您将其从数据库中拉出时,您将收到:
my "escaped" value
所以当你需要把它放在一个格式化的字符串/转储中,一个解析器将读回的转储,你需要做一些转义来正确格式化它:
$value_from_database = 'my "escaped" value';
echo '"' . $value_from_database . '"';
将产生:
"my "escaped" value"
这将破坏任何正常的字符串解析器,因此您需要执行以下操作:
$value_from_database = 'my "escaped" value';
echo '"' . addslashes($value_from_database) . '"';
生产:
"my \"escaped\" value"
但是,如果是我,我只会针对双引号并转义:
$value_from_database = 'my "escaped" value';
echo '"' . str_replace('"', '\\"', $value_from_database) . '"';