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));
}
}