2

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 で構成されています。

どんなヒントでも大歓迎です:)

4

2 に答える 2