查询MySQL中的未转义字符串

问题描述:

该表的公司名称为不是已转义。
我QRY看起来像查询MySQL中的未转义字符串

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

这个问题是在表中的公司名称值有时会像“阿克米国际S/L”。
(FYI:在$阿迪的值相匹配的DB)
显然,存储当值没有逃脱。

如何找到我的比赛吗?


[编辑]
AHAH!
我觉得我我们到的东西。 的$阿迪价值的来源是一个文件

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

然后我做了

foreach ($addresses as $addy) {} 

好吧,当我逃离$阿迪字符串,它逃避新行字符和包括“\ r \ n“到比较字符串的末尾。
除非有人提出了一种更优雅的方式,我想我会概率剥夺那些有str_replace()函数。

:)
[\编辑]

+0

你尝试查询它是现在的方式是什么? – 2012-04-12 21:29:52

+0

是的,尝试过,但没有运气。 – mOrloff 2012-04-12 22:13:33

+0

因为直到第二天我还没有回答我自己的问题,所以我编辑了一些内容。谢谢,一堆:) – mOrloff 2012-04-12 22:23:36

使用mysql_real_escape_string

$addy = mysql_real_escape_string($addy); 

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


对本声明:

显然,存储当值没有逃脱。

这是不正确的逻辑。如果这些值在原始INSERT语句中未被转义,则该语句将失败。如果没有逃脱,你会得到syntax error near "l S/L' LIMIT 1"的错误。数据正确存储在数据库中的事实证明,插入它的人能够正确地做到这一点(通过转义或使用参数化查询)。

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

+0

这是第一件事我试过一个;),但很可惜......没有行再搭配因为DB具有非转义值... IE浏览器:它试图逃出我的字符串“Acme的诠释\'L”相匹配“Acme Int'l”的DB值。其他想法????? – mOrloff 2012-04-12 22:01:37

+1

@mOrloff:对不起,你明显错了。如果字符串在你的SQL查询中被转义,它将*匹配“非转义”值。事实上,这是*整点*!很明显,你的字符串不匹配的原因是不同的。而且你问另一个想法......但你甚至*尝试*使用参数化查询,这是我的另一个建议?还是你完全忽略了我的答案? – 2012-04-12 22:06:29

+0

:D ..谢谢BUNCH ..请参阅我的更新到我的OP – mOrloff 2012-04-12 22:26:22

为什么你认为已经存储在表中的数据应该逃脱?

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

+0

对我来说最令人瞩目的是现在可以为字符串调整B4存储在数据库中,这是我遇到的非常类似的问题...除了那......只是一个很好的形式。然后,B4在任何类型的代码块中使用,U简单地剥去斜杠。 .......除非我已经有这些年的低音赞助:) :) – mOrloff 2012-04-12 22:07:59

+1

没有通用的逃避。 SQL有一组特殊字符('''',''''等),HTML还有其他的设置('','&'等)。在你使用之前 – 2012-04-12 22:11:18

+0

这是有道理的......我会更多地研究它,谢谢 – mOrloff 2012-04-12 22:25:15

当执行查询时,没有什么espaced的。 MySQL转换它并插入,否则它不会插入并因为语法而给出错误,或者我们为了像sql注入这样的安全性而转义它们。

因此,与转义的值查询将是工作的罚款与数据库中的数据。

+0

如果我理解正确,那么我的最初预感是正确的......我逃脱了弦乐......并得到了零匹配:( – mOrloff 2012-04-12 22:12:46

+0

你能提供你逃过的字符串的值,并且表中的行应该匹配吗?也许你是逃避2次或更多次,这将导致\\'字符。同时让我举个例子,你的数据库中有“Ata's Home”,它看起来没有逃脱,你用WHERE column ='Ata \'Home'来查询它,并且应该匹配,如果不匹配,找出问题 – 2012-04-12 22:16:34

如果当你试图进入其中存储那么就会造成SQL错误时,并没有逃过值。

的问题是,当你查询的数据不被转义。

快速劈:使用mysql_real_escape_string

妥善解决:不要被串在一起,混搭构建SQL。 Use prepared statements and parameterized queries

+0

感谢您的链接...这是一个快速和肮脏的任务,所以我正在恢复whatev呃方法出来的存储(我的尘土飞扬的脑)首先...大声笑...显然我应该重新思考这种方法:D – mOrloff 2012-04-12 22:37:52

另一种办法是改变你的查询,这...

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

试过... MySQL只需要单引号中的值(甚至直接在PMA中测试): ( ... 其他想法 ?? – mOrloff 2012-04-12 22:04:46

问题竟然是换行字符 的$阿迪价值的源泉开始了这样的

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

我再通过

foreach ($addresses as $addy) {} 

去当我上课抓住$ addy字符串,它将转义新的字符串,并在比较字符串的末尾插入“\ r \ n”。
只要我逃出来,与下降string_replace()的字符,一切都顺顺当当

感谢-一个束团的帮助