我在使用 PDO 的准备好的语句中遇到问号参数问题。我的 Query 类看起来像这样(目前,我仍在为正在使用的驱动程序添加数据限制、自定义参数过滤和自动检测支持的语句等功能):
// SQL query
class Query {
public $attributes;
// constructor for this object
public function __construct() {
if ($arguments = func_get_args()) {
$tmp = explode(" ", current($arguments));
if (in_array(mb_strtoupper(current($tmp)), ["ALTER", "DELETE", "DROP", "INSERT", "SELECT", "TRUNCATE", "UPDATE"], true)) {
// classify the query type
$this->attributes["type"] = mb_strtoupper(current($tmp));
// get the query string
$this->attributes["query"] = current($arguments);
// get the query parameters
if (sizeof($arguments) > 1) {
$this->attributes["parameters"] = array_map(function ($input) { return (is_array($input) ? implode(",", $input) : $input); }, array_slice($arguments, 1, sizeof($arguments)));
}
return $this;
}
}
}
}
这是执行查询的代码片段:
$parameters = (!empty($this->attributes["queries"][$query]->attributes["parameters"]) ? $this->attributes["queries"][$query]->attributes["parameters"] : null);
if ($query = $this->attributes["link"]->prepare($this->attributes["queries"][$query]->attributes["query"], [\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY])) {
if ($query->execute((!empty($parameters) ? $parameters : null))) {
return $query->fetchAll(\PDO::FETCH_ASSOC);
}
}
这就是我在测试代码中的称呼:
$c1->addQuery("lists/product-range", "SELECT * FROM `oc_product` WHERE `product_id` IN (?);", [28, 29, 30, 46, 47]);
if ($products = $c1->execute("test2")) {
foreach ($products as $product) {
print_r($product);
}
}
我遇到的问题是我只看到第一个产品(它是针对普通 OpenCart 安装的测试),ID 为 28。正如您在我的代码中看到的,如果传递的参数是一个数组,它会被我的 lambda 自动检测到在 Query 类构造函数中,所以它被呈现为一个字符串,如28,29,30,46,47
.
PDO 设置中是否缺少我缺少的参数?或者我正在做的事情可能存在一些错误或平台限制?我知道 PDO 在数组方面可以做的事情有一些限制,这就是为什么我预先分解所有数组以便它们像简单的字符串一样传递。
我在 SO 中看到了一些程序,它们基本上组成了查询字符串,例如,使用类似的程序动态生成WHERE product_id IN ({$marks})
where但这不是我想要的(如果没有已知的替代方案,我可以求助于,但它看起来不是一个非常优雅的解决方案)。$marks
str_repeat("?", sizeof($parameters))
我的开发环境由:Windows 7 x64、PHP 5.4.13(x86,线程安全)、Apache 2.4.4(x86)和 MySQL 5.6.10 x64 组成。
任何提示将不胜感激:)