2017-08-14 62 views
0

我有一个MySQL查询将受益于通配符样式的运算符。不幸的是,因为我无法弄清楚如何缩小搜索关键字,因此互联网搜索非常困难。我可以在WHERE子句中使用通配符运算符吗?

我有,例如...

$my_color = "red"; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color=:color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

这个伟大的工程。但我想让客户有能力搜索任何颜色。是的,我可以(基本上)围绕整个PDO块(基本上)if-then创建多个查询,但我希望有一个更优雅的解决方案。

MySQL是否有能力设置一个WHERE条件转换为“接受任何东西”?假设一个虚构的MySQL命令,ANY,我想设置我的变量的能力...

$my_color = "ANY"; 

,并得到任何颜色的所有行。

+0

'WHERE color LIKE'%%'' - '$ my_color =“%%”' – GrumpyCrouton

+0

为什么不只是不使用where子句,它会给你所有的东西。或者,如果您必须在where子句中输入,则可以说1 = 1。 –

回答

1

使用LIKE而不是=。如果该值不包含任何通配符,则LIKE执行完全等效检查。但是,您可以使用%作为通配符来匹配任何内容。所以:

$color = '%'; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color LIKE :color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

但是,更好的选择可能是将逻辑放在PHP而不是SQL中。

if ($color) { 
    $a = $pdo->prepare("SELECT * FROM my_table WHERE color=:color"); 
    $a->bindParam('color', $my_color); 
} else { 
    $a = $pdo->prepare("SELECT * FROM my_table"); 
} 
$a->execute(); 

参见https://stackoverflow.com/a/28909923/1491895一个更一般的技术用于从多个表单输入动态建立的WHERE子句。

+0

我很好奇,为什么要处理它PHP方面是一个_better选项_? – GrumpyCrouton

2

您可以使用LIKE子句的输入是这样的通配符:

$my_color = "%"; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color LIKE :color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

More Info on the LIKE clause

相关问题