{"id":19090149,"url":"https://github.com/aportela/db-browser-wrapper","last_synced_at":"2026-05-07T20:43:53.299Z","repository":{"id":190362482,"uuid":"682461626","full_name":"aportela/db-browser-wrapper","owner":"aportela","description":" Custom php (pdo) database element browsing wrapper ","archived":false,"fork":false,"pushed_at":"2024-01-03T08:30:43.000Z","size":39,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-02T22:18:39.017Z","etag":null,"topics":["composer-package","database","pdo","php","php8","sqlite3"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aportela.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-24T08:12:06.000Z","updated_at":"2023-08-24T09:35:31.000Z","dependencies_parsed_at":"2024-11-09T03:02:31.489Z","dependency_job_id":"8aa09406-8899-4e3e-8cbf-8e36d8afb1f1","html_url":"https://github.com/aportela/db-browser-wrapper","commit_stats":null,"previous_names":["aportela/db-browser-wrapper"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aportela%2Fdb-browser-wrapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aportela%2Fdb-browser-wrapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aportela%2Fdb-browser-wrapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aportela%2Fdb-browser-wrapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aportela","download_url":"https://codeload.github.com/aportela/db-browser-wrapper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240136997,"owners_count":19753650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer-package","database","pdo","php","php8","sqlite3"],"created_at":"2024-11-09T03:02:16.785Z","updated_at":"2026-05-07T20:43:53.292Z","avatar_url":"https://github.com/aportela.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# db-browser-wrapper\n\nCustom php (pdo) database element browsing wrapper\n\n## Requirements\n\n- mininum php version 8.4\n\n## Limitations\n\nAt this time only SQLite | MariaDB | PostgreSQL are supported.\n\n# install\n\n```Shell\ncomposer require \"aportela/db-browser-wrapper\"\n```\n\n# example\n\n```php\n\u003c?php\n    require (\"vendor/autoload.php\");\n\n    // this will create a temporal sqlite database with an example schema, you DO NOT NEED THIS WITH A REAL DATABASE WITH DATA\n    $databasePath = tempnam(sys_get_temp_dir(), 'sqlite');\n    $upgradeSchema = \"\n        \u003c?php\n            return\n            (\n                array\n                (\n                    1 =\u003e array\n                    (\n                        \\\" CREATE TABLE IF NOT EXISTS TABLEV1 (id INTEGER PRIMARY KEY, name VARCHAR(128), age INTEGER); \\\",\n                        \\\" INSERT INTO TABLEV1 VALUES (1, 'FOO', 8); \\\",\n                        \\\" INSERT INTO TABLEV1 VALUES (2, 'BAR', 16); \\\",\n                        \\\" INSERT INTO TABLEV1 VALUES (3, 'JOHN', 24); \\\",\n                        \\\" INSERT INTO TABLEV1 VALUES (4, 'DOE', 32); \\\"\n                    )\n                )\n            );\n    \";\n    $upgradeSchemaPath = tempnam(sys_get_temp_dir(), 'sql');\n    file_put_contents($upgradeSchemaPath, trim($upgradeSchema));\n    // open database (SQLiTE)\n    $dbh = new \\aportela\\DatabaseWrapper\\DB(\n        // change PDOSQLiteAdapter with (PDOMariaDBAdapter || PDOPostgreSQLAdapter) for connecting to (MariaDB || PostgreSQL) server\n        new \\aportela\\DatabaseWrapper\\Adapter\\PDOSQLiteAdapter(\n            $databasePath,\n            [\n                    // Turn off persistent connections\n                    \\PDO::ATTR_PERSISTENT =\u003e false,\n                    // Enable exceptions\n                    \\PDO::ATTR_ERRMODE =\u003e \\PDO::ERRMODE_EXCEPTION,\n                    // Emulate prepared statements\n                    \\PDO::ATTR_EMULATE_PREPARES =\u003e true,\n                    // Set default fetch mode to array\n                    \\PDO::ATTR_DEFAULT_FETCH_MODE =\u003e \\PDO::FETCH_ASSOC,\n            ],\n            \\aportela\\DatabaseWrapper\\Adapter\\PDOSQLiteAdapter::FLAGS_PRAGMA_JOURNAL_WAL,\n            $upgradeSchemaPath,\n        ),\n        new \\Psr\\Log\\NullLogger()\n    );\n\n    // query field definitions (name/alias =\u003e real field on sql query)\n    // (the fields returned for each row)\n    $fieldDefinitions = [\n        \"id\" =\u003e \"TABLEV1.id\",\n        \"name\" =\u003e \"TABLEV1.name\",\n        \"age\" =\u003e \"TABLEV1.age\"\n    ];\n    // count query field definition (name/alias =\u003e real field on sql query)\n    // (unique field returned on first row of count query)\n    $fieldCountDefinition = [\n        \"totalResults\" =\u003e \"COUNT(TABLEV1.id)\"\n    ];\n    // set current page = 1 with 2 results / page\n    $pager = new \\aportela\\DatabaseBrowserWrapper\\Pager(true, 1, 2);\n    // sort configuration\n    $sort = new \\aportela\\DatabaseBrowserWrapper\\Sort(\n        [\n            // sort by age DESC\n            new \\aportela\\DatabaseBrowserWrapper\\SortItem(\"age\", \\aportela\\DatabaseBrowserWrapper\\Order::DESC, false),\n            // sort (secondary) by name ASCENDING (case insensitive)\n            new \\aportela\\DatabaseBrowserWrapper\\SortItem(\"name\", \\aportela\\DatabaseBrowserWrapper\\Order::ASC, true)\n        ]\n    );\n    $filter = new \\aportela\\DatabaseBrowserWrapper\\Filter();\n    // with this handler (OPTIONAL) we can modify each result item after getting the results\n    // in this example we convert the age field to integer but anything can be done\n    $afterBrowse = function (\\aportela\\DatabaseBrowserWrapper\\BrowserResults $data) {\n        array_map(\n            function (object $item)  {\n                if (property_exists($item, \"age\") \u0026\u0026 is_numeric($item-\u003eage)) {\n                    $item-\u003eage = intval($item-\u003eage);\n                }\n                return ($item);\n            },\n            $data-\u003eitems\n        );\n    };\n    $browser = new \\aportela\\DatabaseBrowserWrapper\\Browser(self::$db, $this-\u003efieldDefinitions, $this-\u003efieldCountDefinition, $pager, $sort, $filter, $afterBrowse);\n    // this is the main query for getting results data\n    // first %s will be replaced with query fields block\n    // second %s will be replaced with sort block\n    // third %s will be replaced with pagination block\n    $query = $browser-\u003ebuildQuery(\n        \"\n            SELECT %s FROM TABLEV1\n            %s\n            %s\n        \"\n    );\n    $queryCount = $browser-\u003ebuildQueryCount(\n        \"\n            SELECT %s FROM TABLEV1\n        \"\n    );\n    // on data-\u003eitems array we get \"4|DOE|32\" and \"3|JOHN|24\" items (the 2 first of page 1, ordering by age desc, name asc)\n    $data = $browser-\u003elaunch($query, $queryCount);\n    // another query with params\n    // set param :age with value 25\n    $browser-\u003eaddDBQueryParam(new \\aportela\\DatabaseWrapper\\Param\\IntegerParam(\":age\", 25));\n    // build custom query with previous WHERE param\n    $query = $browser-\u003ebuildQuery(\n        \"\n            SELECT %s FROM TABLEV1\n            WHERE TABLEV1.age \u003e :age\n            %s\n            %s\n        \"\n    );\n    $queryCount = $browser-\u003ebuildQueryCount(\n        \"\n            SELECT %s FROM TABLEV1\n            WHERE TABLEV1.age \u003e :age\n        \"\n    );\n    // on data-\u003eitems array we get \"4|DOE|32\" (the only one with age \u003e 25)\n    $data = $browser-\u003elaunch($query, $queryCount);\n```\n\n![PHP Composer](https://github.com/aportela/db-browser-wrapper/actions/workflows/php.yml/badge.svg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faportela%2Fdb-browser-wrapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faportela%2Fdb-browser-wrapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faportela%2Fdb-browser-wrapper/lists"}