2011-09-02 124 views
2

我有一系列正则表达式,包括我需要存储在mysql表中的转义字符。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')"; 

[email protected]:$ echo "select * from my_table" | mysql -uuser -Ddatabase -p'password' 

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

任何想法,我在做什么错误?

+2

有用的链接 - http://stackoverflow.com/questions/4731144/the-mysql-use-of-addslashes – ajreal

+3

**只有使用'mysql_real_escape_string'来转义在数据库中注入$ vars,永远不会组合或替换它与其他任何**或甚至更好,使用PDO。 – Johan

回答

7

斜杠在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选项禁用此字符转义。

BTW mysql_real_escape_string是要使用的右转义函数。

+0

太好了,这是问题所在。有趣的是,尽管我有一个explode()将字符串分解成一个数组。如果我mysql_real_escape_string($ array [1])它根本不逃脱。相反,我可以在explode()之前使用mysql_real_escape_string,它工作正常。感谢您的答复。 – Sean