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