BruceGitHub / FlatDB

Simple flat file database designed to persist data using just PHP and flat files.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FlatDB

FlatDB is a simple flat file database designed to persist data using just PHP and flat files. Perfect solution when no other database is available.

Features:

  • Lightweight and Secure
  • Easy to get started, just include flatdb.php to your app
  • No external dependencies
  • Built-in caching system for better performance
  • Powerful API with chaining methods
  • CRUD (create, read, update, delete) operations
  • Supports custom indexes
  • Supports WHERE(), LIMIT(), OFFSET(), ORDER(), FIND(), COUNT() and other methods
  • Supports multiple databases and tables

Usage

Method Chaining API

FlatDB implements a method chaining API, which means that you can call one method after another like a chain, for example $object->method1()->method2()->method3()

Installation

Using Composer

FlatDB is available to use in Composer:

"require": {
        "maxkostinevich/flatdb": ">=1.0.0",
        }

And then you can use it in your project:

require_once __DIR__ . '/vendor/autoload.php';
use FlatDB\FlatDB;
$db = new FlatDB(__DIR__ . '/data');

Download and include

Otherwise you can just download flatdb.php and use it in your project:

require_once('path-to-includes/flatdb.php');
$db = new FlatDB(__DIR__ . '/data');

Insert data into table

// If table 'products' is not exist, it will be created on the fly
// The insert function returns the inserted object, note that it added an 'id' key
// The 'id' key is an integer automatically incremented every time an item is added to the table

$result = $db->table('products')->insert(array('name' => 'Cotton Hoodie', 'price' => 48, 'sizes' => array('S', 'L') ));
echo 'The id of the inserted object is: ' . $result['id']; // echoes "The id of the inserted object is: 1"

$db->table('products')->insert(array('name' => 'Knit Hooded Sweater', 'price' => 32, 'sizes' => array('M', 'L', 'XL') ));
$db->table('products')->insert(array('name' => 'Hooded Jacket', 'price' => 51, 'sizes' => array('S', 'M', 'L') ));
$db->table('products')->insert(array('name' => 'Premium Cotton T-Shirt', 'price' => 23, 'sizes' => array('S', 'L', 'XL') ));

Get all entries from table

$data = $db->table('products')->all();
var_dump($data);

Return specific columns only

$data = $db->table('products')->select(array('name','price'))->all();
var_dump($data);

Update data

// Update entry with id=1
$db->table('products')->update(1, array(
	'name' => 'Cotton Hoodie',
	'price' => 48.99,
    'sizes' => array('XS', 'S', 'L')
));

Delete data

// Remove entry with id=1
$db->table('products')->remove(1);

Find data

FIND() method stops on first match.

// Find entry with id=1
$data = $db->table('products')->find(1);

// Find entries with specific column value, e.g. with price = 51
$data = $db->table('products')->find(51, 'price');

Use WHERE() clause

WHERE() method does NOT stop on first match.

// Get entries with name='Hooded Jacket'
$data = $db->table('products')->where(array('name' => 'Hooded Jacket'))->all();

// Get entries with price=23
$data = $db->table('products')->where(array('price' => 23))->all();

// Get entries with 'M' sizes
$data = $db->table('products')->where(array('sizes' => 'M'))->all();

// Get entries with 'L' and 'XL' sizes
$data = $db->table('products')->where(array('sizes' => array('L', 'XL')))->all();

// Get the count of entries with 'L' size
$data = $db->table('products')->where(array('sizes' => 'L'))->count();

LIMIT(), OFFSET(), and ORDER()

IMPORTANT: To use ORDER() and FIND() methods on specific fields you should add these fields to indexes() first.

// Show only latest 5 entries
$data = $db->table('products')->limit(5)->all();

// Skip first 5 entries
$data = $db->table('products')->offset(5)->all();

// Skip first 5 entries and show only 5 entries
$data = $db->table('products')->offset(5)->limit(5)->all();

// Change the order of entries
// By default, the order is ascending (from the smallest to the biggest) by 'id' (oldest entries are the first to be returned)
$data = $db->table('products')->order('desc')->all();

// If you have an index on a column, you apply ORDER() function to it (see Indexes section)
// Order by price (from higher to lower)
$data = $db->table('products')->order('desc', 'price')->all();

// Use ORDER(), OFFSET() and LIMIT() methods together
$data = $db->table('products')->order('desc')->offset(5)->limit(5)->all();

Indexes

By default, the 'id' field is used as an index, however you can define your own custom indexes. IMPORTANT: The 'id' index cannot be removed or modified.

It's recommended to set the indexes early in the lifecycle of your app, before entries are added to the tables, however it's not required, and you call the INDEXES() method anywhere you want.

Indexes are used by ORDER() and FIND() methods.

// We can define custom indexes for our table, for example, let's add price 'field' to indexes
$db->table('products')->indexes(array('id', 'price'));

// Now we can use 'price' index within the ORDER() and FIND() methods

// Find entry with price=23
$data = $db->table('products')->find(23, 'price');

// Order entrues by price
$data = $db->table('products')->order('desc', 'price');

Security

FlatDB uses PHP files to store and protect the data, so it cannot be accessed from web-browser by URL.

As an extra layer of security, FlatDB creates an empty index.php for each database folder and table folder to prevent directory listing.

If you store sensitive information such as passwords consider hashing them, this is a generic tip, not only for FlatDB but for any other database. IMPORTANT: sha1() or md5() are not safe functions for password hashing, use password_hash() instead.

Data Folder Structure (Example)

|- data/
|-- index.php
|-- default/ (database name)
     |- index.php
     |- table_1/ (table name)
         |- index.php 
         |- meta.php 
         |- entry_1.php 
         |- entry_2.php 
         |- entry_3.php 
         |- entry_4.php
         |- etc..
		 
     |- table_2/ (table name)
         |- index.php 
         |- meta.php 
         |- entry_1.php 
         |- entry_2.php 
         |- entry_3.php 
         |- etc..
		 
|-- database_2/ (database name)
     |- index.php
     |- table_1/ (table name)
         |- index.php 
         |- etc..

API Reference

Method Description
new FlatDB($data_path, $db_name = 'default') Creates a new database instance
table($name) Select a table to work with
indexes($array) Adds passed fields to table indexes
insert($data) Insert new entry to the current table
update($id, $data) Update entry data with the given id in the current table
remove($id) Remove entry with the given id from the current table
order($order = 'asc', [$field = 'id']) Change the sort order of returned entries
limit($number) Used to constrain number of returned entries
offset($number) The number of entries to be skipped
skip($ammount) Alias for offset()
select($array) Specify returned fields of entries
where($array) Indicates the condition that entries must satisfy to be selected
all() Return all entries of the query result
first() Return only first entry of the query result
count() Return the number of returned entries
find($value, [$field = 'id']) Find and return an entry with the given value in specified field

Changelog

v1.0.0 - June 2, 2016
  - Add composer support;
  - Change code formatting according to PSR-4;
  - Add namespace;
v0.0.9 - May 12, 2016
** Initial release **

(c) 2016 Max Kostinevich - All rights reserved.

About

Simple flat file database designed to persist data using just PHP and flat files.


Languages

Language:PHP 100.0%