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);
}
}
私が抱えている問題は、ID 28 の最初の製品 (バニラの OpenCart インストールに対するテスト) しか表示されないことです。コードでわかるように、渡されたパラメーターが配列の場合、私が持っているラムダによって自動的に検出されます。 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 で構成されています。
どんなヒントでも大歓迎です:)