setAttribute(PDO::ATTR_STATEMENT_CLASS, array('YPDOStmt', array($pdo))); */ class YPDOStmt extends PDOStatement{ /** * Error-Format(printf). Parameter 1 => PDO-Fehlermeldung, Parameter 2 => SQL-Statement * @var String */ const C_DEFAULT_ERROR_FORMAT = '%1$s
parsed SQL:

%2$s

'; public $error_format = self::C_DEFAULT_ERROR_FORMAT; /** * zuletzt ausgeführtes SQL * @var String */ public $executedSql; protected $params = array(); protected $pdo; /** * @see PDOStatement::__construct() */ protected function __construct($pdo) { $this->pdo = $pdo; } /** * bindParam überschreiben, damit der Parameter gespeichert wird. * @see PDOStatement::bindParam() */ public function bindParam($parameter, &$variable, $data_type = null , $length = null, $driver_options = null){ parent::bindParam($parameter, $variable, $data_type, $length, $driver_options); if(is_numeric($parameter)) $parameter = $parameter-1; $this->params[$parameter] = new YPDOParam($this->pdo, $parameter, $variable, $data_type, $length, $driver_options); } /** * bindValue überschreiben, damit der Parameter gespeichert wird. * @see PDOStatement::bindValue() */ public function bindValue($parameter, $value, $data_type = null){ parent::bindValue($parameter, $value, $data_type); if(is_numeric($parameter)) $parameter = $parameter-1; $this->params[$parameter] = new YPDOParam($this->pdo, $parameter, $value, $data_type); } /** * execute überschreiben, damit das SQL-Statement mit den Aktuellen Variableninhalten gespeichert wird * Die PDOException wird um das SQL-Staement erweitert * @see PDOStatement::execute() */ public function execute($input_parameters = null){ //Es wurden Parameter mitgegeben. Diese also noch erfassen if(is_array($input_parameters)){ $this->params = array(); foreach(array_keys($input_parameters) as $key){ //$input_parameters[$key] anstelle von $value aus einer normalen foreach() übergeben, //da das YPDOParam eine Refernz erstellt. Ansonsten hätten am Ende alle Parameter den Wert des letzten Values $this->params[$key] = new YPDOParam($this->pdo, $key , $input_parameters[$key]); } } //SQL genereiren und speichern $this->executedSql = $this->getSql(); //parent->execute ausführen try{ parent::execute($input_parameters); }catch (PDOException $e){ //Den Fehler um das SQL-Statement erweitern $msg = sprintf($this->error_format, $e->getMessage(), $this->executedSql); throw new PDOException($msg, (int)$e->getCode(), $e); } } /** * SQL-Statement mit den aktuellen Variabelninhalten erstellen * @return String */ public function getSql(){ $sql = $this->queryString; if(count($this->params) > 0){ reset($this->params); //Der Query-String hat ? als Platzhalter if(is_numeric(key($this->params))){ foreach($this->params as $key => &$param){ $sql = preg_replace('/\?/', $param->getValue(), $sql, 1); } //Der Query-String hat Variablen als Platzhalter }else{ foreach($this->params as $key => $param){ $sql = preg_replace("/(?getValue(), $sql); } } } return $sql; } /** * Gibt alle Parameters zurück * @return Array */ public function getParams(){ return $this->params; } /** * gibt einen einzelnen Parameter zurück * @param Key oder Index * @return YPDOParam */ public function getParam($iKey){ return $this->params[$iKey]; } } /** * Parameter-Klasse mit allen Informationen zu PDO-Bind Params * @author Stefan Erb */ class YPDOParam{ protected $pdo; /** * @param PDO PDO-DB-Connection * @see PDOStatement::bindParam() */ public function __construct(&$pdo, $parameter, &$variable, $data_type = null , $length = null, $driver_options = null){ $this->pdo = &$pdo; $this->parameter = $parameter; $this->variable = &$variable; $this->data_type = $data_type; $this->length = $length; $this->driver_options = $driver_options; } /** * @return Query-String mit PDO geparst. Nimmt die Aktuellen Werte der referenzierten Variable */ public function getValue(){ return $this->pdo->quote($this->variable, $this->data_type); } } ?>