在SQL中转义引号和百分号

时间:2013-05-24 22:02:16

标签: php sql escaping

我检查了类似的问题,但无法找到解决我特定问题的方法。我有一个PHP方法,我使用如下:

SELECT * FROM login WHERE userID = 10  //To get this 

$result = query("SELECT * FROM login WHERE userID = '%d' ", $userID) //I use this

所以字符集'%d'被我在$ userID中发布的内容替换,结果以JSON格式返回。现在我正在尝试使用它来进行搜索功能。

select * from login where userName like '%searchString%'  //Now to get this

$result = query("SELECT * FROM login WHERE userName LIKE '%'%s'%'", $username) // I am trying this

但是我错误可能是因为没有正确转义字符串。您是否有可能通过给定的信息解决这个问题?

谢谢

阿尔达

4 个答案:

答案 0 :(得分:3)

您还需要更改where子句以使用LIKE而不是=

$result = query("select * from login where userName like '%%s%'", $username)

我假设您的查询方法将使用$ username的值搜索/替换%s。要注意的是,使用“select *”会导致查询执行计划效率低下,您应该将*更改为要检索的表中的列的列表。另外,请注意SQL注入攻击。请参阅此链接http://en.wikipedia.org/wiki/SQL_injection

答案 1 :(得分:1)

您可以尝试更改此'%'%s'%'

select * from login where userName like '%searchString%'  //Now to get this


$username=mysql_real_escape_string($username);
$result = query("SELECT * FROM login WHERE userName = '%%s%'", $username) // I am trying this

答案 2 :(得分:0)

逃避报价和逃避百分比符号是两个不同的问题。

首先是报价。糟糕的方法是“引用引号”,即用两个单引号替换所有单引号。它有效,但也有缺点。更好的方法是使用查询参数。我不使用PHP所以我不知道所有细节,但我在StackOverflow上阅读了很多评论和答案,告诉php用户使用预准备语句。他们可能会或可能不会逃避报价。我的猜测是他们这样做了。

对于百分号,您必须用方括号将它们包围起来,以防止它们被视为外卡。例如,如果您的where子句是:

where somefield like '75%'

并且您希望它返回

75% of bus passengers like singing

但不返回

75 bottles of beer on the wall

那么你的where子句必须是:

where somefield like '75[%]%'

答案 3 :(得分:0)

我发现解决方案比我想象的要容易。我只是将%searchString%作为参数传递而不是普通的searchString