2

PDO 経由で SQL ステートメントを実行するために使用する php クラスがあります。クラスは FetchAll のデータをそのクエリにパブリック変数に保存しますが、問題は、クエリがどうなるかわからないため、データ操作クエリ (INSERT、DELETE、UPDATE) で FetchAll を呼び出すことになります。

特定のクエリがフェッチ可能かどうかを知るにはどうすればよいですか? クエリが INSERT/DELETE/UPDATE から始まるかどうかを確認するようなハックを使用したくありません。

class mysql {
    public $call, $rows;
    public function query($a) {
        $this->call = $pdo->prepare($a['query']);
        foreach($a['params'] as $key => $param) {$this->call->bindValue($key + 1, $param);}
        $this->rows = $this->call->fetchAll(PDO::FETCH_ASSOC);
    }
}

操作クエリを実行すると、エラーがスローされます。

編集:完全なクラス

class mysql {
    public $call, $rows;

    // allows query on construct time
    function __construct($a = false) {if($a) $this->query($a);}
    public function query($a) {
        $this->call = $pdo->prepare($a['query']);

        // execute the query with or without parameters, and if it succeeds and dontLog is not set and the query has data manipulation then call the log function to log the query along with user id
        if($this->call->execute(isset($a['params']) ? $a['params'] : null) && !isset($a['dontLog']) && in_array(substr($a['query'], 0, 6), array('INSERT','UPDATE','DELETE'))) $this->log(isset($a['params']) ? json_encode($a['params']) : '');

        // if the call returns any columns then store it in rows public variable or store an empty array
        $this->rows = ($this->call->columnCount() > 0) ? $this->call->fetchAll(PDO::FETCH_ASSOC) : array();
    }
    private function log($params) {
        new mysql(array('query' => 'INSERT INTO logs (user, query, parameters) VALUES (?, ?, ?)', 'params' => array($GLOBALS['user']['id'], $this->call->queryString, $params), 'dontLog' => true));
    }
}
4

2 に答える 2

1

クラスです!

通常の関数にすぎないほどタフなメソッドが1つだけあるのはなぜですか?
なぜ常に FetchAll を返すのですか? 非常に便利なスカラーが返される可能性があります。それとも一列?
異なる結果に対して別々の方法を用意しないのはなぜですか?

  • 行のフェッチオール
  • 行の fetchrow
  • スカラーの fetchone
  • 他のすべてのクエリ

それは非常に便利で読みやすいでしょう

また、この奇妙なコードを変更する必要があります

foreach($a['params'] as $key => $param) {$this->call->bindValue($key + 1, $param);}

これに

$this->call->execute($a['params']);

現在のコードは明らかに機能しないためです。

または、本当に便利にするために

public function fetchAll($a)
{
    $params = func_get_args();
    $query = array_shift($args);
    $this->call = $pdo->prepare($query);
    $this->call->execute($params);
    return $this->call->fetchAll();
}

次のように呼び出されます。

$rows = $db->fetchAll("SELECT * FROM t WHERE cat=?",$catagory);

いいですね。

もう1つ-クラス変数に保存するのではなく、結果を返す必要があります。あなたのクラスはこれらの行を必要としませんが、呼び出しコードは必要とします。

于 2013-05-23T05:34:35.880 に答える