WeberDev.com PHP and MySQL Code

LOG IN
BEGINNER GUIDES  |  PHP CLASSES  |  CODE SEARCH  |  ARTICLES SEARCH  |  PHP FORUMS  |  PHP MANUAL  |  PHP FUNCTIONS LIST  |  WEB SITE TEMPLATES
Start typing to search for PHP and MySQL Code Snippets and Articles Search
Submit a code Example / Snippet Submit Your Code
Search Engine Optimization Monitor SEO Monitor
Web Site UpTime Monitor UpTime Monitor
WeberDev's Monthly code contest PHP Code Contest
Your Personal Examples List My Favorite Examples
Your Personal Articles List My Favorite Articles
Edit Account Info Update Your Profile
PHP Code Search
Web Development Forums
Learn MySQL Playing Trivia
PHPBB2 Templates
Web Development Index
PHP Web Logs (BLogs)
Web Development Resources
Web Development Content
PHPClasses
PHP Editor
PHP Jobs
Vision.To Design
Ajax Tutorials
PHP Programming Help
PHP/MySQL Programming
Webmaster Resources
Webmaster Forum
XML meta language
website builder
Submit Site
Forex Trading Online forex trading platform

Go Back Add a Comment Send this example to a friend Add this Article to your personal favoritest for easy future access to your favorite Code Examples and Articles. Submit a code example Print this code example.
BACK ADD A COMMENT SEND TO A FRIEND ADD TO MY FAVORITES ADD CODE EXAMPLES PRINT
Title : Writing Portable MySQL Code in PHP: Porting to Oracle, Microsoft SQL Server, Sybase, Interbase, PostgreSQL and other databases using ADODB class library.
Categories : MySQL, PHP, PHP Classes, ODBC, General SQL Update Picture
John Lim
Date : Dec 17th 2000
Grade : 3 of 5 (graded 6 times)
Viewed : 15420
File : No file for this code example.
Images : No Images for this code example.
Search : More code by John Lim
Action : Grade This Code Example
Tools : My Examples List

  Submit your own code examples 
 

Latest version of this article is always at http://php.weblogs.com/adodb_tutorial

You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !

You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !

I love this song, especially the version with Louis Armstrong and Ella singing duet. It is all
about how hard it is for two people in love to be compatible with each other. It's about
compromise and finding a common ground, and that's what this article is all about.

PHP is all about creating dynamic web-sites with the least fuss and the most fun. To create
these websites we need to use databases to retrieve login information, to splash dynamic
news onto the web page and store forum postings. So let's say we were using the popular
MySQL database for this. Your company has done such a fantastic job that the Web site is
more popular than your wildest dreams. You find that MySQL cannot scale to handle the
workload; time to switch databases.

Unfortunately in PHP every database is accessed slightly differently. To connect to MySQL, you
would use mysql_connect(); when you decide to upgrade to Oracle or Microsoft SQL Server,
you would use ocilogon() or mssql_connect() respectively. What is worse is that the
parameters you use for the different connect functions are different also.. One database says
po-tato, the other database says pota-to. Oh-oh.

Let's NOT call the whole thing off
A database wrapper library such as ADODB comes in handy when you need to ensure
portability. It provides you with a common API to communicate with any supported database
so you don't have to call things off.


ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes not very
original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase, Microsoft SQL
Server, Access, FoxPro, Sybase, ODBC and ADO. You can download ADODB from
http://php.weblogs.com/adodb.

MySQL Example
The most common database used with PHP is MySQL, so I guess you should be familiar with
the following code. It connects to a MySQL server at localhost, database mydb, and executes
an SQL select statement. The results are printed, one line per row.

$db = mysql_connect("localhost", "root", "password");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($result === false) die("failed");
while ($fields = mysql_fetch_row($result)) {
for ($i=0, $max=sizeof($fields); $i < $max; $i++) {
print $fields[$i].' ';
}
print "<br>\n";
}

The above code has been color-coded by section. The first section is the connection phase.
The second is the execution of the SQL, and the last section is displaying the fields. The while
loop scans the rows of the result, while the for loop scans the fields in one row.

Here is the equivalent code in ADODB

include("adodb.inc.php");
ADOLoadCode('mysql');
$db = NewADOConnection();
$db->Connect("localhost", "root", "password", "mydb");
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result->fields[$i].' ';
$result->MoveNext();
print "<br>\n";
}

Now porting to Oracle is as simple as changing the second line to ADOLoadCode('oracle').
Let's walk through the code...

Connecting to the Database

include("adodb.inc.php");
ADOLoadCode('mysql');
$db = NewADOConnection();
$db->Connect("localhost", "root", "password", "mydb");
The connection code is a bit more sophisticated than MySQL's because our needs are more
sophisticated. In ADODB, we use an object-oriented approach to managing the complexity of
handling multiple databases. We have different classes to handle different databases. If you
aren't familiar with object-oriented programing, don't worry -- the complexity is all hidden
away in the NewADOConnection() function.

To conserve memory, we only load the PHP code specific to the database you are connecting
to. We do this by calling ADOLoadCode(databasedriver). Legal database drivers include
mysql, mssql, oracle, oci8, postgres, sybase, vfp, access, ibase and many others.

Then we create a new instance of the connection class by calling NewADOConnection(). Finally
we connect to the database using $db->Connect().

Executing the SQL
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");


Sending the SQL statement to the server is straight forward. Execute() will return a recordset
object on successful execution. You should check $result as we do above.

An issue that confuses beginners is the fact that we have two types of objects in ADODB, the
connection object and the recordset object. When do we use each?

The connection object ($db) is responsible for connecting to the database, formatting your
SQL and querying the database server. The recordset object ($result) is responsible for
retrieving the results and formatting the reply as text or as an array.

The only thing I need to add is that ADODB provides several helper functions for making
INSERT and UPDATE statements easier, which we will cover in the Advanced section.

Retrieving the Data

while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result->fields[$i].' ';
$result->MoveNext();
print "<br>\n";
}
The paradigm for getting the data is that it's like reading a file. For every line, we check first
whether we have reached the end-of-file (EOF). While not end-of-file, loop through each field
in the row. Then move to the next line (MoveNext) and repeat.

The $result->fields[] array is generated by the PHP database extension. Some database
extensions do not index the array by field name (unlike MySQL). To guarantee portability, use
$result->Fields($fieldname). Note that this is a function, not an array.

Other Useful Functions
$recordset->Move($pos) scrolls to that particular row. ADODB supports forward scrolling for all
databases. Some databases will not support backwards scrolling. This is normally not a
problem as you can always cache records to simulate backwards scrolling.

$recordset->RecordCount() returns the number of records accessed by the SQL statement.
Some databases will return -1 because it is not supported.

$recordset->GetArray() returns the result as an array.

rs2html($recordset) is a function that is generates a HTML table based on the $recordset
passed to it. An example with the relevant lines in bold:

include('adodb.inc.php');
include('tohtml.inc.php'); /* includes the rs2html function */
ADOLoadCode('mysql');
$conn = &ADONewConnection();
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->Execute('select * from table');
rs2html($rs); /* recordset to html table */
There are many other helper functions that are listed in the documentation.

Advanced Material
Inserts and Updates
Let's say you want to insert the following data into a database.

ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off

When you move to another database, your insert might no longer work.

The first problem is that each database has a different default date format. MySQL expects
YYYY-MM-DD format, while other databases have different defaults. ADODB has a function
called DBDate() that addresses this issue by converting converting the date to the correct
format.

The next problem is that the don't in the Note needs to be quoted. In MySQL, we use don\'t
but in some other databases (Sybase, Access, Microsoft SQL Server) we use don''t. The qstr()
function addresses this issue.

So how do we use the functions? Like this:

$sql = "INSERT INTO table (id, thedate,note) values ("
. $ID . ','
. $db->DBDate($TheDate) .','
. $db->qstr($Note).")";
$db->Execute($sql);
ADODB also supports $recordset->Affected_Rows() (returns the number of rows affected by
last update or delete) and $recordset->Insert_ID() (returns last autoincrement number
generated by an insert statement). Be forewarned that not all databases support the two
functions.


MetaTypes
You can find out more information about each of the fields (I use the words fields and columns
interchangebly) you are selecting by calling the recordset method FetchField($fieldoffset). This
will return an object with 3 properties: name, type and max_length.

For example:
$recordset = $conn->Execute("select adate from table");$f0 = $recordset->FetchField(0);

Then $f0->name will hold 'adata', $f0->type will be set to 'date'. If the max_length is
unknown, it will be set to -1.

One problem with handling different databases is that each database often calls the same
type by a different name. For example a timestamp type is called datetime in one database
and time in another. So ADODB has a special MetaType($type, $max_length) function that
standardises the types to the following:

C: character type
B: blob or long character type (eg. more than 255 bytes wide).
D: date
T: timestamp
L: logical (boolean)
N: numeric (float, double, integer)

In the above date example,

$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
$type = $recordset->MetaType($f0->type, $f0->max_length);
print $type; /* should print 'D' */


PHP4 Session Handler Support

ADODB also supports PHP4 session handlers. You can store your session variables in a
database for true scalability using ADODB. For further information, visit
http://php.weblogs.com/adodb-sessions

Commercial Use Encouraged
If you plan to write commercial PHP applications that you want to resell, you should consider
ADODB. It has been released using the lesser GPL, which means you can legally include it in
commercial applications, while keeping your code proprietary. Commercial use of ADODB is
strongly encouraged! We are using it internally for this reason.


Conclusion
As a thank you for finishing this article, here are the complete lyrics for let's call the whole
thing off.



Refrain

You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !

You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !

But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.

So, if you like pajamas and I like pa-jah-mas,
I'll wear pajamas and give up pa-jah-mas.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !

Second Refrain

You say laughter and I say lawfter,
You say after and I say awfter;
Laughter, lawfter, after, awfter -
Let's call the whole thing off !

You like vanilla and I like vanella,
You, sa's'parilla and I sa's'parella;
Vanilla, vanella, choc'late, strawb'ry -
Let's call the whole thing off !

But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.

So, if you go for oysters and I go for ersters,
I'll order oysters and cancel the ersters.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !




ADODB Database Wrapper Abstraction Library for PHP: MySQL, MSSQL, Oracle, Interbase,ODBC, Microsoft Access and FoxPro.
Categories : PHP Classes, Databases, PHP, General SQL, ODBC
Point and Click Interface ala MS Access for creating SQL statements.
Categories : MySQL, Complete Programs, General SQL, PHP, Databases
Powerful php/mysql Pagination for up to 6 URL Params
Categories : PHP, PHP Classes, Databases, MySQL, Navigation
Password reminder
Categories : PHP, PHP Classes, Databases, MySQL, Mail
MySQL Class to ease Database connectivity
Categories : MySQL, PHP Classes, Databases, PHP
UDMSearch - a free search engine, indexing system.
Categories : Search Engines, Linux, PHP, MySQL, ODBC
usercounter class
Categories : PHP, PHP Classes, Databases, MySQL, Environment Variables
MySQL Handler
Categories : PHP, Databases, MySQL, Classes and Objects, PHP Classes
PostGreSQL and MySQL 2 in 1 db Manager
Categories : PHP, PHP Classes, Databases, PostgreSQL, MySQL
This function will populate the options in a drop down HTML select list in a form from a database query.
Categories : MySQL, General SQL, PHP, HTML and PHP, Databases
I`d like to use the mysql_fetch_row function along with a "randomizer" function that would give me a random result from a mySQL table.
Categories : General SQL, MySQL, PHP, Databases
Simple Mini Poll class library (SimPoll)
Categories : PHP, PHP Classes, Databases, MySQL, Complete Programs
Online Automatic Class Generator for MySQL Tables
Categories : PHP, PHP Classes, Classes and Objects, Databases, MySQL
Specify your connection settings and create a link to a MySQL database.
Categories : PHP, PHP Classes, Databases, MySQL, Beginner Guides
phpEasySQL - Easily connect to your MySQL database with just 1 php file and 3 easy steps!
Categories : Databases, PHP, MySQL, General SQL
 Ian Anderson wrote : 597
An absolutely first-rate article, explaining the intricacies of ADODB with MySQL. My first foray into server-side coding was ASP and Access DBs, but using ADODB.inc.php and, of course, PHP provides a whole new paradigm of server-side coding. Wonderful.

Thank you from a PHP-convert.
Bod.
www.siteguru.co.uk
 
 Mike D wrote : 670
WOOHOO!!! well said above.... 
this is good stuff.....
I LOVE IT!!!!!!!!!!!!!!!!!!
 
 Harish Srivastava wrote : 747
This is good. Thanks a lot.
 
 John Lim wrote :1233
The download url has changed to http://adodb.sourceforge.net/