查询MySQL中的非转义字符串

时间:2012-04-12 21:24:26

标签: php mysql select escaping

该表的公司名称 已转义 我的qry看起来像

$sql = "SELECT id FROM contact_supplier WHERE name = '$addy' LIMIT 1";

问题出现在表格中的公司名称值有时像“ Acme Int'l S / L ”。
(仅供参考:$ addy的值与DB匹配)
显然,存储时不会转义值。

如何找到我的比赛?


[编辑]
啊啊!
我想我是在做些什么。 $ addy值的来源是一个文件

$addresses = file('files/addresses.csv');
然后我做了

foreach ($addresses as $addy) {}

好吧,当我转义$ addy字符串时,它会转义新的行字符并将“ \ r \ n ”包含在比较字符串的末尾。
除非有人建议采用更优雅的方式,否则我想我会用str_replace()去除那些。

:)
[\ EDIT]

6 个答案:

答案 0 :(得分:0)

使用mysql_real_escape_string

$addy = mysql_real_escape_string($addy);

或尝试使用参数化查询(PDO)。


关于这句话:

  

显然,存储时不会转义值。

这是不正确的逻辑。如果值未在原始INSERT语句中转义,则该语句将失败。如果没有逃避,你会发现syntax error near "l S/L' LIMIT 1"的错误。数据正确存储在数据库中的事实证明,无论是谁插入数据都能够正确地执行(通过转义或使用参数化查询)。

如果你正确地做了事情,那么数据应该以转义的形式存储在数据库中。

答案 1 :(得分:0)

为什么您认为已存储在表格中的数据应该被转义?

您应该只在将数据直接写入基于文本的语言之前转义数据,例如作为SQL查询的一部分,或HTML页面或JavaScript代码块中的一部分。

答案 2 :(得分:0)

执行查询时,没有任何空格。 MySQL会对其进行转换和插入,否则它不会因为语法而插入并出错,或者为了安全性而将它们转义为sql注入。

因此,使用转义值的查询将与数据库中的数据一起正常工作。

答案 3 :(得分:0)

如果存储时未对值进行转义,则在尝试输入时会导致SQL错误。

问题是,在进行查询时,数据不会被转义。

快速入侵:使用mysql_real_escape_string

正确的解决方案:不要通过将字符串混合在一起来构建SQL。 Use prepared statements and parameterized queries

答案 4 :(得分:0)

另一种选择是将您的查询更改为此...

$sql = "SELECT id FROM contact_supplier WHERE name = \"$addy\" LIMIT 1";

答案 5 :(得分:0)

问题原来是新行字符 $ addy值的来源就像这样

$addresses = file('files/addresses.csv');

然后我经历了

foreach ($addresses as $addy) {}

当我转义$ addy字符串时,它会转义新的行字符并在比较字符串的末尾插入“ \ r \ n ”。
一旦我逃脱后用string_replace()删除了这些字符,一切都顺其自然

感谢BUNCH的帮助