nkt / flame
The PDO wrapper with comfortable API for placeholders
Requires
- php: ~5.4
- ext-pdo: >1.0.3
Requires (Dev)
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: dev-master
README
The PDO wrapper with comfortable API for placeholders
Installation
Flame requires php 5.4+ and PDO extension.
composer require nkt/flame:~1.0
Usage
<?php use Flame\Connection; use Flame\Grammar\MysqlGrammar; $db = new Connection('mysql:dbname=hello_world', 'user', 'password', [], new MysqlGrammar()); $db->prepare(...);
Idea
Write placeholders types directly in the query
For example:
SELECT * FROM goods g WHERE g.price BETWEEN f:minPrice AND f:maxPrice; SELECT * FROM users u WHERE u.username = s:username; -- :username also bind as string SELECT * FROM orders o WHERE o.id = i:id; SELECT * FROM users u WHERE u.registered >= d:date;
Difference between native PDO placeholders
Unlike PDO you can re-use the same placeholder as long as necessary. Also you have to specifying the type of the placeholder just once.
$users = $flame->prepare( 'SELECT * FROM users WHERE age >= i:age OR (registered < d:registered AND age = :age)' )->execute(['age' => $age]);
You don't need cast every integer values, Flame do it for you.
$stmt = $flame->prepare('SELECT * FROM users WHERE id = i:id)'); $users = $stmt->execute(['id' => $_POST['id']]);
Every query execution Flame tests value is null
and if it is,
change placeholder type to PDO::PARAM_NULL
.
$stmt = $flame->prepare('INSERT INTO users VALUES(s:username, d:last_login))'); $users = $stmt->execute(['username' => 'John Doe', 'last_login' => null]);
Flame add new types: date and time. You can bind this data as DateTime
, string
or int
.
Placeholder types
Query builder
Flame also provide powerful query builder. Connection provide base wrappers:
Connection::select(string $column...)
Connection::update(string $table, array $columns)
Connection::insert(string $table, array $columns)
Every sql statement provides by method with same name in camelCase
.
Examples:
$posts = $db->prepare( $db->select('p.id', 'p.title', 'p.content') ->from('posts p') ->join('post_tags pt', 'p.id', 'pt.post_id') ->join('tags t', 't.id', 'pt.tag_id') ->where(function ($e) { $e->equal('t.name', ':tag'); }) )->execute(['tag' => $tag]); $db->prepare($db->insert('users', [ 'username' => ':name', 'password' => ':pass', 'registered' => 'd:now' ]))->execute([ 'name' => $name, 'pass' => $pass, 'now' => new \DateTime() ]);