项目作者: aportela

项目描述 :
Custom php (pdo) database wrapper
高级语言: PHP
项目地址: git://github.com/aportela/db-wrapper.git
创建时间: 2020-02-15T18:16:11Z
项目社区:https://github.com/aportela/db-wrapper

开源协议:GNU General Public License v3.0

下载


db-wrapper

Custom php PDO database wrapper

Requirements

  • mininum php version 8.x

Limitations

At this time only SQLite, MariaDB/MySQL, PostgreSQL adapters are supported.

install

  1. composer require "aportela/db-wrapper"

install / initializate database example

  1. <?php
  2. require ("vendor/autoload.php");
  3. $settings = array
  4. (
  5. "database" => array
  6. (
  7. "filename" => "test.db",
  8. "path" => __DIR__ . DIRECTORY_SEPARATOR . "data" . DIRECTORY_SEPARATOR
  9. ),
  10. /* uncoment next setting & comment NullLogger constructor if you want file logs with (my) custom rotating handler*/
  11. /*
  12. "logger" => array
  13. (
  14. "name" => "test",
  15. "filename" => "test-DEBUG.log",
  16. "path" => __DIR__ . DIRECTORY_SEPARATOR . "data" . DIRECTORY_SEPARATOR . "logs" . DIRECTORY_SEPARATOR,
  17. "level" => \Monolog\Logger::DEBUG
  18. )
  19. */
  20. );
  21. // create database directory if not found
  22. if (! file_exists($settings["database"]["path"]))
  23. {
  24. mkdir($settings["database"]["path"]);
  25. }
  26. /*
  27. // uncoment this & comment NullLogger constructor if you want file logs with (my) custom rotating handler
  28. // create log directory if not found
  29. if (! file_exists($settings["logger"]["path"]))
  30. {
  31. mkdir($settings["logger"]["path"]);
  32. }
  33. // logger (monolog) definition
  34. $logger = new \Monolog\Logger($settings["logger"]["name"]);
  35. $logger->pushProcessor(new \Monolog\Processor\UidProcessor());
  36. $handler = new \Monolog\Handler\RotatingFileHandler($settings["logger"]["path"] . $settings["logger"]["filename"], 0, $settings["logger"]["level"]);
  37. $handler->setFilenameFormat('{date}/{filename}', \Monolog\Handler\RotatingFileHandler::FILE_PER_DAY);
  38. $logger->pushHandler($handler);
  39. */
  40. // null logger (monolog) definition
  41. $logger = new \Psr\Log\NullLogger("");
  42. // we are using PDO sqlite adapter (only available at this time)
  43. $adapter = new \aportela\DatabaseWrapper\Adapter\PDOSQLiteAdapter($settings["database"]["path"] . $settings["database"]["filename"]);
  44. // main object
  45. $db = new \aportela\DatabaseWrapper\DB
  46. (
  47. $adapter,
  48. $logger
  49. );
  50. $success = true;
  51. // check if the database is already installed (install scheme with version table already exists)
  52. if (! $db->isSchemaInstalled())
  53. {
  54. if ($db->installSchema())
  55. {
  56. echo "Database install success" . PHP_EOL;
  57. } else
  58. {
  59. echo sprintf("Database install error, check logs (at %s)%s", $settings["logger"]["path"], PHP_EOL);
  60. $success = false;
  61. }
  62. } else
  63. {
  64. echo "Database already installed" . PHP_EOL;
  65. }
  66. if ($success)
  67. {
  68. $results = $db->query(" SELECT release_number, release_date FROM VERSION; ");
  69. if (is_array($results) && count($results) == 1)
  70. {
  71. echo sprintf("Current version: %s (installed on: %s)%s", $results[0]->release_number, $results[0]->release_date, PHP_EOL);
  72. }
  73. else
  74. {
  75. echo "SQL error" . PHP_EOL;
  76. }
  77. }
  78. ?>

upgrade schema & exec some queries

  1. <?php
  2. require ("vendor/autoload.php");
  3. $settings = array
  4. (
  5. "database" => array
  6. (
  7. "filename" => "test.db",
  8. "path" => __DIR__ . DIRECTORY_SEPARATOR . "data" . DIRECTORY_SEPARATOR,
  9. "upgradeSchemaPath" => __DIR__ . DIRECTORY_SEPARATOR . "upgrade.sql"
  10. ),
  11. /* uncoment next setting & comment NullLogger constructor if you want file logs with (my) custom rotating handler*/
  12. /*
  13. "logger" => array
  14. (
  15. "name" => "test",
  16. "filename" => "test-DEBUG.log",
  17. "path" => __DIR__ . DIRECTORY_SEPARATOR . "data" . DIRECTORY_SEPARATOR . "logs" . DIRECTORY_SEPARATOR,
  18. "level" => \Monolog\Logger::DEBUG
  19. )
  20. */
  21. );
  22. // create database directory if not found
  23. if (! file_exists($settings["database"]["path"]))
  24. {
  25. mkdir($settings["database"]["path"]);
  26. }
  27. if (! file_exists($settings["database"]["upgradeSchemaPath"]))
  28. {
  29. die(sprintf("Upgrade schema not found (at %s)%s", $settings["database"]["upgradeSchemaPath"], PHP_EOL));
  30. }
  31. /*
  32. // uncoment this & comment NullLogger constructor if you want file logs with (my) custom rotating handler
  33. // create log directory if not found
  34. if (! file_exists($settings["logger"]["path"]))
  35. {
  36. mkdir($settings["logger"]["path"]);
  37. }
  38. // logger (monolog) definition
  39. $logger = new \Monolog\Logger($settings["logger"]["name"]);
  40. $logger->pushProcessor(new \Monolog\Processor\UidProcessor());
  41. $handler = new \Monolog\Handler\RotatingFileHandler($settings["logger"]["path"] . $settings["logger"]["filename"], 0, $settings["logger"]["level"]);
  42. $handler->setFilenameFormat('{date}/{filename}', \Monolog\Handler\RotatingFileHandler::FILE_PER_DAY);
  43. $logger->pushHandler($handler);
  44. */
  45. // null logger (monolog) definition
  46. $logger = new \Psr\Log\NullLogger("");
  47. // we are using PDO sqlite adapter (only available at this time), also set the upgrade scheme (point to a local file)
  48. $adapter = new \aportela\DatabaseWrapper\Adapter\PDOSQLiteAdapter(
  49. $settings["database"]["path"] . $settings["database"]["filename"],
  50. // READ upgrade SQL schema file definition on next block of this README.md
  51. $settings["database"]["upgradeSchemaPath"]
  52. );
  53. // main object
  54. $db = new \aportela\DatabaseWrapper\DB
  55. (
  56. $adapter,
  57. $logger
  58. );
  59. // try to upgrade SQL schema to last version (making a backup before any modification, change parameter to false to skip creating the backup, NOT RECOMMENDED)
  60. $currentVersion = $db->upgradeSchema(true);
  61. if ($currentVersion !== -1)
  62. {
  63. echo sprintf("Database upgrade success, current version: %s%s", $currentVersion, PHP_EOL);
  64. $db->query(" CREATE TABLE IF NOT EXISTS MYTABLE (id INTEGER PRIMARY KEY, name VARCHAR(32)); ");
  65. $db->query(" INSERT INTO MYTABLE (name) VALUES (:name); ",
  66. array
  67. (
  68. new \aportela\DatabaseWrapper\Param\StringParam(":name", "foobar-" .uniqid())
  69. )
  70. );
  71. $results = $db->query(" SELECT id, name FROM MYTABLE ORDER BY id DESC LIMIT 1 ");
  72. if (is_array($results) && count($results) == 1)
  73. {
  74. echo sprintf("Last row was id: %s - name: %s%s", $results[0]->id, $results[0]->name, PHP_EOL);
  75. }
  76. else
  77. {
  78. echo sprintf("SQL error, check logs (at %s)%s", $settings["logger"]["path"], PHP_EOL);
  79. }
  80. }
  81. else
  82. {
  83. echo sprintf("Database upgrade error, check logs (at %s)%s", $settings["logger"]["path"], PHP_EOL);
  84. }
  85. ?>

upgrade SQL schema file definition example

defined on $settings block of previous example

  1. "upgradeSchemaPath" => __DIR__ . DIRECTORY_SEPARATOR . "upgrade.sql"
  1. <?php
  2. return
  3. (
  4. array
  5. (
  6. 1 => array
  7. (
  8. " CREATE TABLE IF NOT EXISTS TABLEV1 (id INTEGER PRIMARY KEY); ",
  9. " INSERT INTO TABLEV1 VALUES (1); "
  10. ),
  11. 2 => array
  12. (
  13. " CREATE TABLE IF NOT EXISTS TABLEV2 (id INTEGER PRIMARY KEY); ",
  14. )
  15. )
  16. );
  17. ?>

PHP Composer