一個很輕的 PHP 資料庫工具包,誕生時間兩天(足以證明很輕了
)。
兩個類,一個 Connection 管理 PDO 連線(支援多資料庫),一個 QuickQuery 用來快速執行資料庫操作(不用在 PDO 和 PDOStatement 之間來回折騰)
不用下載,線上就能看完。
- use PersistenceDbAccess;
-
- // 在框架初始化的地方加入連線資訊
- DbAccessConnection::add(
- 'default',
- ' sqlite',
- '/db/mydb.sqlite',
- null, null, false
- );
-
- // 下面是使用
- $conn = DbAccessConnection::instance( 'default');
-
- // 查詢
- $query = new DbAccessQuickQuery($conn);
- $query->prepare('select :name as name')->execute(array( ':name'=>'tonyseek'));
-
- // 物件直接作為迭代器產生資料數組
- foreach($query as $i) {
- var_dump($i);
- }
-
- // 如果有偏執的話,輸出回應之前手動斷開連接
- DbAccessConnection::disconnectAll();
複製程式碼
複製程式碼複製程式碼複製程式碼
-
namespace PersistenceDbAccess;
- use PDO, ArrayObject, DateTime;
- use LogicException, InvalidArgumentException;
- use LogicException, InvalidArgumentException; >*/
- class QuickQuery implements IteratorAggregate
- {
- /**
- * 快速查詢頻道
- *
- * @version 0.3
- * @author tonyseek
- * @link http://stu.szu.edu.cn
- * @license http: //www.opensource.org/licenses/mit-license.html
- * @copyright StuCampus Development Team, Shenzhen University
- *
- */
- private $connection = null;
-
- /
- * 資料庫連線
- *
- * @var PersistenceDbAccessConnection
- > private $stmt = null;
-
- /**
- * PDO 語句
- *
- * @var PDOStatement
- */
- private $checkedParams = array();
-
-
- /**
- * 被檢查參數集
- *
- * @var array
- *
- * 建構查詢通道
- *
- * @param PersistenceDbAccessConnection $connection 資料庫連線
- *
- public function __construct(Connection $connection)
- {
- $this->connection = $connection;
- }
-
- /**
- * 預先編譯 SQL 語句
- *
- * @param string $sqlCommand SQL語句
- * @return PersistenceDbAccessQuickQuery
- */
- publicunc. ($sqlCommand)
- {
- // 從連線取得PDO, 並對SQL 語句執行prepare, 產生PDO Statement
- $this->stmt = $this->connection->getPDO()->prepare ($sqlCommand);
- // 修改PDO Statement 模式為關聯數組資料
- $this->stmt->setFetchMode(PDO::FETCH_ASSOC);
- // 傳回方法鏈
- return $this ;
- }
-
- /**
- * 執行資料查詢
- *
- * @throws PDOException
- * @return PersistenceDbAccessQuickQuery
- */
- public function execute($params = array())
- {
- $stmt = $this->getStatement() ;
-
- // 參數檢查
- $diff = array_diff($this->checkedParams, array_keys($params));
- if (count($this->checkedParams) && count($diff )) {
- throw new InvalidArgumentException('缺少必備參數:'.implode(' | ', $diff));
- }
-
- // 將PHP 資料型別對應到資料庫資料型態
- foreach($params as $key => $value) {
- $type = null;
- switch(true) {
- case is_int($value):
- $type = PDO: :PARAM_INT;
- break;
- case is_bool($value):
- $type = PDO::PARAM_BOOL;
- break;
- case ($value instanceof DateTime): $value = $value->format(DateTime::W3C);
- break;
- case is_null($value):
- $type = PDO::PARAM_NULL;
- break;
- default:
- $type = PDO::PARAM_STR;
- }
-
- $stmt->bindValue($key, $value, $type);
- $stmt->bindValue($key, $value, $type);
- }
-
- $stmt->execute();
- $this->checkedParams = array(); // 清空參數檢定
- return $this;
- }
-
- /**
- * 取得 Statement 物件
- *
- * 傳回物件可以被綁定參數重新執行, 也可以被當作迭代器遍歷取得資料。
- *
- * @return PDOStatement
- */
- public function getStatement()
- {
- if (!$this->stmt) {
- throw new LogicException('''pSQL處理');
- }
-
- return $this->stmt;
- }
-
- /**
- * getStatement 方法的替代名稱
- *
- * 實作 PHP 標準函式庫 中的 IteratorAggregate 介面, 外部可以直接將本物件作為迭代器遍
- * 歷。和 getStatment 唯一不同之處, 是本方法不會拋出 LogicException 例外。如果
- * 沒有事先使用 prepare 和 execute, 會回傳一個空迭代器。
- *
- * @return Traversable
- */
- public function getIterator()*/
- public function getIterator() {
- try {
- return $this->getStatement();
- } catch (LogicException $ex) {
- return new ArrayObject();
- }
- }
-
- /**
- * 設定查詢參數檢查
- *
- * 透過此處匯入的被檢查查詢參數, 如果沒有得到賦值, 則查詢時會拋出LogicException 例外。
- *
- * @param array $params
- * @return PersistenceDbAccessQuickQuery
- */
- public function setParamsCheck(array $params)
- return $this;
- }
-
- /**
- * 將結果集轉換為陣列
- *
- * @return array
- */
- public function toArray()
- {
- return iterator_this_array($ ->getStatement());
- }
-
- /**
- * 取得最後一個插入結果(或序列)的 ID
- *
- * @param string $name
- * @return int
- */
- public function getLastInsertId($name=null)
- {
- return $this->connection $this->connection ->getPDO()->lastInsertId($name);
- }
- }
複製程式碼
-
namespace PersistenceDbAccess;
- use InvalidArgumentException, BadMethodCallException;
- >**Exception; *
- * @version 0.3
- * @author tonyseek
- * @link http://stu.szu.edu.cn
- * @license http://www.opensource.org /licenses/mit-license.html
- * @copyright 深圳大學StuCampus 開發團隊
- *
- */
- 期末班連接
- {
- /**
- * Connector 實例集合
- *
- * @var array
- */
- static private $instances = array();
-
- /**
- * 資料庫驅動名稱
- *
- * @var string
- */
- private $driver = '';
-
- /**
- * 資料庫連接字串(Database Source Name)
- *
- * @var string
- */
- * PDO 實例
- *
- * @var PDO
- * 🎜> private $dsn = '';
-
- /**
- * 使用者名稱
- *
- * @var string
- */
- private $pdo = null;
-
- /**
- * 密碼
- *
- * @var string
- */
- 私人$使用者名稱= '';
-
- /**
- * 是否開啟持久連線
- *
- * @var bool
- */
- 私人$密碼= '';
-
- /**
- * 是否開啟模擬預編譯
- *
- * @var bool
- */
- 私人$ isPersisten = false;
-
- /**
- * 是否在交易中
- *
- * @var bool
- */
- private $isEmulate = false;
-
- /**
- * 私有建構函數,阻止外部使用 new 運算子實例化
- */
- private $isalation
-
- /**
- * 生產 Connector 實例(多例)
- *
- * @param string $name
- * @return StuCampusDataModelConnector
- */
- private function __construct(){}
-
- /**
- * 中斷所有資料庫實例的連線
- */
- static public function getgetstance($name = ' default')
- {
- if (!isset(self::$instances[$name])) {
- // 存取的實例不存在則發送錯誤異常
- throw new InvalidArgumentException( 如果" [{$name}] 不存在");
- }
-
- return self::$instances[$name];
- }
-
- /**
- * 新增資料庫
- *
- * 在實例群組中加入Connector
- *
- * @param string $name 識別名稱
- * @param string $driver 驅動名
- * @ param string $dsn 連接字串
- * @param string $usr 資料庫使用者名稱
- * @param string $pwd 資料庫密碼
- * @param bool $emulate 模擬預編譯查詢
- * @param bool $persisten 是否持久連接
- * /
- static public functiondetachAll()
- {
- foreach (self::$instances as $instance) {
- $instance->disconnect();
- }
- }
- }
- 🎜> /**
- * 取得 PHP Database Object
- *
- * @return PDO
- */
- 靜態公用函數登錄($name, $driver, $dsn, $usr, $pwd, $emulate = false, $persisten = false)
- {
- {
- if (isset(self::$instances[$name])) {
- // 如果新增的實例名已經存在則發送例外狀況
- throw new BadMethodCallException("[{$name}] 已註冊" );
- }
-
- // 實例化自身,並推入倉庫中
- self::$instances[$name] = new self();
- self:: $instances[ $name]->dsn = $driver 。 ':'。 $dsn;
- self::$instances[$name]->使用者名稱= $usr;
- self::$instances[$name]->password = $pwd;
- self::$ instances [$name]->driver = $driver;
- self::$instances[$name]->isPersisten = (bool)$persisten;
- self::$instances[$name]-> ;isEmulate = (bool)$emulate;
- }
-
- /**
- * 取得資料庫驅動名稱
- *
- * @return string
- */
- public function getPDO()
- {
- if (!$this-> pdo) {
- // 檢查PDO 是否已經實例化,否則先實例化PDO
- $this->pdo = new PDO($this->dsn, $this->username, $this- >password);
- // 錯誤模式為傳送PDOException 例外
- $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- // 開啟查詢佇列
- $this->pdo->setAttribute->setAttribute->setAttribute->setAttribute->setAttribute->setAttrib 。 > }
-
- return $this->pdo;
- }
-
- /**
- * 開始事務
- * /
- public function getDriverName()
- {
- return $ this->driver;
- }
-
- /**
- * 提交交易
- */
- public function transationBegin()
- {
- $this->isInTransation = $this->getPDO( )->beginTransaction();
- }
-
- /**
- * 回滾事務
- * @return bool
- */
- public function transationCommit()
- {
- if ($this->isInTransation) {
- $this->getPDO()->commit();
- } else {
- trigger_error ('transationBegin 應該先於transationCommit 呼叫');
- }
- }
-
-
- /***/
- public function transationRollback()
- {
- if ( $this->isInTransation) {
- $this->getPDO()->rollBack();
- } else {
- trigger_error('transationBegin 應該先於transationRollback 呼叫');
- }
- }
-
- /**
- * 連線是否在交易中
- *
- * @return bool
- */
- public function isInTransation()
- {
- return $this->isInTransation;
- }
-
- /
- * 在交易中執行回呼函數
- *
- * @param function $callback 匿名函數或閉包函數
- * @param bool $autoRollback 異常發生時是否自動回滾
- * @param bool $autoRollback 異常發生時是否自動回滾
- * @ throws PDOException
- * @return bool
- */
- public function transationExecute($callback, $autoRollback = true)
- {
- try {
- // 開始交易
- $this->transationBegin();
- // 開始交易
- $this->transationBegin();
- / 呼叫回呼函數
- if (is_callable($callback)) {
- $callback();
- } else {
- throw new InvalidArgumentException('$callback應該為回呼函數}
- // 提交事務
- return $this->transationCommit();
- } catch(PDOException $pex) {
- // 如果開啟了自動回滾, 則捕捉到PDO 異常時先回滾再拋出
- if ($autoRollback) {
- $this->transationRollback();
- }
- throw $pex;
- }
- }
-
-
- /**
- * 安全地斷開資料庫連線
- */
- public function disconnect()
- {
- if ($this->pdo) {
- // 檢查PDO 是否已經實例化,是則設為null
- $this->pdo = null;
- }
- }
-
- /**
- * 阻止複製
- */
- public function __clone()
- {
trigger_error('被封鎖的__clone 方法, Connector 是單例類別'); } }
| 複製程式碼