PDO — это такой уровень абстракции, который лежит между php и драйверами базы данных. На сегодня php поддерживает почти все известные типы баз данных:
- DBLIB: FreeTDS / Microsoft SQL Server / Sybase.
- Firebird: Firebird/Interbase 6.
- IBM (IBM DB2).
- INFORMIX — IBM Informix Dynamic Server.
- MySQL: MySQL 3.x/5.x.
- OCI: Oracle Call Interface.
- ODBC: ODBC v.3 (IBM DB2 and unixODBC).
- PGSQL: PostgreSQL.
- SQLite: SQLite 2.x/3.x.
Чтобы посмотреть, какие драйвера поддерживаются, пишем так:
foreach(PDO::getAvailableDrivers() as $driver) { echo $driver.' '; }
Существует много различных баз данных. Многие популярные CMS (система управления контентом) используют MySQL. А что, если я хочу использовать SQLite? Нужно ли мне переписывать весь код CMS? Рассмотрим соединение с БД у разных баз данных:
//MySQL mysql_connect ($host, $user, $password); mysql_select_db ($db); //SQLite $dbh = sqlite_open($db, 0666); //PostgreSQL pg_connect ("host=$host dbname=$db user=$user password=$password");
А теперь это же соединение с использованием PDO:
//MySQL $conn = new PDO ("mysql:host=$host; dbname=$db, $user, $pass); //SQLite $conn = new PDO ("sqlite:$db"); //PostgreSQL $conn = new PDO ("pgsql:host=$host dbname=$db, $user, $pass");
Из примера видно, что разница только в строке соединения. И если мы хотим в своей CMS сделать поддержку нескольких баз данных — в единственном месте при помощи switch можем расписать строку соединения.
Для этого нам нужно знать строки соединения с различными базами данных:
//MySQL ("mysql:host=hostname; dbname=mysql", "username", "password"); //SQLite ("sqlite:/path/to/database.db") ("sqlite::memory:"); //т.е. хранится в памяти //PostgreSQL ("pgsql:dbname=pdo; host=hostname", "username", "password"); //Oracle ("OCI:dbname=mydatabase;charset=UTF-8", "username", "password"); //ODBC ("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\database.mdb;Uid=Admin"); //Firebird ("firebird:dbname=hostname:C:\path\to\database.fdb", "username", "password"); //Informix ("informix:DSN=InformixDB", "username", "password"); //DBLIB ("dblib:host=hostname:port;dbname=mydb","username","password");
Т.е. прописываем эти строки в конструкции switch — у нас поддержка нескольких баз данных. Но помимо строк соединения, нужно прописать еще некоторые элементы в swith.