1

return_all などの「ショートカット」メソッドのサブオブジェクトと、PDO をデータベース オブジェクトとして実行するその他のメソッドを作成します。

要するに、すべてのクエリ (挿入、更新、削除、または選択) は 2 つの異なるメソッドを通過します。最後に実行を呼び出すメソッドは次のようになります。

/* * execute_prepared_sql() は、ユーザーのパラメーターに基づいて SQL を準備します: * */

private function execute_prepared_sql() {
    if ($this->prepare_sql() == true) {
        try {
            $this->stmt = $this->pdo->prepare($this->sanitized_sql);
            $this->stmt->execute($this->bound_parameters);
        } catch (PDOException $e) {
            set_debug($e->getMessage(), true);
            return false;
        }
        return true;
    }
    return false;
}

次に、次のようなメソッドがあります。

 public function return_active_partners() {
    if ($this->select(array("query_tables" => $this->table_name, "conditions" => array("AND" => array("partners.status" => 1))))) {
        $this->stmt->setFetchMode(PDO::FETCH_ASSOC);
        return $this->stmt->fetchAll();
    }
}

上記のメソッドは結果を効果的に返します ($this->select() は execute_prepared_sql() メソッドを呼び出します。

これはすべて完全に正常に機能しますが、「SQLSTATE [HY093]: 無効なパラメーター番号: パラメーターがバインドされていません」というエラーが発生する場合がある (そして実際にはランダムに) という非常に厄介な問題があります。お互いに2つのクエリを実行すると、さらに多く発生するようです(行を削除してから、残りの行の結果セットを返すとします)

発生しているように見えるのは、バインドされたパラメーターが execute_prepared_sql() 呼び出し中に削除されないことです。execute() が呼び出されると、バインドされたすべてのパラメーターが「リセット」またはクリアされるという印象を受けましたが、そうではないようです。

私の質問は、同じパラメーターを 2 回使用しないようにするために、PDO ステートメントに保存されている可能性のあるバインドされたパラメーターをクリアするにはどうすればよいですか? または、私が間違っていることが問題である可能性があることがわかりますか?

4

0 に答える 0