尝试为设备数据库构建搜索页面,并且我有一个准备好的语句,该语句采用设备“标记”(总是需要)并在六个不同的数据字段中搜索关键字,其中“标记”与用户输入匹配。
问题是,如果关键字是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
。怎么做到这一点?
答案 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
之后)