{"repo":"mevdschee/php-crud-api","free":true,"listed":false,"github":"https://github.com/mevdschee/php-crud-api","clone":"git clone https://github.com/mevdschee/php-crud-api.git","description":"Single file PHP script that adds a REST API to a SQL database","language":"PHP","stars":3738,"topics":["api-server","automatic-api","crud","database","geojson","geospatial","multi-database","mysql","openapi","php","php-api","postgis","postgresql","rest-api","restful","sql-database","sqlite","sqlserver","swagger"],"license":"MIT","category":"api_server","readme_excerpt":"# PHP-CRUD-API\n\nSingle file PHP script that adds a REST API to a MySQL/MariaDB, PostgreSQL, SQL\nServer or SQLite database.\n\nHowto: Upload \"`api.php`\" to your webserver, configure it to connect to your\ndatabase, have an instant full-featured REST API.\n\nNB: This is the [TreeQL](https://treeql.org) reference implementation in PHP.\n\n## Requirements\n\n- PHP 7.2 or higher with PDO drivers enabled for one of these database systems:\n  - MySQL 5.7 / MariaDB 10.0 or higher for spatial features in MySQL\n  - PostgreSQL 9.5 or higher with PostGIS 2.2 or higher for spatial features\n  - SQL Server 2017 or higher (2019 also has Linux support)\n  - SQLite 3.22 or higher (spatial features NOT supported)\n\n## Installation\n\nDownload the \"`api.php`\" file from the latest release:\n\nhttps://github.com/mevdschee/php-crud-api/releases/latest or direct from:\\\nhttps://raw.githubusercontent.com/mevdschee/php-crud-api/main/api.php\n\nThis is a single file application! Upload \"`api.php`\" somewhere and enjoy!\n\nFor local development you may run PHP's built-in web server:\n\n    php -S localhost:8080\n\nTest the script by opening the following URL:\n\n    http://localhost:8080/api.php/records/posts/1\n\nDon't forget to modify the configuration at the bottom of the file.\n\nAlternatively you can integrate this project into the web framework of your\nchoice, see:\n\n- [Automatic REST API for Laravel](https://tqdev.com/2019-automatic-rest-api-laravel)\n- [Automatic REST API for Symfony 4](https://tqdev.com/2019-automatic-rest-api-symfony)\n- [Automatic REST API for SlimPHP 4](https://tqdev.com/2019-automatic-api-slimphp-4)\n\nIn these integrations [Composer](https://getcomposer.org/) is used to load this\nproject as a dependency.\n\nFor people that don't use composer, the file \"`api.include.php`\" is provided.\nThis file contains everything from \"`api.php`\" except the configuration from\n\"`src/index.php`\" and can be used by PHP's \"include\" function.\n\n## Configuration\n\nEdit the following lines in the bottom of the file \"`api.php`\":\n\n    $config = new Config([\n        'username' => 'xxx',\n        'password' => 'xxx',\n        'database' => 'xxx',\n    ]);\n\nThese are all the configuration options and their default value between\nbrackets:\n\n- \"driver\": `mysql`, `pgsql`, `sqlsrv` or `sqlite` (`mysql`)\n- \"address\": Hostname (or filename) of the database server (`localhost`)\n- \"port\": TCP port of the database server (defaults to driver default)\n- \"username\": Username of the user connecting to the database (no default)\n- \"password\": Password of the user connecting to the database (no default)\n- \"database\": Database the connecting is made to (no default)\n- \"command\": Extra SQL to initialize the database connection (none)\n- \"tables\": Comma separated list of tables to publish (defaults to 'all')\n- \"mapping\": Comma separated list of table/column mappings (no mappping)\n- \"geometrySrid\": SRID assumed when converting from WKT to geometry (`4326`)\n- \"middlewares\": List of middlewares to load (`cors`)\n- \"controllers\": List of controllers to load (`records,geojson,openapi,status`)\n- \"customControllers\": List of user custom controllers to load (no default)\n- \"openApiBase\": OpenAPI info\n  (`{\"info\":{\"title\":\"PHP-CRUD-API\",\"version\":\"1.0.0\"}}`)\n- \"cacheType\": `TempFile`, `Redis`, `Memcache`, `Memcached` or `NoCache`\n  (`TempFile`)\n- \"cachePath\": Path/address of the cache (defaults to system's temp directory)\n- \"cacheTime\": Number of seconds the cache is valid (`10`)\n- \"jsonOptions\": Options used for encoding JSON (`JSON_UNESCAPED_UNICODE`)\n- \"debug\": Show errors in the \"X-Exception\" headers (`false`)\n- \"basePath\": URI base path of the API (determined using PATH_INFO by default)\n\nAll configuration options are also available as environment variables. Write the\nconfig option with capitals, a \"PHP_CRUD_API_\" prefix and underscores for word\nbreakes, so for instance:\n\n- PHP_CRUD_API_DRIVER=mysql\n- PHP_CRUD_API_ADDRESS=localhost\n- PHP_CRUD_API_PORT=3306\n- PHP_CRUD_API_DATABASE=php-crud-api\n- PHP_CRUD_API_USERNAME=php-crud-api\n- PHP_CRUD_API_PASSWORD=php-crud-api\n- PHP_CRUD_API_DEBUG=1\n\nThe environment variables take precedence over the PHP configuration.\n\n## Limitations\n\nThese limitation and constrains apply:\n\n- Primary keys should either be auto-increment (from 1 to 2^53) or UUID\n- Composite primary and composite foreign keys are not supported\n- Complex writes (transactions) are not supported\n- Complex queries calling functions (like \"concat\" or \"sum\") are not supported\n- Database must support and define foreign key constraints\n- SQLite cannot have bigint typed auto incrementing primary keys\n- SQLite does not support altering table columns (structure)\n\n## Features\n\nThe following features are supported:\n\n- Composer install or single PHP file, easy to deploy.\n- Very little code, easy to adapt and maintain\n- Supports POST variables as input (x-www-form-urlencoded)\n- Supports a JSON object as input\n- Supports a JSON array as input (batch insert)\n- Sanitize and validate input using type rules and callbacks\n- Permission system for databases, tables, columns and records\n- Multi-tenant single and multi database layouts are supported\n- Multi-domain CORS support for cross-domain requests\n- Support for reading joined results from multiple tables\n- Search support on multiple criteria\n- Pagination, sorting, top N list and column selection\n- Relation detection with nested results (belongsTo, hasMany and HABTM)\n- Atomic increment support via PATCH (for counters)\n- Binary fields supported with base64 encoding\n- Spatial/GIS fields and filters supported with WKT and GeoJSON\n- Mapping table and column names to support legacy systems\n- Generate API documentation using OpenAPI tools\n- Authentication via API key, JWT token or username/password\n- Database connection parameters may depend on authentication\n- Support for reading database structure in JSON\n- Support for modifying database structure using REST endpoint\n- Security enhancing middleware is included\n- Standard compliant: PSR-4, PSR-7, PSR-12, PSR-15 and PSR-17\n\n## Related projects and ports\n\nRelated projects:\n\n- [PHP-CRUD-API Quick Start](https://github.com/nik2208/php-crud-api-quick-start):\n  A customizable, ready to go, docker compose file featuring PHP-CRUD-API.\n- [PHP-CRUD-API filter generator](https://thipages.github.io/jca-filter/#): A\n  JavaScript library creating PHP-CRUD-API filters from expressions.\n- [JS-CRUD-API](https://github.com/thipages/js-crud-api): A JavaScript client\n  library for the API of PHP-CRUD-API\n- [PHP-API-AUTH](https://github.com/mevdschee/php-api-auth): Single file PHP\n  script that is an authentication provider for PHP-CRUD-API\n- [PHP-CRUD-UI](https://github.com/mevdschee/php-crud-ui): Single file PHP\n  script that adds a UI to a PHP-CRUD-API project.\n- [PHP-CRUD-ADMIN](https://github.com/mevdschee/php-crud-admin): Single file PHP\n  script that adds a database admin interface to a PHP-CRUD-API project.\n- [PHP-SP-API](https://github.com/mevdschee/php-sp-api): Single file PHP script\n  that adds a REST API to a SQL database.\n- [dexie-mysql-sync](https://github.com/scriptPilot/dexie-mysql-sync):\n  Synchronization between local IndexedDB and MySQL Database.\n- [ra-data-treeql](https://github.com/nkappler/ra-data-treeql): NPM package that\n  provides a\n  [Data Provider](https://marmelab.com/react-admin/DataProviderIntroduction.html)\n  for [React Admin](https://marmelab.com/react-admin/).\n- [scriptPilot/vueuse](https://github.com/scriptPilot/vueuse/): Vue\n  [Composables](https://vuejs.org/guide/reusability/composables.html) in\n  addition to [VueUse.org](https://vueuse.org/) (that support PHP-CRUD-API).\n- [scriptPilot/add-php-backend](https://github.com/scriptPilot/add-php-backend):\n  Add MySQL, phpMyAdmin and PHP-CRUD-API to your dev environment.\n- [VUE-CRUD-UI](https://github.com/nlware/vue-crud-ui): Single file Vue.js\n  script that adds a UI to a PHP-CRUD-API project.\n- [awesome-node-auth](https://www.awesomenodeauth.com): Database-agnostic JWT\n  authentication library for Node.js that can use PHP-CRUD-API as its storage\n  layer (see the\n\nThere are also proof-of-concept ports of this script that only support basic\nREST CRUD functionality in:\n[PHP](https://github.com/mevdschee/php-crud-api/blob/master/extras/core.php),\n[Java](https://github.com/mevdschee/java-crud-api/blob/master/core/src/main/java/com/tqdev/CrudApiHandler.java),\n[Go](https://github.com/mevdschee/go-crud-api/blob/master/api.go),\n[C# .net core](https://github.com/mevdschee/core-data-api/blob/master/Program.cs),\n[Node.js](https://github.com/mevdschee/js-crud-api/blob/master/app.js) and\n[Python](https://github.com/mevdschee/py-crud-api/blob/master/api.py).\n\n## Compilation\n\nYou can install all dependencies of this project using the following command:\n\n    php install.php\n\nYou can compile all files into a single \"`api.php`\" file using:\n\n    php build.php\n\nNote that you don't use compilation when you integrate this project into another\nproject or framework (use Composer instead).\n\n### Development\n\nYou can access the non-compiled code at the URL:\n\n    http://localhost:8080/src/records/posts/1\n\nThe non-compiled code resides in the \"`src`\" and \"`vendor`\" directories. The\n\"`vendor`\" directory contains the dependencies.\n\n### Updating dependencies\n\nYou can update all dependencies of this project using the following command:\n\n    php update.php\n\nThis script will install and run [Composer](https://getcomposer.org/) to update\nthe dependencies.\n\nNB: The update script will patch the dependencies in the vendor directory for\nPHP 7.0 compatibility.\n\n## TreeQL, a pragmatic GraphQL\n\n[TreeQL](https://treeql.org) allows you to create a \"tree\" of JSON objects based\non your SQL database structure (relations) and your query.\n\nIt is loosely based on the REST standard and also inspired by json:api.\n\n### CRUD + List\n\nThe example posts table has only a a few fields:\n\n    posts  \n    =======\n    id     \n    title  \n    content\n    created\n\nThe CRUD + List operations below act on this table.\n\n#### Create\n\nIf ","default_branch":"main","files":293,"tree":[".gitattributes",".gitignore",".htaccess","CONTRIBUTING.md","Dockerfile","LICENSE","README.md","api.include.php","api.php","build.php","composer.json","composer.lock","docker-compose.yml","docker/build_all.sh","docker/clean_all.sh","docker/debian11/Dockerfile","docker/debian11/run.sh","docker/debian12/Dockerfile","docker/debian12/run.sh","docker/debian13/Dockerfile","docker/debian13/run.sh","docker/run.sh","docker/run_all.sh","examples/clients/angular.html","examples/clients/angular2.html","examples/clients/auth.php/vanilla.html","examples/clients/auth0/vanilla.html","examples/clients/datatables.html","examples/clients/firebase/vanilla-success.html","examples/clients/firebase/vanilla.html","examples/clients/handlebars.html","examples/clients/knockout.html","examples/clients/leaflet/geojson-layer.js","examples/clients/leaflet/geojson-tile-layer.js","examples/clients/leaflet/vanilla.html","examples/clients/mustache.html","examples/clients/qgis/geojson.png","examples/clients/react.html","examples/clients/upload/vanilla.html","examples/clients/vanilla.html","examples/clients/vue.html","examples/clients/zepto.html","examples/index.html","extras/core.php","install.php","phpstan.neon","publish-docker.sh","release.sh","src/Tqdev/PhpCrudApi/Api.php","src/Tqdev/PhpCrudApi/Cache/Base/BaseCache.php","src/Tqdev/PhpCrudApi/Cache/Cache.php","src/Tqdev/PhpCrudApi/Cache/CacheFactory.php","src/Tqdev/PhpCrudApi/Cache/MemcacheCache.php","src/Tqdev/PhpCrudApi/Cache/MemcachedCache.php","src/Tqdev/PhpCrudApi/Cache/NoCache.php","src/Tqdev/PhpCrudApi/Cache/RedisCache.php","src/Tqdev/PhpCrudApi/Cache/TempFileCache.php","src/Tqdev/PhpCrudApi/Column/DefinitionService.php","src/Tqdev/PhpCrudApi/Column/Reflection/ReflectedColumn.php","src/Tqdev/PhpCrudApi/Column/Reflection/ReflectedDatabase.php","src/Tqdev/PhpCrudApi/Column/Reflection/ReflectedTable.php","src/Tqdev/PhpCrudApi/Column/ReflectionService.php","src/Tqdev/PhpCrudApi/Config/Base/ConfigInterface.php","src/Tqdev/PhpCrudApi/Config/Config.php","src/Tqdev/PhpCrudApi/Controller/CacheController.php","src/Tqdev/PhpCrudApi/Controller/ColumnController.php","src/Tqdev/PhpCrudApi/Controller/GeoJsonController.php","src/Tqdev/PhpCrudApi/Controller/JsonResponder.php","src/Tqdev/PhpCrudApi/Controller/OpenApiController.php","src/Tqdev/PhpCrudApi/Controller/RecordController.php","src/Tqdev/PhpCrudApi/Controller/Responder.php","src/Tqdev/PhpCrudApi/Controller/StatusController.php","src/Tqdev/PhpCrudApi/Database/ColumnConverter.php","src/Tqdev/PhpCrudApi/Database/ColumnsBuilder.php","src/Tqdev/PhpCrudApi/Database/ConditionsBuilder.php","src/Tqdev/PhpCrudApi/Database/DataConverter.php","src/Tqdev/PhpCrudApi/Database/GenericDB.php","src/Tqdev/PhpCrudApi/Database/GenericDefinition.php","src/Tqdev/PhpCrudApi/Database/GenericReflection.php","src/Tqdev/PhpCrudApi/Database/LazyPdo.php","src/Tqdev/PhpCrudApi/Database/RealNameMapper.php","src/Tqdev/PhpCrudApi/Database/TypeConverter.php","src/Tqdev/PhpCrudApi/GeoJson/Feature.php","src/Tqdev/PhpCrudApi/GeoJson/FeatureCollection.php","src/Tqdev/PhpCrudApi/GeoJson/GeoJsonService.php","src/Tqdev/PhpCrudApi/GeoJson/Geometry.php","src/Tqdev/PhpCrudApi/Middleware/AjaxOnlyMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/ApiKeyAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/ApiKeyDbAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/AuthorizationMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/Base/Middleware.php","src/Tqdev/PhpCrudApi/Middleware/BasicAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/Communication/VariableStore.php","src/Tqdev/PhpCrudApi/Middleware/CorsMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/CustomizationMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/FirewallMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/IpAddressMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/JoinLimitsMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/JsonMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/JwtAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/MultiTenancyMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/PageLimitsMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/ReconnectMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/Router/Router.php","src/Tqdev/PhpCrudApi/Middleware/Router/SimpleRouter.php","src/Tqdev/PhpCrudApi/Middleware/SanitationMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/SslRedirectMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/TextSearchMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/ValidationMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/WpAuthMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/XmlMiddleware.php","src/Tqdev/PhpCrudApi/Middleware/XsrfMiddleware.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiBuilder.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiColumnsBuilder.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiDefinition.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiRecordsBuilder.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiService.php","src/Tqdev/PhpCrudApi/OpenApi/OpenApiStatusBuilder.php","src/Tqdev/PhpCrudApi/Record/ColumnIncluder.php","src/Tqdev/PhpCrudApi/Record/Condition/AndCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/ColumnCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/Condition.php","src/Tqdev/PhpCrudApi/Record/Condition/NoCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/NotCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/OrCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/RelatedCondition.php","src/Tqdev/PhpCrudApi/Record/Condition/SpatialCondition.php","src/Tqdev/PhpCrudApi/Record/Document/ErrorDocument.php","src/Tqdev/PhpCrudApi/Record/Document/ListDocument.php","src/Tqdev/PhpCrudApi/Record/ErrorCode.php","src/Tqdev/PhpCrudApi/Record/FilterInfo.php","src/Tqdev/PhpCrudApi/Record/HabtmValues.php","src/Tqdev/PhpCrudApi/Record/OrderingInfo.php","src/Tqdev/PhpCrudApi/Record/PaginationInfo.php","src/Tqdev/PhpCrudApi/Record/PathTree.php","src/Tqdev/PhpCrudApi/Record/RecordService.php","src/Tqdev/PhpCrudApi/Record/RelationJoiner.php","src/Tqdev/PhpCrudApi/Record/RelationResolver.php","src/Tqdev/PhpCrudApi/RequestFactory.php","src/Tqdev/PhpCrudApi/RequestUtils.php","src/Tqdev/PhpCrudApi/ResponseFactory.php","src/Tqdev/PhpCrudApi/ResponseUtils.php","src/index.php","test.php","tests/config/.htpasswd","tests/config/base.php","tests/config/controller.php","tests/config/mysql.php","tests/config/pgsql.php","tests/config/sqlite.php","tests/config/sqlsrv.php","tests/fixtures/blog_mysql.sql","tests/fixtures/blog_pgsql.sql","tests/fixtures/blog_sqlite.sql","tests/fixtures/blog_sqlsrv.sql","tests/fixtures/create_mysql.sql","tests/fixtures/create_pgsql.sql","tests/fixtures/create_sqlsrv.sql","tests/functional/001_records/001_list_posts.log","tests/functional/001_records/002_list_post_columns.log","tests/functional/001_records/003_read_post.log","tests/functional/001_records/004_read_posts.log","tests/functional/001_records/005_read_post_columns.log","tests/functional/001_records/006_add_post.log","tests/functional/001_records/007_edit_post.log","tests/functional/001_records/008_edit_post_columns_missing_field.log","tests/functional/001_records/009_edit_post_columns_extra_field.log","tests/functional/001_records/010_edit_post_with_utf8_content.log","tests/functional/001_records/011_edit_post_with_utf8_content_with_post.log","tests/functional/001_records/012_delete_post.log","tests/functional/001_records/013_add_post_with_post.log","tests/functional/001_records/014_edit_post_with_post.log","tests/functional/001_records/015_delete_post_ignore_columns.log","tests/functional/001_records/016_list_with_paginate.log","tests/functional/001_records/017_edit_post_primary_key.log","tests/functional/001_records/018_add_post_missing_field.log","tests/functional/001_records/019_list_with_paginate_in_multiple_order.log","tests/functional/001_records/020_list_with_paginate_in_descending_order.log","tests/functional/001_records/021_list_with_size.log","tests/functional/001_records/022_list_with_zero_page_size.log","tests/functional/001_records/023_list_with_zero_size.log","tests/functional/001_records/024_list_with_paginate_last_page.log","tests/functional/001_records/025_list_example_from_readme_full_record.log","tests/functional/001_records/026_list_example_from_readme_with_exclude.log","tests/functional/001_records/027_list_example_from_readme_users_only.log","tests/functional/001_records/028_read_example_from_readme_users_only.log","tests/functional/001_records/029_list_example_from_readme_comments_only.log","tests/functional/001_records/030_list_example_from_readme_tags_only.log","tests/functional/001_records/031_list_example_from_readme_tags_with_join_path.log","tests/functional/001_records/032_list_example_from_readme.log","tests/functional/001_records/033_list_example_from_readme_tag_name_only.log","tests/functional/001_records/034_list_example_from_readme_with_transform_with_exclude.log","tests/functional/001_records/035_edit_category_with_binary_content.log","tests/functional/001_records/036_edit_category_with_null.log","tests/functional/001_records/037_edit_category_with_binary_content_with_post.log","tests/functional/001_records/038_list_categories_with_binary_content.log","tests/functional/001_records/039_edit_category_with_null_with_post.log","tests/functional/001_records/040_add_post_failure.log","tests/functional/001_records/041_cors_pre_flight.log","tests/functional/001_records/042_cors_headers.log","tests/functional/001_records/043_error_on_invalid_json.log","tests/functional/001_records/044_error_on_duplicate_unique_key.log","tests/functional/001_records/045_error_on_failing_foreign_key_constraint.log","tests/functional/001_records/046_error_on_non_existing_table.log","tests/functional/001_records/047_error_on_invalid_path.log","tests/functional/001_records/048_error_on_invalid_argument_count.log","tests/functional/001_records/049_error_on_invalid_argument_count.log","tests/functional/001_records/050_no_error_on_argument_count_one.log","tests/functional/001_records/051_error_on_invalid_argument_count.log","tests/functional/001_records/052_edit_user_location.log","tests/functional/001_records/053_list_user_locations.log","tests/functional/001_records/054_edit_user_with_id.log","tests/functional/001_records/055_filter_category_on_null_icon.log","tests/functional/001_records/056_filter_category_on_not_null_icon.log","tests/functional/001_records/057_filter_on_and.log","tests/functional/001_records/058_filter_on_or.log","tests/functional/001_records/059_filter_on_and_plus_or.log","tests/functional/001_records/060_filter_on_or_plus_and.log","tests/functional/001_records/061_get_post_content_with_included_tag_names.log","tests/functional/001_records/062_read_kunsthandvaerk.log","tests/functional/001_records/063_list_kunsthandvaerk.log","tests/functional/001_records/064_add_kunsthandvaerk.log","tests/functional/001_records/065_edit_kunsthandvaerk.log","tests/functional/001_records/066_delete_kunsthandvaerk.log","tests/functional/001_records/067_edit_comment_with_validation.log","tests/functional/001_records/068_add_comment_with_sanitation.log","tests/functional/001_records/069_increment_event_visitors.log","tests/functional/001_records/070_list_invisibles.log","tests/functional/001_records/071_add_comment_with_invisible_record.log","tests/functional/001_records/072_list_nopk.log","tests/functional/001_records/073_multi_tenancy_kunsthandvaerk.log","tests/functional/001_records/074_custom_kunsthandvaerk.log","tests/functional/001_records/075_list_tag_usage.log","tests/functional/001_records/076_list_user_locations_within_geometry.log","tests/functional/001_records/077_list_posts_with_page_limits.log","tests/functional/001_records/078_edit_event_with_nullable_bigint.log","tests/functional/001_records/079_read_post_with_categories.log","tests/functional/001_records/080_add_barcode_with_ip_address.log","tests/functional/001_records/081_read_countries_as_geojson.log","tests/functional/001_records/082_read_users_as_geojson.log","tests/functional/001_records/083_list_users_as_geojson.log","tests/functional/001_records/084_update_tags_with_boolean.log","tests/functional/001_records/085_update_invisble_column_kunsthandvaerk.log","tests/functional/001_records/086_add_and_update_posts_in_large_batch.log","tests/functional/001_records/087_read_and_write_posts_as_xml.log","tests/functional/001_records/088_read_and_write_multiple_posts_as_xml.log","tests/functional/001_records/089_redirect_to_ssl.log","tests/functional/001_records/090_add_multiple_comments.log","tests/functional/001_records/091_edit_multiple_comments.log","tests/functional/001_records/092_read_product_json.log","tests/functional/001_records/093_update_product_json.log","tests/functional/001_records/094_search_posts.log","tests/functional/001_records/095_list_tags_with_boolean.log","tests/functional/001_records/096_list_posts_filter_on_hasmany_child.log","tests/functional/001_records/097_list_posts_filter_on_belongsto_parent.log","tests/functional/001_records/098_list_posts_filter_on_habtm_child.log","tests/functional/001_records/099_list_posts_filter_on_nested_child.log","tests/functional/001_records/100_list_posts_child_filter_keeps_all_children.log","tests/functional/001_records/101_list_posts_child_filter_with_pagination.log","tests/functional/001_records/102_list_posts_child_filter_or_grouping.log","tests/functional/001_records/103_list_posts_negated_hasmany_child_filter.log","tests/functional/001_records/104_list_posts_unknown_relation_filter_ignored.log","tests/functional/001_records/105_list_posts_child_filter_respects_record_auth.log","tests/functional/001_records/106_list_users_child_filter_respects_multi_tenancy.log","tests/functional/001_records/107_filter_contains_escapes_like_wildcard.log","tests/functional/002_auth/001_jwt_auth.log","tests/functional/002_auth/002_basic_auth.log","tests/functional/002_auth/003_db_auth.log","tests/functional/002_auth/004_api_key_auth.log","tests/functional/002_auth/005_api_key_db_auth.log","tests/functional/003_columns/001_get_database.log","tests/functional/003_columns/002_get_barcodes_table.log","tests/functional/003_columns/003_get_barcodes_id_column.log","tests/functional/003_columns/004_update_barcodes_id_column.log","tests/functional/003_columns/005_update_barcodes_product_id_nullable.log","tests/functional/003_columns/006_update_events_visitors_pk.log","tests/functional/003_columns/007_update_barcodes_product_id_fk.log","tests/functional/003_columns/008_update_barcodes_table.log","tests/functional/003_columns/009_update_barcodes_hex_type.log","tests/functional/003_columns/010_create_barcodes_table.log","tests/functional/003_columns/011_create_barcodes_column.log","tests/functional/003_columns/012_get_invisibles_table.log","tests/functional/003_columns/013_get_invisible_column.log","tests/functional/003_columns/014_create_types_table.log","tests/functional/003_columns/015_update_types_table.log","tests/functional/003_columns/016_update_forgiving_table.log","tests/functional/003_columns/017_get_barcodes_table_as_xml.log","tests/functional/003_columns/018_get_posts_table.log","tests/functional/003_columns/019_update_posts_table.log","tests/functional/004_cache/001_clear_cache.log","tests/functional/005_custom_controller/001_hello_world.log","update.php"],"storefront":"/r/mevdschee","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/mevdschee/php-crud-api/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}