传递数组参数并在 PDO 中使用 LIMIT 子句
处理数据库查询时,将参数数组传递给使用 LIMIT 子句时的 PDO 语句。然而,当使用 bindParam 方法设置各个参数时,这可能具有挑战性。
困境
出现挑战是因为 LIMIT 子句需要绑定特定的数值,而执行方法需要一个命名参数数组。这种不兼容性导致两种方法无法同时使用。
克服问题
解决方案在于禁用 PDO::ATTR_EMULATE_PREPARES 的默认设置。启用后,PDO 在内部生成动态 SQL 和引号值,本质上模拟准备好的语句。但是,此默认行为会干扰传递命名参数。
禁用模拟准备
通过使用 setAttribute 方法将 PDO::ATTR_EMULATE_PREPARES 设置为 false,将禁用默认行为。这允许 PDO 使用实际的准备好的语句,启用命名参数的绑定,同时仍然使用 LIMIT 子句。
用法示例
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%') LIMIT :limit1, :limit2";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':id' => $id, ':limit1' => $limit1, ':limit2' => $limit2)); // Works!
性能注意事项
MySQL 默认使用模拟准备来增强性能。禁用模拟准备可能会稍微降低性能,但它可以提高参数绑定的灵活性。
其他资源
有关此主题的更多信息,请参阅以下资源:
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3