在 PHP MySQLi 准备语句中组合 LIKE 和 IN



尝试为设备数据库构建搜索页面,我有一个准备好的语句,它接受设备"标签"(始终需要(并在六个不同的数据字段中搜索关键字,其中"标签"与用户输入匹配。

问题是,如果关键字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 IN代替LIKE.如何实现这一点?

like要求wildcards具有松散匹配。

例如

select * from table where a like 'b'

与以下相同:

select * from table where a = 'b'

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

从手册:

使用 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之后(

最新更新