使用PDO和LIKE不工作,为什么?

时间:2015-06-17 22:09:56

标签: mysql pdo

我正在使用PDO连接到MySQL。一切都运转良好,除非这不起作用。

有谁知道为什么?我应该怎么做?

SELECT * FROM flagIt WHERE :flagids LIKE CONCAT('%', flagIt.flagIt_id, '%')

:flagids等同于“ID1 ID2 ID3”之类的字符串。

编辑(只是为了比较)

SELECT * FROM flagIt WHERE 'ID1 ID2 ID3' LIKE CONCAT('%', flagIt.flagIt_id, '%)

如果我这样使用它,它可以正常工作,所以...为什么它不起作用:flagids?

我希望你能理解我的问题。

非常感谢。

修改

我试过了:

"SELECT * FROM flagIt WHERE flagIt.flagIt_id IN(:flagids)"

和Hobo Sapiens建议

"SELECT * FROM flagIt WHERE FIND_IN_SET(flagIt.flagIt_id, :flagids)"

并没有任何作用!!!!!!!!!

1 个答案:

答案 0 :(得分:0)

这是您提交给PDO :: prepare()的查询:

SELECT * FROM flagIt WHERE :flagids LIKE CONCAT('%', flagIt.flagIt_id, '%')

准备声明的过程并不仅仅涉及评估占位符的内容,将它们替换为字符串并执行生成的查询。

prepare要求服务器评估查询并准备包含将使用的表和索引的执行计划。为此,它需要知道它必须使用哪些表的哪些列,这就是为什么不能使用占位符而需要标识符的原因。

您的查询的问题是服务器在准备语句时无法知道占位符是表示字符串文字还是列标识符。如果没有这些信息,则无法完成准备,您的prepare将失败。

如果您对:flagids中使用的价值有一定的灵活性,可以使用find_in_set()

SELECT * FROM flagIt WHERE find_in_set(flagIt_id, :flagids)

其中包含'ID1,ID2,ID3'的变量绑定到:flagids

这适用于小型列表,但对于大型列表来说会很慢。

MySQL reference for find_in_set()