ホームページ  >  記事  >  バックエンド開発  >  超軽量の PHP データベース ツールキット

超軽量の PHP データベース ツールキット

WBOY
WBOYオリジナル
2016-07-25 09:09:491916ブラウズ
2 日前に誕生した非常に軽い PHP データベース ツールキット (これは、非常に軽いことを証明するのに十分です) )。
2 つのクラス、1 つは PDO 接続を管理する Connection (複数のデータベースをサポート)、もう 1 つはデータベース操作を迅速に実行するために使用される QuickQuery (PDO と PDOStatement の間を行き来する必要はありません)
ダウンロードする必要はなく、オンラインで視聴できます。
  1. use PersistenceDbAccess;
  2. // フレームワークが初期化される接続情報を追加します
  3. DbAccessConnection::add(
  4. 'default',
  5. 'sqlite',
  6. '/db/mydb.sqlite',
  7. null, null, false
  8. );
  9. // 以下は
  10. $conn = DbAccessConnection::instance('default');
  11. // クエリ
  12. $query = new DbAccessQuickQuery($conn);
  13. $query->prepare( ' select :name as name')->execute(array(':name'=>'tonyseek'));
  14. // オブジェクトは直接反復子として機能し、データ配列を生成します
  15. foreach($query as $i) {
  16. var_dump($i);
  17. }
  18. // 偏執的な場合は、応答を出力する前に手動で切断してください
  19. DbAccessConnection::disconnectAll();
コードをコピー
  1. namespace PersistenceDbAccess;
  2. PDO、ArrayObject、DateTimeを使用;
  3. LogicException、InvalidArgumentExceptionを使用;
  4. /**
  5. * クイッククエリチャンネル
  6. *
  7. * @version 0.3
  8. * @author tonyseek
  9. * @link http://stu.szu.edu.cn
  10. * @license http://www.opensource.org/licenses/mit- License.html
  11. * @copyright 深セン大学 StuCampus 開発チーム
  12. *
  13. */
  14. class QuickQueryはIteratorAggregateを実装します
  15. {
  16. /**
  17. * データベース接続
  18. *
  19. * @var PersistenceDbAccessConnection
  20. */
  21. private $connection = null;
  22. /**
  23. * PDO ステートメント
  24. *
  25. * @var PDOStatement
  26. */
  27. private $stmt = null;
  28. /**
  29. * チェックされたパラメータセット
  30. *
  31. * @var array
  32. */
  33. private $checkedParams = array();
  34. /* *
  35. * クエリチャネルを構築します
  36. *
  37. * @param PersistenceDbAccessConnection $connection データベース接続
  38. */
  39. public function __construct(Connection $connection)
  40. {
  41. $this->connection = $connection;
  42. }
  43. /**
  44. * プリコンパイルされた SQL ステートメント
  45. *
  46. * @param string $sqlCommand SQL ステートメント
  47. * @return PersistenceDbAccessQuickQuery
  48. */
  49. public function prepare($sqlCommand)
  50. {
  51. // 接続から PDO を取得し、SQL ステートメントで prepare を実行して PDO ステートメントを生成します
  52. $this->stmt = $this->connection->getPDO()->prepare($sqlCommand);
  53. // PDO ステートメントのモードを連想配列データに変更します
  54. $this->stmt->setFetchMode(PDO::FETCH_ASSOC);
  55. // メソッド チェーンを返す
  56. return $this;
  57. }
  58. /**
  59. * データクエリを実行します
  60. *
  61. * @throws PDOException
  62. * @return PersistenceDbAccessQuickQuery
  63. */
  64. public functionexecute($params = array())
  65. {
  66. $stmt = $this->getStatement();
  67. // パラメータチェック
  68. $diff = array_diff($this->checkedParams, array_keys( $params) );
  69. if (count($this->checkedParams) && count($diff)) {
  70. throw new InvalidArgumentException('必須パラメータがありません: '.implode(' | ', $diff));
  71. }
  72. // PHP データ型をデータベースのデータ型に対応させる
  73. foreach($params as $key => $value) {
  74. $type = null;
  75. switch(true) {
  76. case is_int($value):
  77. $type = PDO::PARAM_INT;
  78. ブレーク;
  79. case is_bool($value):
  80. $type = PDO::PARAM_BOOL;
  81. ブレーク;
  82. case ($value instanceof DateTime):
  83. $type = PDO::PARAM_STR; = $value->format(DateTime::W3C);
  84. ブレーク;
  85. case is_null($value):
  86. $type = PDO::PARAM_NULL;
  87. ブレーク;
  88. デフォルト:
  89. $type = PDO::PARAM_STR; }
  90. $stmt->bindValue($key, $value, $type);
  91. }
  92. $stmt->execute();
  93. $this->checkedParams = array(); // パラメータのチェックをクリアします。
  94. return $this;
  95. }
  96. /**
  97. * Get Statement オブジェクト
  98. *
  99. * 返されたオブジェクトは、バインドされたパラメーターを使用して再実行することも、データを走査して取得するための反復子として使用することもできます。
  100. *
  101. * @return PDOStatement
  102. */
  103. public function getStatement()
  104. {
  105. if (!$this->stmt) {
  106. throw new LogicException('SQL ステートメントは QuickQuery.prepare である必要があります最初の前処理');
  107. }
  108. return $this->stmt;
  109. }
  110. /**
  111. * getStatement メソッドの代替名
  112. *
  113. * PHP 標準ライブラリに IteratorAggregate インターフェイスを実装し、外部関係者はこのオブジェクトを反復子として直接使用して
  114. * を走査できます。 getStatment との唯一の違いは、このメソッドが LogicException をスローしないことです。
  115. * prepare とexecute が事前に使用されていない場合は、空のイテレータが返されます。
  116. *
  117. * @return Traversable
  118. */
  119. public function getIterator()
  120. {
  121. try {
  122. return $this->getStatement() ;
  123. } catch (LogicException $ex) {
  124. return new ArrayObject();
  125. }
  126. }
  127. /**
  128. * クエリ パラメータの設定 check
  129. *
  130. * ここにインポートされたクエリ パラメータをチェックし、割り当てられていない場合は、LogicException が発生します。クエリ中にスローされます。
  131. *
  132. * @param array $params
  133. * @return PersistenceDbAccessQuickQuery
  134. */
  135. public function setParamsCheck(array $params)
  136. {
  137. $this->checkedParams = $params;
  138. return $this;
  139. }
  140. / **
  141. * 結果セットを配列に変換します
  142. *
  143. * @return array
  144. */
  145. public function toArray()
  146. {
  147. return iterator_to_array($this->getStatement());
  148. }
  149. /**
  150. * 最後に挿入された結果 (またはシーケンス) の ID を取得します
  151. *
  152. * @param string $name
  153. * @return int
  154. */
  155. public function getLastInsertId($name=null) )
  156. {
  157. return $this->connection->getPDO()->lastInsertId($name);
  158. }
  159. }
复制代
  1. namespace PersistenceDbAccess;
  2. use InvalidArgumentException、BadMethodCallException;
  3. use PDO、PDOException;
  4. /**
  5. * 接続ファクトリー、グローバル PDO オブジェクトを提供し、トランザクションを管理します。
  6. *
  7. * @version 0.3
  8. * @author tonyseek
  9. * @link http://stu.szu.edu.cn
  10. * @license http://www.opensource.org/licenses/mit-license.html
  11. * @copyright 深セン大学 StuCampus 開発チーム
  12. *
  13. */
  14. 最終クラス Connection
  15. {
  16. /**
  17. * コネクタ インスタンス コレクション
  18. *
  19. * @var array
  20. */
  21. static private $instances = array();
  22. /**
  23. * データベースドライバー名
  24. *
  25. * @var string
  26. */
  27. private $driver = '';
  28. /**
  29. * データベース接続文字列 (データベース ソース名)
  30. *
  31. * @var string
  32. */
  33. プライベート $dsn = '';
  34. /**
  35. * PDO インスタンス
  36. *
  37. * @var PDO
  38. */
  39. プライベート $pdo = null;
  40. /**
  41. * ユーザー名
  42. *
  43. * @var 文字列
  44. * /
  45. private $username = '';
  46. /**
  47. * パスワード
  48. *
  49. * @var 文字列
  50. */
  51. private $password = '';
  52. /**
  53. * 永続的な接続を有効にするかどうか
  54. *
  55. * @var bool
  56. */
  57. private $isPersisten = false;
  58. /**
  59. * シミュレーションのプリコンパイルを有効にするかどうか
  60. *
  61. * @var bool
  62. */
  63. private $isEmulate = false;
  64. /**
  65. * トランザクション中かどうか
  66. *
  67. * @var bool
  68. */
  69. private $isInTransation = false;
  70. /**
  71. * プライベート コンストラクター、new 演算子を使用した外部インスタンス化を防止します
  72. */
  73. プライベート関数 __construct(){}
  74. /* *
  75. * Production Connector インスタンス (複数のインスタンス)
  76. *
  77. * @param string $name
  78. * @return StuCampusDataModelConnector
  79. */
  80. static public function getInstance($name = 'default')
  81. {
  82. if (!isset(self::$instances[$name])) {
  83. // アクセスされたインスタンスが存在しない場合はスローされますエラーが発生しました
  84. throw new InvalidArgumentException("[{$name}] が存在しません");
  85. }
  86. return self::$instances[$name];
  87. }
  88. /**
  89. * すべてのデータベースインスタンスを切断します
  90. */
  91. static public functiondetachAll()
  92. {
  93. foreach (self::$instances as $instance) {
  94. $instance->disconnect();
  95. }
  96. }
  97. /**
  98. * データベースを追加
  99. *
  100. * コネクタをインスタンス グループに追加
  101. *
  102. * @param string $name 識別名
  103. * @param string $driver ドライバー名
  104. * @param string $dsn 接続文字列
  105. * @param string $usrデータベースのユーザー名
  106. * @param string $pwd データベースのパスワード
  107. * @param bool $emulate シミュレーションのプリコンパイルされたクエリ
  108. * @param bool $persisten 接続を維持するかどうか
  109. */
  110. static public function registry( $ name, $driver, $dsn, $usr, $pwd, $emulate = false, $persisten = false)
  111. {
  112. if (isset(self::$instances[$name])) {
  113. // 追加された場合インスタンス名がすでに存在する場合、例外がスローされます
  114. throw new BadMethodCallException("[{$name}] が登録されました");
  115. }
  116. // 自身をインスタンス化し、配列にプッシュします
  117. self::$instances [$name] = 新しい self();
  118. self::$instances[$name]->dsn = $driver . $dsn;
  119. self::$instances[$name]->username = $usr;
  120. self::$instances[$name]->パスワード = $pwd;
  121. self::$instances[$name]->driver = $driver;
  122. self::$instances[$name]- >isPersisten = (bool)$persisten;
  123. self::$instances[$name]->isEmulate = (bool)$emulate;
  124. }
  125. /**
  126. * PHP データベース オブジェクトを取得します
  127. *
  128. * @return PDO
  129. */
  130. public function getPDO()
  131. {
  132. if ( !$this->pdo) {
  133. // PDO がインスタンス化されているかどうかを確認し、そうでない場合は最初に PDO をインスタンス化します
  134. $this->pdo = new PDO($this->dsn, $this->gt; username, $ this->password);
  135. // エラー モードは PDOException 例外をスローします
  136. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  137. // クエリを有効にするキャッシュ
  138. $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->isEmulate);
  139. // 永続的な接続を有効にする
  140. $this->pdo->setAttribute(PDO::ATTR_PERSISTENT, $ this->isPersisten );
  141. }
  142. return $this->pdo;
  143. }
  144. /**
  145. * データベースドライバー名を取得します
  146. *
  147. * @return string
  148. */
  149. public function getDriverName()
  150. {
  151. return $this->gt;driver;
  152. }
  153. /* *
  154. * 取引を開始します
  155. */
  156. public function translationBegin()
  157. {
  158. $this->isInTransation = $this->getPDO()->beginTransaction();
  159. }
  160. /**
  161. * トランザクションを送信する
  162. */
  163. public function transationCommit()
  164. {
  165. if ($this->isInTransation) {
  166. $this->getPDO()->commit();
  167. } else {
  168. trigger_error('transationBegin は次のようになります) transationCommit') ;
  169. }
  170. }
  171. /**
  172. * トランザクションのロールバック
  173. * @return bool
  174. */
  175. public function translationRollback()
  176. {
  177. if ($this->isInTransation) {
  178. $this->getPDO()-> ;rollBack();
  179. } else {
  180. trigger_error('transationRollbackの前にtransationBeginを呼び出す必要があります');
  181. }
  182. }
  183. /**
  184. * 接続がトランザクション内にあるかどうか
  185. *
  186. * @return bool
  187. */
  188. public function isInTransation()
  189. {
  190. return $this->isInTransation;
  191. }
  192. /**
  193. * トランザクション内でコールバック関数を実行します
  194. *
  195. * @param function $callback匿名関数またはクロージャ関数
  196. * @param bool $autoRollback 例外発生時に自動的にロールバックするかどうか
  197. * @throws PDOException
  198. * @return bool
  199. */
  200. public function transationExecute($callback, $autoRollback = true)
  201. {
  202. try {
  203. // トランザクションを開始
  204. $this->transationBegin();
  205. // コールバック関数を呼び出す
  206. if (is_callable($callback)) {
  207. $callback();
  208. } else {
  209. throw new InvalidArgumentException('$callback はコールバック関数である必要があります');
  210. }
  211. // トランザクションをコミットします
  212. return $this->transationCommit();
  213. } catch(PDOException $pex) {
  214. // 自動ロールバックが有効な場合, 次に、PDO 例外をキャッチするときに、最初にロールバックしてからスローします
  215. if ($autoRollback) {
  216. $this->transationRollback();
  217. }
  218. throw $pex;
  219. }
  220. }
  221. /**
  222. * データベースから安全に切断します
  223. */
  224. public functiondetach()
  225. {
  226. if ($this->pdo) {
  227. // PDO がインスタンス化されているかどうかを確認し、インスタンス化されている場合は null に設定します
  228. $this->pdo = null;
  229. }
  230. }
  231. /**
  232. * ブロッククローン
  233. */
  234. public function __clone()
  235. {
  236. trigger_error('ブロックされた__cloneメソッド、コネクタはシングルトンクラス');
  237. }
  238. }
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。