# Query

A query builder/database abstraction layer, using prepared queries for security.

[![Build Status](https://secure.travis-ci.org/timw4mail/Query.png)](http://travis-ci.org/timw4mail/Query)
[![Code Coverage](https://scrutinizer-ci.com/g/timw4mail/Query/badges/coverage.png?s=a96df5417089f90250aeb59013a3964b1ff9b588)](https://scrutinizer-ci.com/g/timw4mail/Query/)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/timw4mail/Query/badges/quality-score.png?s=ce0f185067d7049cfe3f0aba2ca30ed56fb97b20)](https://scrutinizer-ci.com/g/timw4mail/Query/)
[![Latest Stable Version](https://poser.pugx.org/aviat4ion/query/v/stable.png)](https://packagist.org/packages/aviat4ion/query)
[![Total Downloads](https://poser.pugx.org/aviat4ion/query/downloads.png)](https://packagist.org/packages/aviat4ion/query)
[![Latest Unstable Version](https://poser.pugx.org/aviat4ion/query/v/unstable.png)](https://packagist.org/packages/aviat4ion/query)
[![License](https://poser.pugx.org/aviat4ion/query/license.png)](http://www.dbad-license.org/)

## Requirements
* Pdo extensions for the databases you wish to use (unless it's Firebird, in which case, the interbase extension is required)
* PHP 5.3+

## Databases Supported

* Firebird (via interbase extension)
* Firebird (via PDO) -- expirimental
* MySQL
* PostgreSQL
* SQLite

## Including Query in your application

To include Query in your PHP project, just include the `autoload.php` file. This will automatically load the classes that are supported by the current PHP installation.


## Connecting

Create a connection array or object similar to this:

	<?php

	$params = array(
		'type' => 'mysql',
		'host' => 'localhost',
		'user' => 'root',
		'pass' => '',
		'port' => '3306',
		'database' => 'test_db',

		// Only required
		// SQLite or Firebird
		'file' => '/path/to/db/file',

		// Optional paramaters
		'prefix' => 'tbl_', 	// Database table prefix
		'alias' => 'old' 		// Connection name for the Query function
	);

	$db = Query($params);

The parameters required depend on the database.

### Query function

You can use the `Query()` function as a reference to the last connected database. E.g.

	Query()->get('table_name');

or

	$result = Query()->query($sql);

If the `alias` key is set in the parameters, you can refer to a specific database connection

	// Set the alias in the connection parameters
	$params['alias'] = 'old';

	// Connect to the legacy database
	Query('old')->query($sql);

### Running Queries
Query uses the same interface as CodeIgniter's [Active Record class](http://ellislab.com/codeigniter/user-guide/database/active_record.html). However, it does not implement the `update_batch` or caching methods.

####You can also run queries manually.

To run a prepared statement, call
`$db->prepare_execute($sql, $params)`.

To run a plain query, `$db->query($sql)`

### Retrieving Results:

An example of a moderately complex query:

	$query = $db->select('id, key as k, val')
		->from('table t')
		->where('k >', 3)
		->or_where('id !=' 5)
		->order_by('val', 'DESC')
		->limit(3, 1)
		->get();

This will generate a query similar to (with this being the output for a Postgres database):

	SELECT "id", "key" AS "k", "val"
	FROM "table" "t"
	WHERE "k" > ?
	OR "id" != ?
	ORDER BY "val" DESC
	LIMIT 3 OFFSET 1


To retreive the results of a query, use the PDO method [fetch](http://php.net/manual/en/pdostatement.fetch.php) and/or [fetchAll](http://php.net/manual/en/pdostatement.fetchall.php).

	$query = $db->get('table_name');

	$results = $query->fetchAll(PDO::FETCH_ASSOC);


### Inserting / Updating

An example of an insert query:

	$query = $db->set('foo', 'bar')
		->set('foobar', 'baz')
		->where('foo !=', 'bar')
		->insert('table');

An example of an update query:

	$query = $db->set('foo', 'bar')
		->set('foobar', 'baz')
		->where('foo !=', 'bar')
		->update('table');

The `set` method can also take an array as a paramater, instead of setting individual values.

