Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Making Statement a transparent decorator, creating PDOStatement
decorator to translate human fetch values to constants
- Loading branch information
Showing
5 changed files
with
135 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
123 changes: 123 additions & 0 deletions
123
lib/Cake/Model/Datasource/Database/Statement/PDOStatement.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
<?php | ||
/** | ||
* PHP Version 5.4 | ||
* | ||
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org) | ||
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) | ||
* | ||
* Licensed under The MIT License | ||
* For full copyright and license information, please see the LICENSE.txt | ||
* Redistributions of files must retain the above copyright notice. | ||
* | ||
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) | ||
* @link http://cakephp.org CakePHP(tm) Project | ||
* @since CakePHP(tm) v 3.0.0 | ||
* @license MIT License (http://www.opensource.org/licenses/mit-license.php) | ||
*/ | ||
namespace Cake\Model\Datasource\Database\Statement; | ||
|
||
use \PDO; | ||
use \PDOStatement as Statement; | ||
|
||
/** | ||
* Decorator for \PDOStatement class mainly used for converting human readable | ||
* fetch modes into PDO constants. | ||
*/ | ||
class PDOStatement extends \Cake\Model\Datasource\Database\Statement { | ||
|
||
/** | ||
* Constructor | ||
* | ||
* @param Statement implementation such as PDOStatement | ||
* @return void | ||
*/ | ||
public function __construct(Statement $statement = null, $driver = null) { | ||
$this->_statement = $statement; | ||
$this->_driver = $driver; | ||
} | ||
|
||
/** | ||
* Assign a value to an positional or named variable in prepared query. If using | ||
* positional variables you need to start with index one, if using named params then | ||
* just use the name in any order. | ||
* | ||
* You can pass PDO compatible constants for binding values with a type or optionally | ||
* any type name registered in the Type class. Any value will be converted to the valid type | ||
* representation if needed. | ||
* | ||
* It is not allowed to combine positional and named variables in the same statement | ||
* | ||
* ## Examples: | ||
* | ||
* `$statement->bindValue(1, 'a title');` | ||
* `$statement->bindValue(2, 5, PDO::INT);` | ||
* `$statement->bindValue('active', true, 'boolean');` | ||
* `$statement->bindValue(5, new \DateTime(), 'date');` | ||
* | ||
* @param string|integer $column name or param position to be bound | ||
* @param mixed $value the value to bind to variable in query | ||
* @param string|integer $type PDO type or name of configured Type class | ||
* @return void | ||
*/ | ||
public function bindValue($column, $value, $type = 'string') { | ||
if ($type === null) { | ||
$type = 'string'; | ||
} | ||
if (!ctype_digit($type)) { | ||
list($value, $type) = $this->cast($value, $type); | ||
} | ||
$this->_statement->bindValue($column, $value, $type); | ||
} | ||
|
||
/** | ||
* Returns the next row for the result set after executing this statement. | ||
* Rows can be fetched to contain columns as names or positions. If no | ||
* rows are left in result set, this method will return false | ||
* | ||
* ## Example: | ||
* | ||
* {{{ | ||
* $statement = $connection->prepare('SELECT id, title from articles'); | ||
* $statement->execute(); | ||
* print_r($statement->fetch('assoc')); // will show array('id' => 1, 'title' => 'a title') | ||
* }}} | ||
* | ||
* @param string $type 'num' for positional columns, assoc for named columns | ||
* @return mixed|boolean result array containing columns and values or false if no results | ||
* are left | ||
*/ | ||
public function fetch($type = 'num') { | ||
if ($type === 'num') { | ||
return $this->_statement->fetch(PDO::FETCH_NUM); | ||
} | ||
if ($type === 'assoc') { | ||
return $this->_statement->fetch(PDO::FETCH_ASSOC); | ||
} | ||
return $this->_statement->fetch($type); | ||
} | ||
|
||
/** | ||
* Returns an array with all rows resulting from executing this statement | ||
* | ||
* ## Example: | ||
* | ||
* {{{ | ||
* $statement = $connection->prepare('SELECT id, title from articles'); | ||
* $statement->execute(); | ||
* print_r($statement->fetchAll('assoc')); // will show [0 => ['id' => 1, 'title' => 'a title']] | ||
* }}} | ||
* | ||
* @param string $type num for fetching columns as positional keys or assoc for column names as keys | ||
* @return array list of all results from database for this statement | ||
*/ | ||
public function fetchAll($type = 'num') { | ||
if ($type === 'num') { | ||
return $this->_statement->fetchAll(PDO::FETCH_NUM); | ||
} | ||
if ($type === 'assoc') { | ||
return $this->_statement->fetchAll(PDO::FETCH_ASSOC); | ||
} | ||
return $this->_statement->fetchAll($type); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters