【发布时间】:2019-07-11 22:27:02
【问题描述】:
I've included a DB-fiddle, and you can adjust the input parameter accordingly。这将返回我所期望的结果,并且与我在 PDO 中看到的结果不同。
我有以下缩小的表格视图和查询:
CREATE TABLE `tagged` {
`tag` SMALLINT(5) UNSIGNED NOT NULL
}
表格有各种各样的值,但您可以使用 1-10 作为 DB 中的标签:
INSERT INTO tagged (tag) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
查询:
SELECT tagged.tag,
(@t := :tag),
@t AS temp_var,
(@t IS NULL OR FIND_IN_SET(tagged.tag, @t) > 0) AS is_match
FROM tagged
HAVING is_match = 1
LIMIT 150
当在客户端、命令行、jdbc 等中运行时,这似乎很好。如果我输入'' 或NULL,我会得到所有结果。同样,'1' 的输入只产生1 的标签,'1,4' 的输入将检索所有带有 1 或 4 的标签。
查询限制这些结果的方式是通过HAVING 子句中的is_match = 1。使用 PDO 运行时,参数似乎正确绑定,但它完全忽略了子句中的条件:
Array
(
[0] => stdClass Object
(
[tag] => 3
[(@t := ?)] => 1,4
[temp_var] => 1,4
[is_match] => 0 ## should not have been returned
)
[1] => stdClass Object
(
[tag] => 4
[(@t := ?)] => 1,4
[temp_var] => 1,4
[is_match] => 1
)
用于运行此程序的 PHP 代码(简化):
$conn = /* pdo connection object */;
$stmt = $conn->prepare(DB::queryOf('test')); //uses our above query from a file
$stmt->bindValue(':tag', $args['tag'], PDO::PARAM_STR); //hardcode binding '1,4'
$stmt->execute(); //also tried plain #execute($args)
return $stmt->fetchAll(PDO::FETCH_OBJ);
我有什么遗漏吗?我正在绑定一个直接字符串参数,似乎临时变量在那里并且设置正确。为什么 PDO 会返回 is_match = 0 的元素的结果?
【问题讨论】:
-
DB::queryOf()- 这不是 PDF。您应该告诉我们您正在使用哪个库。 -
它不是一个库,只是我编写的一个函数,它加载一个
.sql文件(在本例中名为test.sql)。从字面上看,只是一个file_get_contents电话。有问题的查询当然是在问题中。 -
如果没有 ORDER BY 子句,这一切都毫无意义。见:Why should I provide an MCVE for what seems to me to be a very simple SQL query?
-
您是否尝试过任何带有 HAVING 子句的简单查询?抱歉..但是您的示例不完整且太复杂。而且这个查询对我来说毫无意义。
-
这是出现问题的简化查询,像
SELECT tagged.tag FROM tagged HAVING tag = 1这样的操作将在 PDO 中正确执行。 @PaulSpiegel