gpt4 book ai didi

php - PDO-SQLSTATE[HY093] : Invalid parameter number with UNION query

转载 作者:行者123 更新时间:2023-11-29 03:56:29 25 4
gpt4 key购买 nike

我整个晚上都在研究并试图找出我的搜索查询有什么问题。我使用联合查询和分页进行一些通配符搜索。

$current_page = 0;

$search1 = $search;
$search2 = $search."%";
$search3 = "%".$search."%";

$pdo = DB::connection()->getPdo();

$stmt = $pdo->prepare('
SELECT id, desc FROM table WHERE desc LIKE :search1 LIMIT :skip, 15
UNION
SELECT id, desc FROM table WHERE desc LIKE :search2 LIMIT :skip, 15
UNION
SELECT id, desc FROM table WHERE desc LIKE :search3 LIMIT :skip, 15
');

$stmt->bindParam(':search1', $search1);
$stmt->bindParam(':search2', $search2);
$stmt->bindParam(':search3', $search3);
$stmt->bindParam(':skip', $current_page, PDO::PARAM_INT);

$stmt->execute();

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

第一个查询(没有联合)工作正常,或者如果我删除 :skip 参数,它也工作正常。

有什么问题吗?

最佳答案

在 PDO 中使用命名参数,您不能多次使用相同的名称,除非您这样做:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

但是如果您这样做,:skip 的值将作为带引号的字符串插入到查询中,这在 LIMIT 的上下文中是无效的。换句话说:

LIMIT '0', 15

导致语法错误,因为 LIMIT 只需要真正的整数作为它的参数。

有关更多示例和解释,请参阅我对 Parametrized PDO query and LIMIT clause - not working 的回答

因此,您的选择是为每次出现的 :skip 添加一个单独的参数:

$stmt = $pdo->prepare('
SELECT id, desc FROM table WHERE desc LIKE :search1 LIMIT :skip1, 15
UNION
SELECT id, desc FROM table WHERE desc LIKE :search2 LIMIT :skip2, 15
UNION
SELECT id, desc FROM table WHERE desc LIKE :search3 LIMIT :skip3, 15
');

$stmt->bindParam(':search1', $search1);
$stmt->bindParam(':search2', $search2);
$stmt->bindParam(':search3', $search3);
$stmt->bindParam(':skip1', $current_page, PDO::PARAM_INT);
$stmt->bindParam(':skip2', $current_page, PDO::PARAM_INT);
$stmt->bindParam(':skip3', $current_page, PDO::PARAM_INT);

或者自己将值插入到查询中,引用整数。

但我同意@Class 的评论,您根本不必执行 UNION。如果不出意外,'%search%' 适用于其他两种模式:'search%''%search'。您不必搜索所有三个。

关于php - PDO-SQLSTATE[HY093] : Invalid parameter number with UNION query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com