This chapter shows how to use the factory and the instance as well as how to
execute some typical queries. For more details on how to perform queries using
the handlers we recommend reading the PHP PDO documentation.
In order to get started you need a database handler. The first example shows
how to create one using ezcDbFactory and how to store the handler in
ezcDbInstance so it can easily be retrieved later:
1. <?php
2.
3. $db = ezcDbFactory::create( 'mysql://user:password@host/database' );
4. ezcDbInstance::set( $db );
5.
6. // anywhere later in your program you can retrieve the db instance again using
7. $db = ezcDbInstance::get();
8.
9. ?>
Executing a simple query and get the result right away can be done with the
PDO::query() method:
1. <?php
2.
3. $db = ezcDbInstance::get();
4.
5. $rows = $db->query( 'SELECT * FROM quotes' );
6.
7. ?>
Next, we show a simple example with statements and the use of bind. Binding
values can be very valuable both in terms of efficiency and security. The main
difference with normal queries is that the bound value will be transfered to
the SQL server independently from the main query. See the chapter 'Avoiding SQL
injection' below.
1. <?php
2.
3. $db = ezcDbInstance::get();
4. $stmt = $db->prepare( 'SELECT * FROM quotes where author = :author' );
5. $stmt->bindValue( ':author', 'Robert Foster' );
6.
7. $stmt->execute();
8. $rows = $stmt->fetchAll();
9.
10. ?>
This chapter gives you a basic introduction on how to build queries using the
query abstraction layer.
We will start out with recreating the first query example:
1. <?php
2.
3. $db = ezcDbInstance::get();
4.
5. $q = $db->createSelectQuery();
6. $q->select( '*' )->from( 'quotes' );
7.
8. $stmt = $q->prepare();
9. $stmt->execute();
10.
11. ?>
As you can see, building the query itself follows the build up of a normal
query and is pretty straight forward. The rest of the example is a bit more
verbose, this is mainly due to the fact that you need to fetch the query object
from the handler and that you are required to use prepared statements with the
query abstraction layer. The factory methods in the handler to fetch the query
object ensures that you get a query of the correct type regardless of what
database you use.
The next example builds on the previous one, but builds a more complex query
and introduces the usage of bind parameters in the query:
1. <?php
2.
3. $db = ezcDbInstance::get();
4.
5. $q = $db->createSelectQuery();
6. $e = $q->expr; // fetch the expression object
7. $q->select( '*' )->from( 'quotes' )
8. ->where( $e->eq( 'author', $q->bindValue( 'Robert Foster' ) ) )
9. ->orderBy( 'quote' )
10. ->limit( 10, 0 );
11.
12. $stmt = $q->prepare();
13. $stmt->execute();
14.
15. ?>
The query will fetch the ten first quotes by Robert Foster sorted by the quote itself.
Note that string parameters must be either bound using
ezcQuery::bindParam()/ezcQueryBindValue() or escaped and quoted manually.
The final example shows that you in a similar way to the SELECT query can
insert, update and delete rows from a table using the query abstraction layer.
The final example shows how to create and use basic INSERT, UPDATE and DELETE
query objects.
1. <?php
2.
3. $db = ezcDbInstance::get();
4.
5. // Insert
6. $q = $db->createInsertQuery();
7. $q->insertInto( 'quotes' )
8. ->set( 'id', 1 )
9. ->set( 'name', $q->bindValue( 'Robert Foster' ) )
10. ->set( 'quote', $q->bindValue( "It doesn't look as if it's ever used!" ) );
11. $q->prepare();
12. $q->execute();
13.
14. // update
15. $q = $db->createUpdateQuery();
16. $q->update( 'quotes' )
17. ->set( 'quote', 'His skin is cold... Like plastic...' )
18. ->where( $q->expr->eq( 'id', 1 ) );
19. $q->prepare();
20. $q->execute();
21.
22. // delete
23. $q = $db->createDeleteQuery();
24. $q->deleteFrom( 'quotes' )
25. ->where( $q->expr->eq( $q->bindValue( 'Robert Foster' ) ) );
26. $q->prepare();
27. $q->execute();
28. ?>
SQL injection is possibly the biggest single cause of major security problems
in web applications. SQL injections are caused when building SQL statements and
parts of the statement is built up of untrusted data. If the untrusted data is
not escaped properly or checked for proper input you will have a possible SQL
injection problem.
With the introduction of bound values it is possible to avoid SQL injection
altogether. Simply always use bind to insert untrusted data into a query. This
is usually also more efficient since you don't need to escape the data and the
SQL server does not have to parse it as part of the query string.