在PHP MySQLi预处理语句中结合LIKE和IN

时间:2017-04-07 02:52:16

标签: php mysqli prepared-statement

尝试为设备数据库构建搜索页面,并且我有一个准备好的语句,该语句采用设备“标记”(总是需要)并在六个不同的数据字段中搜索关键字,其中“标记”与用户输入匹配。

问题是,如果关键字是IN这些可能很长的字段之一,则找不到任何结果,因此缺少许多预期结果。

在常规SQL中,我只需要一个表连接,并向LIKE查询添加IN查询;但是使用mysqli我正在使用?占位符的预备语句,并且不确定如何为每个变量多次使用此标记。

我的陈述是:

if (!($stmt = $conn->prepare("SELECT * FROM equipment 
    WHERE EQUIP_CND LIKE ? 
    AND (EQUIP_TYP LIKE ? OR ((EQUIP_SER LIKE ? OR EQUIP_PNO LIKE ?) 
        OR (EQUIP_LOC LIKE ? OR EQUIP_CMT LIKE ?)));"))) {
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
}

我想用LIKE替换LIKE IN。怎么做到这一点?

1 个答案:

答案 0 :(得分:0)

like要求wildcards松散匹配。

e.g。

select * from table where a like 'b'

与:

相同
select * from table where a = 'b'

因此会找到b的记录,但abc不会。

来自manual

  

使用LIKE,您可以在模式中使用以下两个通配符:

     

匹配任意数量的字符,即使是零字符。

     

_ 只匹配一个字符。

所以要找到abc,你要使用:

select * from table where a like '%b%'

对于预准备语句,通配符会附加到变量或绑定中,而不是查询本身。 PDO手册页上的示例6显示了这一点。 http://php.net/manual/en/pdo.prepared-statements.php#example-991(在评论// placeholder must be used in the place of the whole value之后)