diff --git a/wire/core/WireDatabasePDO.php b/wire/core/WireDatabasePDO.php index b6f449d3..9026ce0f 100644 --- a/wire/core/WireDatabasePDO.php +++ b/wire/core/WireDatabasePDO.php @@ -17,6 +17,7 @@ * #pw-summary All database operations in ProcessWire are performed via this PDO-style database class. * * @method void unknownColumnError($column) #pw-internal + * @property bool $debugMode * */ class WireDatabasePDO extends Wire implements WireDatabase { @@ -494,9 +495,12 @@ class WireDatabasePDO extends Wire implements WireDatabase { * #pw-group-PDO * * @param string $statement - * @param array|string $driver_options Driver options array or you may specify $note here + * @param array|string|bool $driver_options Optionally specify one of the following: + * - Boolean true for WireDatabasePDOStatement rather than PDOStatement (also assumed when debug mode is on) 3.0.162+ + * - Driver options array + * - or you may specify the $note argument here * @param string $note Debug notes to save with query in debug mode - * @return \PDOStatement + * @return \PDOStatement|WireDatabasePDOStatement * @link http://php.net/manual/en/pdo.prepare.php * */ @@ -504,6 +508,10 @@ class WireDatabasePDO extends Wire implements WireDatabase { if(is_string($driver_options)) { $note = $driver_options; $driver_options = array(); + } else if($driver_options === true) { + $driver_options = array( + \PDO::ATTR_STATEMENT_CLASS => array(__NAMESPACE__ . "\\WireDatabasePDOStatement", array($this)) + ); } $pdoStatement = $this->pdo()->prepare($statement, $driver_options); if($this->debugMode) { @@ -985,7 +993,8 @@ class WireDatabasePDO extends Wire implements WireDatabase { * */ public function __get($key) { - if($key == 'pdo') return $this->pdo(); + if($key === 'pdo') return $this->pdo(); + if($key === 'debugMode') return $this->debugMode; return parent::__get($key); } diff --git a/wire/core/WireDatabasePDOStatement.php b/wire/core/WireDatabasePDOStatement.php index 239bdd2f..07ac7677 100644 --- a/wire/core/WireDatabasePDOStatement.php +++ b/wire/core/WireDatabasePDOStatement.php @@ -57,6 +57,14 @@ class WireDatabasePDOStatement extends \PDOStatement { */ protected $debugNote = ''; + /** + * Debug mode? + * + * @var bool + * + */ + protected $debugMode = false; + /** * Construct * @@ -67,6 +75,7 @@ class WireDatabasePDOStatement extends \PDOStatement { */ protected function __construct(WireDatabasePDO $database) { $this->database = $database; + $this->debugMode = $database->debugMode; } /** @@ -116,7 +125,7 @@ class WireDatabasePDOStatement extends \PDOStatement { */ public function bindValue($parameter, $value, $data_type = \PDO::PARAM_STR) { $result = parent::bindValue($parameter, $value, $data_type); - if(strpos($parameter, ':') === 0) { + if($this->debugMode && strpos($parameter, ':') === 0) { $this->setDebugParam($parameter, $value, $data_type); } else { // note we do not handle index/question-mark parameters for debugging @@ -126,13 +135,29 @@ class WireDatabasePDOStatement extends \PDOStatement { /** * Execute prepared statement + * + * @param array|null $input_parameters + * @return bool + * @throws \PDOException + * + */ + public function execute($input_parameters = NULL) { + if($this->debugMode) { + return $this->executeDebug($input_parameters); + } else { + return parent::execute($input_parameters); + } + } + + /** + * Execute prepared statement when in debug mode only * * @param array|null $input_parameters * @return bool * @throws \PDOException * */ - public function execute($input_parameters = NULL) { + public function executeDebug($input_parameters = NULL) { $timer = Debug::startTimer(); $exception = null;