MySQL转义反斜杠

3

我有一系列包含转义字符的正则表达式,需要将其存储在 MySQL 表中。

如果不对反斜线进行转义,则会被删除。

我尝试使用 PHP 中的 mysql_real_escape_string、addslashes、str_replace 对反斜线进行转义,但每次数据库都会存储双反斜杠而不是单个。

我还尝试使用 bash 中的 sed 对反斜线进行转义,但它也打印出 2。

示例:

$regex = "stackoverflow\.com\/questions\/ask";
$query_text = addslashes($regex);
$query = "INSERT INTO my_table (url) VALUES ('$query_text')";

me@server:$ echo "select * from my_table" | mysql -uuser -Ddatabase -p'password'

stackoverflow\\.com\\/questions\\ask

有什么想法是我做错了什么吗?


2
有用的链接 - https://dev59.com/tVPTa4cB1Zd3GeqPj4Ok - ajreal
3
在数据库中,仅使用mysql_real_escape_string来转义注入的$vars,不要将其与其他内容组合或替换,甚至更好的做法是使用PDO。 - Johan
1个回答

9

mysql客户端的控制台输出中的斜杠被转义了;数据库中没有被转义。

尝试交互式地运行客户端:

mysql -uuser -Ddatabase -p'password'
mysql> select * from my_table;
+------------------------------------+
| x                                  |
+------------------------------------+
| stackoverflow\.com\/questions\/ask |
+------------------------------------+

并且可以非交互地执行:

mysql -uuser -Ddatabase -p'password' <<< "select * from my_table"
stackoverflow\\.com\\/questions\\/ask

使用--raw来禁用此转义:

mysql -uuser -Ddatabase -p'password' --raw <<< "select * from my_table"
stackoverflow\.com\/questions\/ask

从手册中得知:

--raw,-r

对于表格输出,“框”围绕列使一个列值能够与另一个区分开来。对于非表格输出(例如在批处理模式下或在给出--batch或--silent选项时产生的输出),特殊字符在输出中被转义,以便可以轻松地识别它们。换行符、制表符、NUL和反斜杠写成\n、\t、\0和\\。选项--raw 禁用了此字符转义。

顺便说一句,mysql_real_escape_string 是正确的转义函数。


太好了,这就是问题所在。有趣的是,我使用explode()将字符串分割成数组。如果我对$array[1]使用mysql_real_escape_string(),它根本不会转义。相反,在explode()之前使用mysql_real_escape_string(),它可以正常工作。感谢您的回复。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接