1

该表具有转义的公司名称。
我的qry看起来像

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

问题在于表中的公司名称值有时类似于“ Acme Int'l S/L ”。
(仅供参考:$addy 的值与数据库匹配)
显然,这些值在存储时没有被转义。

如何找到我的匹配项?


[编辑]
啊哈!
我想我正在做某事。$addy 值的来源是一个文件

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

然后我做一个

foreach ($addresses as $addy) {}

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

:)
[\编辑]

4

6 回答 6

0

问题原来是换行符 $addy 值的来源是这样开始的

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

然后我通过

foreach ($addresses as $addy) {}

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

谢谢你的帮助

于 2012-04-14T00:02:40.960 回答
0

使用mysql_real_escape_string

$addy = mysql_real_escape_string($addy);

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


关于此声明:

显然,这些值在存储时没有被转义。

这是不正确的逻辑。如果原始 INSERT 语句中的值未转义,则该语句将失败。如果不转义,您将收到类似syntax error near "l S/L' LIMIT 1". 数据正确存储在数据库中的事实证明,无论谁插入它,都能够正确地完成它(通过转义或使用参数化查询)。

如果您的操作正确,则数据不应转义形式存储在数据库中。

于 2012-04-12T21:26:45.927 回答
0

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

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

于 2012-04-12T21:27:16.510 回答
0

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

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

于 2012-04-12T21:27:42.050 回答
0

如果这些值在存储时没有转义,那么当您尝试输入它们时它们会导致 SQL 错误。

问题是当您进行查询时数据没有被转义。

快速破解:使用mysql_real_escape_string

正确的解决方案:不要通过将字符串混合在一起来构建 SQL。使用准备好的语句和参数化查询

于 2012-04-12T21:28:01.067 回答
0

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

$sql = "SELECT id FROM contact_supplier WHERE name = \"$addy\" LIMIT 1";
于 2012-04-12T21:28:51.333 回答