尝试为设备数据库构建搜索页面,我有一个准备好的语句,它接受设备"标签"(始终需要(并在六个不同的数据字段中搜索关键字,其中"标签"与用户输入匹配。
问题是,如果关键字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
之后(