我应该在使用预准备语句和Where LIKE'%abc%abc'时手动转义%

时间:2013-10-08 09:02:19

标签: php mysql pdo sql-like

我的表格中有一些标签有(%),例如:%tagtag% 我正在使用PDO准备好的声明,我的问题是如果我需要转义%或者像这样离开它:

$query = "SELECT * FROM table where tags like :tags";

$tags = 'tag%';
//or
$tags = 'tags\%';

$sth->prepare($query);
$sth->bindValue(":tags", '%'.$tags.'%');

更新:

当我使用以下方法搜索test%test时,列值为test%test:LIKE %test%test没有转义,但是我希望找到包含%的所有标记,因此当我使用{{ 1}}没有转义,即使列不包含%%%

,也会显示所有结果

DEMO:http://sqlfiddle.com/#!2/ae24e/6

2 个答案:

答案 0 :(得分:3)

从阅读评论中,我认为你的问题是: [LIKE %%%%test%test%之间的区别也是如此'%\ %%'。

虽然我确定你知道大部分内容,但为了清晰起见,我将从头开始。

    SQL中的
  • '%' 条款是一个'通配符'它匹配任何东西。有关详细信息,请参阅http://www.w3schools.com/sql/sql_wildcards.asp。 (如果您熟悉表达语言,则类似于'。*')

  • 另一方面,
  • ' \%' 逃脱了#通配符'功能,让您匹配'%'字符串中的字符。 (在表达语言中它与' \。'相同,允许你匹配字符串中的点)

所以在你的情况下:

  • ' %%%' 表示: [匹配任何内容] [匹配任何内容] [匹配任何内容] ,并且相同as'%'

  • '%test%test%' 表示: [任何]测试[任何]测试[任何] ,并且因为有两个测试'在字符串中,它是一个匹配。匹配包括' testtest' asfasdftestasfasftest' asfasftesttestasdfsd',' test %%%% test',' %% %%%测试%%%%测试%%%%'

  • '%\ %%' 表示: [任何]%[任何] ,只要该字符串包含'%'字面意思是匹配。匹配包括' %%%%%',' asdfasdf%dsaf','%dasfa',' asdfasdf%',&# 39; ASDF %% dsaf %%大法%DAF%'

如果这已经回答了你的问题,请告诉我。

答案 1 :(得分:-2)

我个人会这样做:

$query = "SELECT * FROM tabler WHERE tags LIKE :tags";
$sth->prepare($query);
$sth->bindValue(':tags', "%{%tags}%";