MySQLi vs PDO

Seperti semua sedia maklum, versi PHP terkini adalah 5.5.7. Antara isu yang dibangkitkan oleh segelintir programmer adalah fungsi mysql_* yang telah dideprecated mulai PHP 5.5.0. Jadi walaupun kita masih menggunakan server yang menggunakan versi PHP sebelum 5.5.0, adalah disarankan agar kita menukar fungsi mysql_* kita kepada fungsi MySQLi atau PDO.

Kedua-dua fungsi ini mempunyai persamaan dan perbezaan yang tidak terlalu ketara. Dengan adanya fungsi-fungsi ini, konsep prepared statements, multiple statements dan transactions dapat digunakan dengan lebih mudah dan berkesan. Selain itu, pada fungsi mysql_*, fungsi mysql_real_escape_string dan concatenating biasanya ditentukan oleh programmer itu sendiri. Ini adalah amat berbahaya kepada sistem yang hendak dibangunkan kerana mudah terdedah kepada SQL Injection.


MySQLi

MySQLi Extension (mysql improved) membolehkan kita mengakses fungsi yang terdapat pada MySQL versi 4.1.13 ke atas. MySQLi adalah versi yang lebih baik berbanding MySQL sebelumnya. Terdapat banyak fungsi baru yang ada boleh kita gunakan.

MySQLi biasanya menggunakan OOP (Object-Oriented Programming) tetapi kita masih boleh menggunakan procedural programming.

Contoh OOP dalam MySQLi:

$conn = new mysqli(“localhost”, “root”, “”, “database”);
if ($conn->connect_error) {
die(‘Database connection failed: ‘.$conn->connect_error, E_USER_ERROR);
}

Contoh Procedural API:

$conn = mysqli_connect(“localhost”, “root”, “”, “database”);
if (mysqli_connect_errno()) {
die(‘Database connection failed: ‘.mysqli_connect_error(), E_USER_ERROR);
}

Sumber:
+ W3Schools
+ Pontikis.net


PDO

Selain MySQLi, PDO (PHP Data Object) juga adalah satu lagi pilihan yang adalah untuk berinteraksi dengan MySQL. Berbanding dengan MySQLi, PDO hanya ditulis menggunakan OOP. Kod-kod yang ditulis menggunakan PDO biasanya lebih selamat dan kemas.

Berbeza dengan MySQLi yang hanya boleh berinterasi dengan MySQL, PDO boleh berinteraksi dengan banya database. Selain daripada MySQL, PDO boleh berinteraksi dengan IBM, Informix, ODBC, PostgreSQL, SQLite, Oracle dan sebagainya.

PDO juga mempunyai banyak kaedah error handling. Dalam PDO, exception mode membolehkan anda mengetahui ralat (error) dengan lebih konsisten dan ini membantu anda untuk menangani isu-isu tadi dengan lebih cepat dan mudah.

Contoh PDO:

$conn = new PDO(‘mysql:host=localhost;dbname=database;charset=utf8’, ‘root’, ”);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Sumber:
+ HashPHP.Org
+ TutPlus.Com


Apakah Prepared Statements dan Kenapa Ia Penting?

Prepared statements adalah fungsi yang lazim digunakan pada MySQLi dan PDO. Andaikan kita mempunyai satu string yang mempunyai simbol ‘ (single quote). Cthnya, “Pak Mat’s House”. Di dalam MySQL, kita perlu menggunakan fungsi real_escape_string(). Tetapi menggunakan MySQLi atau PDO, kita hanya perlu gunakan fungsi prepare(). Kebiasannya, melalui fungsi ini sql statement datatype akan ditentukan melalui fungsi bind_param (MySQLi) atau bindParam (PDO) sebelum di proses (melalui fungsi excute()).

Contoh MySQLi:

$sql = ‘SELECT field FROM table WHERE field = ? ‘;
$data = ‘Pak Mat’ House’;
$stmt = $conn->prepare($sql);
/* Bind parameters. TYpes: s = string, i = integer, d = double,  b = blob */
$stmt->bind_param(‘s’,$data);
$stmt->execute();

Contoh PDO:

$sql = ‘SELECT field FROM table WHERE field = :field’;
$data = ‘Pak Mat’ House’;
$stmt = $conn->prepare($sql);
$stmt->bindParam(‘:field’, $data, PDO::PARAM_STR);
$stmt->execute();

Jadi kita perhatikan disini, user input akan difilter terlebih dahulu sebelum diproses. Ini akan menjadikan query kita lebih selamat. Fungsi di atas juga amat efektif (performance increase) sekiranya kita membuat sql statement berulang-ulang kali.

Kedua-duanya mempunyai kelebihan dan kekurangan sendiri. Ada juga pertanyaan manakah yang lebih bagus. Saya menjawab bergantung kepada citarasa masing-masing yang mana lebih anda suka :). Tapi sekiranya ada kemungkinan aplikasi itu menggunakan multiple database (cth MySQL, Oracle, IBM), jadi PDO adalah pilihan paling tepat. Saya sendiri menyarankan menggunakan PDO meskipun anda hanya menggunakan MySQL.