Aura SQL
The Aura SQL package provides connections to connect to and query against SQL data sources such as MySQL, PostgreSQL, and Sqlite. The connections are mostly wrappers around PDO connections.
This package is compliant with PSR-0, PSR-1, and PSR-2. If you notice compliance oversights, please send a patch via pull request.
Getting Started
Instantiation
The easiest way to get started is to use the scripts/instance.php
script to
get a ConnectionFactory
and create your connection through it:
Alternatively, you can add '/path/to/Aura.Sql/src'
to your autoloader and
build an connection factory manually:
Aura SQL comes with four connection adapters: 'mysql'
for MySQL, 'pgsql'
for PostgreSQL, 'sqlite'
for SQLite3, and 'sqlsrv'
for Microsoft SQL
Server.
Connecting
The connection will lazy-connect to the database the first time you issue a query of any sort. This means you can create the connection object, and if you never issue a query, it will never connect to the database.
You can connect manually by issuing connect()
:
Fetching Results
Once you have a connection, you can begin to fetch results from the database.
You can fetch results using these methods:
-
fetchAll()
returns a sequential array of all rows. The rows themselves are associative arrays where the keys are the column names. -
fetchAssoc()
returns an associative array of all rows where the key is the first column. -
fetchCol()
returns a sequential array of all values in the first column. -
fetchOne()
returns the first row as an associative array where the keys are the column names. -
fetchPairs()
returns an associative array where each key is the first column and each value is the second column. -
fetchValue()
returns the value of the first row in the first column.
Preventing SQL Injection
Usually you will need to incorporate user-provided data into the query. This means you should quote all values interpolated into the query text as a security measure to prevent SQL injection.
Although Aura SQL provides quoting methods, you should instead use value binding into prepared statements. To do so, put named placeholders in the query text, then pass an array of values to bind to the placeholders:
Aura SQL recognizes array values and quotes them as comma-separated lists:
Modifying Rows
Aura SQL comes with three convenience methods for modifying data: insert()
,
update()
, and delete()
. You can also retrieve the last inserted ID using
lastInsertId()
.
First, to insert a row:
(N.b.: Because of the way PostgreSQL creates auto-incremented columns, the
pgsql
adapter needs to know the table and column name to get the last
inserted ID; for example, $id = $connection->lastInsertId($table, 'id');
.)
Next, to update rows:
(N.b.: Both
$cols
and$bind
are bound into the update query, but$cols
takes precedence. Be sure that the keys in$cols
and$bind
do not conflict.)
Finally, to delete rows:
Retrieving Table Information
To get a list of tables in the database, issue fetchTableList()
:
To get information about the columns in a table, issue fetchTableCols()
:
Each column description is a Column
object with the following properties:
-
name
: (string) The column name -
type
: (string) The column data type. Data types are as reported by the database. -
size
: (int) The column size. -
scale
: (int) The number of decimal places for the column, if any. -
notnull
: (bool) Is the column marked asNOT NULL
? -
default
: (mixed) The default value for the column. Note that sometimes this will benull
if the underlying database is going to set a timestamp automatically. -
autoinc
: (bool) Is the column auto-incremented? -
primary
: (bool) Is the column part of the primary key?
Transactions
Aura SQL connections always start in autocommit mode (the same as PDO). However,
you can turn off autocommit mode and start a transaction with
beginTransaction()
, then either commit()
or rollBack()
the transaction.
Commits and rollbacks cause the connection to go back into autocommit mode.
Manual Queries
You can, of course, build and issue your own queries by hand. Use the
query()
method to do so:
The returned $stmt
is a PDOStatement that you
may manipulate as you wish.
Profiling
You can use profiling to see how well your queries are performing.
Each profile object has these properties:
-
text
: (string) The text of the query. -
time
: (float) The time, in seconds, for the query to finish. -
data
: (array) Any data bound to the query. -
trace
: (array) A debug_backtrace so you can tell where the query came from.
Query Objects
Aura SQL provides four types of query objects so you can write your SQL queries in an object-oriented way.
Select
To get a new Select
object, invoke the newSelect()
method on an connection.
You can then modify the Select
object and pass it to the query()
or
fetch*()
method.
The Select
object has these methods and more; please read the source code
for more information.
-
distinct()
: Set totrue
for aSELECT DISTINCT
. -
cols()
: Select these columns. -
from()
: Select from these tables. -
join()
: Join these tables on specified conditions. -
where()
:WHERE
these conditions are met (usingAND
). -
orWhere()
:WHERE
these conditions are met (usingOR
). -
groupBy()
:GROUP BY
these columns. -
having()
:HAVING
these conditions met (usingAND
). -
orHaving()
:HAVING
these conditions met (usingOR
). -
orderBy()
:ORDER BY
these columns. -
limit()
:LIMIT
to this many rows. -
offset()
:OFFSET
by this many rows. -
union()
:UNION
with a followupSELECT
. -
unionAll()
:UNION ALL
with a followupSELECT
.
Insert
To get a new Insert
object, invoke the newInsert()
method on an connection.
You can then modify the Insert
object and pass it to the query()
method.
Update
To get a new Update
object, invoke the newUpdate()
method on an connection.
You can then modify the Update
object and pass it to the query()
method.
Delete
To get a new Delete
object, invoke the newDelete()
method on an connection.
You can then modify the Delete
object and pass it to the query()
method.