8

私はmysql_queryを使用していて、今はPDOを使用して始めています。これは素晴らしいです!

しかし、古いスクリプトでは、動的クエリビルダーを構築していたため、PDOを使用してそれを移植するのに苦労しています。

誰かが私にいくつかの方向性を与えることができればそれは素晴らしいことです!

これがその理論です。

  1. 私はの配列を持っています
  2. DBフィールドと値(挿入時)。
  3. クエリ文字列を作成して、有効なPDOトランザクションを生成します

これが私がやろうとしていることの一部です。

public $dbFields; // This is an array of the fields plus VALUES

public function select($where, $limit) {
    // This is what I **had** before
    $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit."";

    // Now i need to convert that to PDO
    $this->connection->beginTransaction();

    # START Query
    $select = $this->connection->prepare("SELECT {$this->fieldNames} FROM {$this->table}");

    // I need to BIND my params and values, but i'm not sure the best route to take when I have a WHERE clause that includes, "AND" / "OR" operators.

    # EXECUTE the query
    $select->execute();

    $this->connection->commit();
}

これは私が以前持っていたものです

$results = $db->select("userId = 111 OR userId = 222");

しかし、私がする必要があると思っているのは、もっと次のようなものを使用することです

$results = $db->select(array("userId"=>111, "userId"=>222));

私はこれが難しい注文であることを知っています、そして私がやろうとしていることにそれが理にかなっていることを願っています、しかしこれらのクエリを構築しようとする試みの助けは大いにありがたいです。

4

2 に答える 2

5

$paramsメソッドに別のパラメータが必要になりますselect。メソッドパラメータのデフォルトを自由に提供しました。@userXxxxのメモのように、を実行するためだけにトランザクションは必要ありませんSELECT

<?php

class db {

    public $connection; //PDO
    public $dbFields; // This is an array of the fields plus VALUES

    public function select($where = '1', $params = array(), $limit = '', $fetchStyle = PDO::FETCH_ASSOC) { //fetchArgs, etc
        $fields = implode(', ', $this->dbFields);

        //create query
        $query = "SELECT $fields FROM {$this->table} WHERE $where $limit";

        //prepare statement
        $stmt = $this->connection->query($query);

        $stmt->execute($params);

        return $stmt->fetchAll($fetchStyle);
    }

    //...
}


$where = 'userId IN(:userId1, :userId2)';
$params = array(':userId1' => 111, ':userId2' => 2222);
$db->select($where, $params);

ノート:

  • 本当に必要な場合は、 PDOStatement :: fetchAllのすべての柔軟性に一致するように、メソッドパラメーターを追加できます。
  • $dbFields「フィールドプラスバリュー」とはどういう意味かわかりません。説明できますか?

[編集]

PDOStatement :: executeのドキュメント/例を確認することをお勧めします。これは、混乱の根底にあるように思われるためです。特に、$input_parametersメソッドパラメータです。

于 2012-08-28T03:14:11.540 に答える
-2

これはどうですか?

public function select($where, $limit) {
    $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit."";
    $this->connection->query($query);
}

//Use what you had before:
$results = $db->select("userId = 111 OR userId = 222");

トランザクション(オールオアナッシングベースまたは例外とロールバックのキャッチ)または準備されたクエリ(複数のクエリの送信)を使用する理由がわかりません...

于 2012-08-28T02:51:51.933 に答える