У меня проблема с параметром вопросительного знака в подготовленном операторе с использованием 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);
}
}
У меня проблема в том, что я просто вижу первый продукт (это тест против установки vanilla OpenCart) с идентификатором 28. Как вы можете видеть в моем коде, если переданный параметр является массивом, он автоматически определяется лямбдой, которую я имею на месте в конструкторе класса Query, поэтому он отображается как строка, например 28,29,30,46,47
.
Есть ли отсутствующий параметр в настройке PDO, которого мне не хватает? Или, может быть, в том, что я делаю, есть какая-то ошибка или ограничение платформы? Я знаю, что есть некоторые ограничения на то, что PDO может делать в отношении массивов, и поэтому я предварительно разбиваю все массивы, чтобы они передавались как простая строка.
Есть несколько процедур, которые я видел здесь в SO, которые, в основном, составляют строку запроса, такую как WHERE product_id IN ({$marks})
, где $marks
динамически генерируется с использованием процедуры, такой как str_repeat("?", sizeof($parameters))
, но это не то, что я ищу (я мог бы прибегнуть к этому, если есть нет известной альтернативы, но это не выглядит очень элегантным решением).
Моя среда разработки состоит из: Windows 7 x64, PHP 5.4.13 (x86, потокобезопасный), Apache 2.4.4 (x86) и MySQL 5.6.10 x64.
Любая подсказка будет принята с благодарностью :)
setLimit()
. Забыл почистить. Упомянутые вами свойства реализованы с помощью свойства attribute, которое, по сути, является ассоциативным массивом. Хорошо служит цели и позволяет избежать пустых элементов, когда какое-либо свойство не применимо или не включено во время строительства. Класс Query завершен сам по себе. Существует четыре класса для управления базой данных: Manager, Connection, Query и QueryGroup. В данном случае фрагмент выполнения принадлежит классу Connection (поэтому он может управлять как одиночными, так и групповыми запросами). - person Julio María Meca Hansen   schedule 08.04.2013