Spread your database connections with PHP PDO
Less is more
PHP is one of the most commonly used scripting languages on the web - about 35 per cent of websites use PHP. Databases, meanwhile, are undergoing something of a renaissance thanks to web development.
Often one database is used during the development stage of a web application and another database is used in production - MySQL could be used for the former and Oracle for the latter. Reasons for this vary: it could be the availability of a particular database from the PHP web host our your own personal preference as a programmer.
MySQL, Oracle, IBM's DB2 UDB and Microsoft's SQL Server 2005 may be connected using the PHP extensions. Each of the PHP extensions is database specific, though, and the PHP functions used by the different extensions are quite different. Consider the application that uses MySQL in development and Oracle in production: in this scenario, the PHP application won't run on the Oracle database.
That's where the PHP Data Object extension steps in. PHP PDO provides an interface for connecting to many different databases using the same set of PHP functions. The advantage of the PDO extension is that it provides generic connectivity with RDBMS databases. Without the PHP PDO extension a different set of PHP functions would have to be used for the different databases.
In this article I shall explain the simplest way you can connect to a range of popular databases, tailored to developers, using the PHP PDO extension. I shall use MySQL 5.0 Community Server, IBM DB2 9 Trial Version and SQL Server 2005 Express Edition with Oracle's database 10g Standard Edition as I am Oracle certified associate, although Express Edition may be used just as well.
Before we get started, we need to install the PDO extension. PDO provides a data-access abstraction layer. The PHP 5 distribution is packaged with the PDO extension. Activate the PDO extension by adding the following extension directive to the
php.ini configuration file.
We also need to activate the database-specific PDO drivers in
php.ini. We shall use the PDO extension with the SQL Server 2005, MySQL, Oracle, and IBM's DB2 UDB databases.
extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_odbc.dll
The PDO ODBC driver is used to connect with the DB2 UDB database. The
ntwdblib.dll included with PHP 5 does not connect to SQL Server 2005 from a PHP. Obtain a newer
ntwdblib.dll from here and copy
C:/PHP directory. Restart the Apache2 server.
The PDO constructor is used to obtain a connection with a database. The data source name for the different databases-specific drivers is specified as a parameter to the PDO constructor. As you shall notice, only the connection parameters to obtain a connection with the database are different for each database. The procedure to create a table and retrieve data is the same for each of the databases and the same set of functions is used.
MySQL 5.0 Community Server
In a PHP script
createMySQLTable_PDO.php create a connection with the MySQL database using the PDO constructor and
mysql PDO driver. Specify the connection parameters for the MySQL database;
port as 3306 and
test. The connection may be set to be a persistent connection using the
$connection = new PDO('mysql:host=localhost;port=3306;dbname=test', $user, $password, array(PDO::ATTR_PERSISTENT => true));
Next, run SQL statements to create a MySQL database table using the
To create a MySQL table run the PHP script with the URL: http://localhost/createMySQLTable_PDO.php.
PDO is a very good thing
Not only does it help you with standard DB functions (connecting, queries, inserts, updates, etc.), it helps you develop quickly for multiple database systems.
I agree, the test case given in the article about using one DB in a test environment and another in production could have been stated another way. However, there are many companies the develop web applications for many clients, all of which use different DB systems. In order to get a good time-to-market implementation, you'll need a good DB abstraction layer. I've used Zend_Db in Zend's framework quite a bit. It's very efficient and easy to implement. http://framework.zend.com/manual/en/zend.db.html.
Need an ORM? Doctrine is a very good choice. http://www.phpdoctrine.org/
Not only that, IBM and Oracle have PDO built into their DB systems. IBM has built in connection pooling in their DB2v9 system that has been optimized for PHP. Oracle has done the same with their 11g DB.
Needless to say, PDO is a VERY good thing.
>> I find the suggestion that you would develop against one db and
>> deploy to another to be bizarre at the best. You'd have to be
>> insane to do it deliberately.
>> It might be less stupid if all you're doing is CRUD operations,
>> but if that's all you're doing, then why are you spending money >> on a high-end database product like Oracle?
Nicely put. I can see why sometimes it is necessary to make your application support multiple platforms, even if that limits you to the lowest common denominator. However portability requires that you develop (to a greater or less degree) for all the platforms you support. I don't see how you can just develop for one and expect the others to just work; no matter how good your abstraction layer is.
Even if you stick with one database...
The database isn't going to stick with you.
Yes, most SQL queries written for previous versions of MySQL will run on version 5, but the changes in the API ensure that your performance is going to really suck unless you rewrite the queries to the latest version.
And when you do rewrite the queries you will find that more or less of the "data rolling" needs to be done in the application level so it isn't just a matter of cutting and pasting SQL query text.
Ever do data replication between different versions of the same database server brand running on the same machine?
This is the kind of pain that is driving the stampede towards virtual servers.