Sparrow is a fluent SQL builder.
Sparrow is a simple but powerful database toolkit. Sparrow is a fluent SQL builder, database abstraction layer, cache manager, query statistics generator, and micro-ORM all rolled into a single class file., (*1)
// Include the library include '/path/to/sparrow.php'; // Declare the class instance $db = new Sparrow(); // Select a table $db->from('user') // Build a select query $db->select(); // Display the SQL echo $db->sql();
Output:, (*2)
SELECT * FROM user
Sparrow allows you to chain methods together, so you can instead do:, (*3)
echo $db->from('user')->select()->sql();
To add where conditions to your query, use the where
function., (*4)
echo $db->from('user') ->where('id', 123) ->select() ->sql();
Output:, (*5)
SELECT * FROM user WHERE id = 123
You can call where multiple times to add multiple conditions., (*6)
echo $db->from('user') ->where('id', 123) ->where('name', 'bob') ->select() ->sql();
Output:, (*7)
SELECT * FROM user WHERE id = 123 AND name = 'bob'
You can also pass an array to the where function. The following would produce the same output., (*8)
$where = array('id' => 123, 'name' => 'bob'); echo $db->from('user') ->where($where) ->select() ->sql();
You can even pass in a string literal., (*9)
echo $db->from('user') ->where('id = 99') ->select() ->sql();
Output:, (*10)
SELECT * FROM user WHERE id = 99
The default operator for where queries is =
. You can use different operators by placing
them after the field declaration., (*11)
echo $db->from('user') ->where('id >', 123) ->select() ->sql();
Output:, (*12)
SELECT * FROM user WHERE id > 123;
By default where conditions are joined together by AND
keywords. To use OR instead, simply
place a |
delimiter before the field name., (*13)
echo $db->from('user') ->where('id <', 10) ->where('|id >', 20) ->select() ->sql();
Output:, (*14)
SELECT * FROM user WHERE id < 10 OR id > 20
To build a LIKE query you can use the special %
operator., (*15)
echo $db->from('user') ->where('name %', '%bob%') ->select() ->sql();
Output:, (*16)
SELECT * FROM user WHERE name LIKE '%bob%'
To build a NOT LIKE query, add a !
before the %
operator., (*17)
echo $db->from('user') ->where('name !%', '%bob%') ->select() ->sql();
Output:, (*18)
SELECT * FROM user WHERE name NOT LIKE '%bob%'
To use an IN statement in your where condition, use the special @
operator
and pass in an array of values., (*19)
echo $db->from('user') ->where('id @', array(10, 20, 30)) ->select() ->sql();
Output:, (*20)
SELECT * FROM user WHERE id IN (10, 20, 30)
To build a NOT IN query, add a !
before the @
operator., (*21)
echo $db->from('user') ->where('id !@', array(10, 20, 30)) ->select() ->sql();
Output:, (*22)
SELECT * FROM user WHERE id NOT IN (10, 20, 30)
To select specific fields, pass an array in to the select
function., (*23)
echo $db->from('user') ->select(array('id','name')) ->sql();
Output:, (*24)
SELECT id, name FROM user
To add a limit or offset to a query, you can use the limit
and offset
functions., (*25)
echo $db->from('user') ->limit(10) ->offset(20) ->select() ->sql();
Output:, (*26)
SELECT * FROM user LIMIT 10 OFFSET 20
You can also pass in additional parameters to the select
function., (*27)
echo $db->from('user') ->select('*', 50, 10) ->sql();
Output:, (*28)
SELECT * FROM user LIMIT 50 OFFSET 10
To add a DISTINCT keyword to your query, call the distinct
function., (*29)
echo $db->from('user') ->distinct() ->select('name') ->sql();
Output:, (*30)
SELECT DISTINCT name FROM user
To add a table join, use the join
function and pass in an array of fields to join on., (*31)
echo $db->from('user') ->join('role', array('role.id' => 'user.id')) ->select() ->sql();
Output:, (*32)
SELECT * FROM user INNER JOIN role ON role.id = user.id
The default join type is an INNER
join. To build other types of joins you can use
the alternate join functions leftJoin
, rightJoin
, and fullJoin
., (*33)
The join array works just like where conditions, so you can use custom operators and add multiple conditions., (*34)
echo $db->from('user') ->join('role', array('role.id' => 'user.id', 'role.id >' => 10)) ->select() ->sql();
Output:, (*35)
SELECT * FROM user INNER JOIN role ON role.id = user.id AND role.id > 10
To add sorting to a query, use the sortAsc
and sortDesc
functions., (*36)
echo $db->from('user') ->sortDesc('id') ->select() ->sql();
Output:, (*37)
SELECT * FROM user ORDER BY id DESC
You can also pass an array to the sort functions., (*38)
echo $db->from('user') ->sortAsc(array('rank','name')) ->select() ->sql();
Output:, (*39)
SELECT * FROM user ORDER BY rank ASC, name ASC
To add a field to group by, use the groupBy
function., (*40)
echo $db->from('user') ->groupBy('points') ->select(array('id','count(*)')) ->sql();
Output:, (*41)
SELECT id, count(*) FROM user GROUP BY points;
To build an insert query, pass in an array of data to the insert
function., (*42)
$data = array('id' => 123, 'name' => 'bob'); echo $db->from('user') ->insert($data) ->sql();
Output:, (*43)
INSERT INTO user (id, name) VALUES (123, 'bob')
To build an update query, pass in an array of data to the update
function., (*44)
$data = array('name' => 'bob', 'email' => 'bob@aol.com'); $where = array('id' => 123); echo $db->from('user') ->where($where) ->update($data) ->sql();
Output:, (*45)
UPDATE user SET name = 'bob', email = 'bob@aol.com' WHERE id = 123
To build a delete query, use the delete
function., (*46)
echo $db->from('user') ->where('id', 123) ->delete() ->sql();
Output:, (*47)
DELETE FROM user WHERE id = 123
Sparrow can also execute the queries it builds. You will need to call the setDb()
method with either
a connection string, an array of connection information, or a connection object., (*48)
The supported database types are mysql
, mysqli
, pgsql
, sqlite
and sqlite3
., (*49)
Using a connection string:, (*50)
$db->setDb('mysql://admin:hunter2@localhost/mydb');
The connection string uses the following format:, (*51)
type://username:password@hostname[:port]/database
For sqlite, you need to use:, (*52)
type://database
Using a connection array:, (*53)
$db->setDb(array( 'type' => 'mysql', 'hostname' => 'localhost', 'database' => 'mydb', 'username' => 'admin', 'password' => 'hunter2' ));
The possible array options are type
, hostname
, database
, username
, password
, and port
., (*54)
Using a connection object:, (*55)
$mysql = mysql_connect('localhost', 'admin', 'hunter2'); mysql_select_db('mydb'); $db->setDb($mysql);
You can also use PDO for the database connection. To use the connection string or array method, prefix the database type with pdo
:, (*56)
$db->setDb('pdomysql://admin:hunter2@localhost/mydb');
The possible PDO types are pdomysql
, pdopgsql
, and pdosqlite
., (*57)
You can also pass in any PDO object directly:, (*58)
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'admin', 'hunter2'); $db->setDb($pdo);
To fetch multiple records, use the many
function., (*59)
$rows = $db->from('user') ->where('id >', 100) ->many();
The result returned is an array of associative arrays:, (*60)
array( array('id' => 101, 'name' => 'joe'), array('id' => 102, 'name' => 'ted'); )
To fetch a single record, use the one
function., (*61)
$row = $db->from('user') ->where('id', 123) ->one();
The result returned is a single associative array:, (*62)
array('id' => 123, 'name' => 'bob')
To fetch the value of a column, use the value
function and pass in the name of the column., (*63)
$username = $db->from('user') ->where('id', 123) ->value('username');
All the fetch functions automatically perform a select, so you don't need to include the select
function
unless you want to specify the fields to return., (*64)
$row = $db->from('user') ->where('id', 123) ->select(array('id', 'name')) ->one();
For non-queries like update, insert and delete, use the execute
function after building your query., (*65)
$db->from('user') ->where('id', 123) ->delete() ->execute();
Executes:, (*66)
DELETE FROM user WHERE id = 123
You can also run raw SQL by passing it to the sql
function., (*67)
$posts = $db->sql('SELECT * FROM posts')->many(); $user = $db->sql('SELECT * FROM user WHERE id = 123')->one(); $db->sql('UPDATE user SET name = 'bob' WHERE id = 1')->execute();
Sparrow's SQL building functions automatically quote and escape values to prevent SQL injection.
To quote and escape values manually, like when you're writing own queries, you can use the quote
function., (*68)
$name = "O'Dell"; printf("SELECT * FROM user WHERE name = %s", $db->quote($name));
Output:, (*69)
SELECT * FROM user WHERE name = 'O\'Dell'
After executing a query, several property values will be populated which you can access directly., (*70)
// Last query executed $db->last_query; // Number of rows returned $db->num_rows; // Last insert id $db->insert_id; // Number of affected rows $db->affected_rows;
These values are reset every time a new query is executed., (*71)
To get a count of rows in a table., (*72)
$count = $db->from('user')->count();
To get the minimum value from a table., (*73)
$min = $db->from('employee')->min('salary');
To get the maximum value from a table., (*74)
$max = $db->from('employee')->max('salary');
To get the average value from a table., (*75)
$avg = $db->from('employee')->avg('salary');
To get the sum value from a table., (*76)
$avg = $db->from('employee')->sum('salary');
You can also access the database object directly by using the getDb
function., (*77)
$mysql = $db->getDb(); mysql_info($mysql);
To enable caching, you need to use the setCache
method with a connection string or connection object., (*78)
Using a connection string:, (*79)
$db->setCache('memcache://localhost:11211');
Using a cache object:, (*80)
$cache = new Memcache(); $cache->addServer('localhost', 11211); $db->setCache($cache);
You can then pass a cache key to the query functions and Sparrow will try to fetch from the cache before executing the query. If there is a cache miss, Sparrow will execute the query and store the results using the specified cache key., (*81)
$key = 'all_users'; $users = $db->from('user')->many($key);
The supported caches are memcache
, memcached
, apc
, xcache
, file
and memory
., (*82)
To use memcache
or memcached
, you need to use the following connection string:, (*83)
protocol://hostname:port
To use apc
or xcache
, just pass in the cache name:, (*84)
$db->setCache('apc');
To use the filesystem as a cache, pass in a directory path:, (*85)
$db->setCache('/usr/local/cache'); $db->setCache('./cache');
Note that local directories must be prefixed with ./
., (*86)
The default cache is memory
and only lasts the duration of the script., (*87)
To cache data only for a set period of time, you can pass in an additional parameter which represents the expiraton time in seconds., (*88)
$key = 'top_users'; $expire = 600; $users = $db->from('user') ->sortDesc('score') ->limit(100) ->many($key, $expire);
In the above example, we are getting a list of the top 100 highest scoring users and caching it for 600 seconds (10 minutes). You can pass the expiration parameter to any of the query methods that take a cache key parameter., (*89)
You can access the cache object directly by using the getCache
function., (*90)
$memcache = $db->getCache(); echo $memcache->getVersion();
You can manipulate the cache data directly as well. To cache a value use the store
function., (*91)
$db->store('id', 123);
To retrieve a cached value use the fetch
function., (*92)
$id = $db->fetch('id');
To delete a cached value use the clear
function., (*93)
$db->clear('id');
To completely empty the cache use the flush
function., (*94)
$db->flush();
Sparrow also provides some functionality for working with objects. Just define a class with public properties to represent database fields and static variables to describe the database relationship., (*95)
class User { // Class properties public $id; public $name; public $email; // Class configuration static $table = 'user'; static $id_field = 'id'; static $name_field = 'name'; }
table
property represents the database table. This property is required. id_field
property represents the auto-incrementing identity field in the table. This property is required for saving and deleting records. name_field
property is used for finding records by name. This property is optional.To define the object use the using
function and pass in the class name., (*96)
$db->using('User');
After setting your object, you can then use the find
method to populate the object. If you pass in an int
Sparrow will search using the id field., (*97)
$user = $db->find(123);
This will execute:, (*98)
SELECT * FROM user WHERE id = 123
If you pass in a string Sparrow will search using the name field., (*99)
$user = $db->find('Bob');
This will execute:, (*100)
SELECT * FROM user WHERE name = 'Bob';
If you pass in an array Sparrow will use the fields specified in the array., (*101)
$user = $db->find( array('email' => 'bob@aol.com') );
This will execute:, (*102)
SELECT * FROM user WHERE email = 'bob@aol.com'
If the find
method retrieves multiple records, it will return an array of objects
instead of a single object., (*103)
To save an object, just populate your object properties and use the save
function., (*104)
$user = new User(); $user->name = 'Bob'; $user->email = 'bob@aol.com'; $db->save($user);
This will execute:, (*105)
INSERT INTO user (name, email) VALUES ('Bob', 'bob@aol.com')
To update an object, use the save
function with the id_field
property populated., (*106)
$user = new User(); $user->id = 123; $user->name = 'Bob'; $user->email = 'bob@aol.com'; $db->save($user);
This will execute:, (*107)
UPDATE user SET name = 'Bob', email = 'bob@aol.com' WHERE id = 123
To update an existing record, just fetch an object from the database, update its properties, then save it., (*108)
// Fetch an object from the database $user = $db->find(123); // Update the object $user->name = 'Fred'; // Update the database $db->save($user);
By default, all of the object's properties will be included in the update. To specify only specific fields, pass in
an additional array of fields to the save
function., (*109)
$db->save($user, array('email'));
This will execute:, (*110)
UPDATE user SET email = 'bob@aol.com' WHERE id = 123
To delete an object, use the remove
function., (*111)
$user = $db->find(123); $db->remove($user);
You can use the sql builder functions to further define criteria for loading objects., (*112)
$db->using('User') ->where('id >', 10) ->sortAsc('name') ->find();
This will execute:, (*113)
SELECT * FROM user WHERE id > 10 ORDER BY name ASC
You can also pass in raw SQL to load your objects., (*114)
$db->using('User') ->sql('SELECT * FROM user WHERE id > 10') ->find();
Sparrow has built in query statistics tracking. To enable it, just set the stats_enabled
property., (*115)
$db->stats_enabled = true;
After running your queries, get the stats array:, (*116)
$stats = $db->getStats();
The stats array contains the total time for all queries and an array of all queries executed with individual query times., (*117)
array(6) { ["queries"]=> array(2) { [0]=> array(4) { ["query"]=> string(38) "SELECT * FROM user WHERE uid=1" ["time"]=> float(0.00016617774963379) ["rows"]=> int(1) ["changes"]=> int(0) } [1]=> array(4) { ["query"]=> string(39) "SELECT * FROM user WHERE uid=10" ["time"]=> float(0.00026392936706543) ["rows"]=> int(0) ["changes"]=> int(0) } } ["total_time"]=> float(0.00043010711669922) ["num_queries"]=> int(2) ["num_rows"]=> int(2) ["num_changes"]=> int(0) ["avg_query_time"]=> float(0.00021505355834961) }
When Sparrow encounters an error while executing a query, it will raise an exception with the database
error message. If you want to display the generated SQL along with the error message, set the show_sql
property., (*118)
$db->show_sql = true;
Sparrow requires PHP 5.1 or greater., (*119)
Sparrow is released under the MIT license., (*120)