PDO adalah singkatan dari PHP Data Objects. PDO adalah cara ramping yang konsisten untuk mengakses database. Ini berarti developer (pengembang) dapat menulis kode portabel jauh lebih mudah. PDO bukan lapisan abstraksi seperti PearDB. PDO adalah lebih seperti lapisan akses data yang menggunakan API (Application Programming Interface / Antarmuka Pemrograman Aplikasi) terpadu. Sehingga PDO yang dimaksudkan disini adalah sistem database dari php, dimana ada mysql dan mysqli.
- MySQLi extension (the “i” stands for improved)
- PDO (PHP Data Objects)
Should I Use MySQLi or PDO?
If you need a short answer, it would be “Whatever you like”.
Keduanya MySQLi atau PDO memiliki kelebihan masing-masing :
- PDO dapat bekerja pada 12 Sistem database yang berbeda-beda (Oracle, MySQL, PostgreSQL, SQLlite, MS SQL server, dll).
- MySQLi hanya dapat bekerja pada MySQL Databse.
Jika anda ingin mengganti proyek anda menggunakan database yang berbeda, maka PDO akan sangat berguna karena hanya perlu mengganti string koneksi dan beberapa query. Jika menggunakan MySQLi, anda perlu mengubah semua kodenya. Keduanya support dengan Prepared Statements. Prepared Statements memproteksi dari serangan SQL Injection, dan hal tersebut sangat penting untuk keamanan website.
Query tanpa buffer adalah 10-25 persen lebih cepat dibandingkan Query dengan buffer di MySQL untuk data kurang dari 10.000 dataset.Query tanpa buffer adalah 3-7 persen lebih lambat dibandingkan Query dengan buffer di MySQL untuk data lebih dari 10.000 dataset.
Query tanpa buffer adalah 0-5 persen lebih cepat dibandingkan Query dengan buffer di PDO.
PHP Non thread safe pada win32 adalah 50 persen lebih cepat dibandingkan Thread safe.
Ini contoh skrip testingnya
Tes skrip MySQL, MySQLi PDO
$table = 'test1.test2'; benchmark($table, 100); benchmark($table, 500); benchmark($table, 1000); benchmark($table, 5000); benchmark($table, 10000); benchmark($table, 50000); benchmark($table, 100000); function benchmark($table, $size) { mysql_connect('127.0.0.1', 'root', ''); mysql_query('drop table if exists '.$table); mysql_query("CREATE TABLE $table (id int(11) AUTO_INCREMENT, str1 varchar(255), str2 varchar(255), PRIMARY KEY (id)) ENGINE=INNODB"); mysql_query("begin"); for ($i=0; $i<$size; $i++) { mysql_query("insert into $table values(null, 'hello$i', 'world$i')"); } mysql_query("commit"); // warm up mysql cache $db = new PDO('mysql:host=127.0.0.1', 'root', ''); foreach ($db->query('select * from '.$table) as $vals) $test = $vals; $start = microtime(true); mysql_connect('127.0.0.1', 'root', ''); $result = mysql_query('select * from '.$table); while ($row = mysql_fetch_assoc($result)) $test = $row; echo $size.' mysql-buffered '.number_format(microtime(true)-$start, 5)."n"; $start = microtime(true); mysql_connect('127.0.0.1', 'root', ''); $result = mysql_unbuffered_query('select * from '.$table); while ($row = mysql_fetch_assoc($result)) $test = $row; echo $size.' mysql-unbuffered '.number_format(microtime(true)-$start, 5)."n"; $start = microtime(true); $db = mysqli_connect('127.0.0.1', 'root', ''); foreach (mysqli_query($db, 'select * from '.$table) as $row) $test = $row; echo $size.' mysqli-buffered '.number_format(microtime(true)-$start, 5)."n"; $start = microtime(true); $db = mysqli_connect('127.0.0.1', 'root', ''); foreach (mysqli_query($db, 'select * from '.$table, MYSQLI_USE_RESULT) as $row) $test = $row; echo $size.' mysqli-unbuffered '.number_format(microtime(true)-$start, 5)."n"; $start = microtime(true); $db = new PDO('mysql:host=127.0.0.1', 'root', ''); foreach ($db->query('select * from '.$table) as $vals) $test = $vals; echo $size.' pdo-buffered '.number_format(microtime(true)-$start, 5)."n"; $start = microtime(true); $db = new PDO('mysql:host=127.0.0.1', 'root', '', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false)); foreach ($db->query('select * from '.$table) as $vals) $test = $vals; echo $size.' pdo-unbuffered '.number_format(microtime(true)-$start, 5)."n"; }
Pengujian dilakukan dengan PHP 5.3.10, MySQL 5.5.29, Kernel 3.2.0, 64bit, 3.4GHz (QEMU), Skor nilai dalam hitungan detik.
Cara menghubungkan PHP ke database adalah hal yang dasar wajib diketahui. Cara sederhana koneksi database tanpa bantuan Framework tetap harus diketahui oleh programmer terutama yang masih belajar.
Pada bahasa pemrograman PHP ada 3 fungsi yang umum digunakan dalam koneksi ke database, yaitu: mysql_query, mysqli_query, dan PDO class.
Fungsi mysql (tanpa akhiran i) merupakan fungsi yang telah lama ada dan akan ditinggalkan pada versi PHP terbaru. Sebaiknya hindari menggunakan fungsi ini.
Hindari menggunakan extension mysql karena akan ditinggalkan, gunakan extension mysqli yang lebih baru
Fungsi mysqli merupakan extension yang lebih baru, huruf i di akhir extension tersebut adalah singkatan dari Improved. Lebih baik dari extension sebelum nya.
PDO (PHP Data Object) merupakan extension yang memberikan abstraction layer dalam mengakses database. PDO tidak terikat ke satu DBMS seperti mysql, untuk terhubung ke database ia membutuhkan PDO Driver tersendiri, hal ini memungkinkan aplikasi yang menggunakan PDO dapat dengan mudah untuk berganti database tanpa perlu melakukan banyak perubahan.
Koneksi Database dengan MySQLi
Koneksi ke database dengan extension mysqli adalah cara yang paling mudah dan sederhana karena penulisan syntax nya bisa menggunakan gaya prosedural maupun OOP. Pada artikel ini contoh mysqli akan menggunakan gaya prosedural.
Secara umum langkah langkah dalam koneksi ke database adalah:
- Membuat koneksi ke database
- Mengirimkan query yang kemudian akan didapat respon berupa “mysql result”
- Mengambil hasil dari “mysql result” yang didapat
Untuk melakukan query dan mendapatkan result nya anda hanya perlu beberapa baris kode saja seperti dibawah ini:
/* Membuat Koneksi Ke Database */ $link = mysqli_connect( "$db_host", "$db_user", "$db_password", "$database_name" ); /** Melakukan Query */ $result = mysqli_query( $link, "SELECT * FROM nama_tabel" ); /* Mengambil hasilnya dalam bentuk associative array */ $row = mysqli_fetch_assoc( $result ); print_r( $row );Tentu kode diatas sangat sederhana, implementasinya nanti anda perlu menambahkan paling tidak error handling pada kode tersebut. Dengan adanya error handling kita mencegah kesalahan yang terjadi pada mysql agar tidak menjalar ke yang lain. contoh sederhana nya adalah menampilkan pesan error jika tidak dapat melakukan koneksi ke mysql.
Bila aplikasi memiliki beberapa file, buatlah satu file yang berisi konfigurasi & koneksi ke database yang nantinya di-include ke setiap file yang menjalankan query.
Kode lengkap kurang lebih seperti dibawah ini:
/** * File database.php */ /* Define variable agar lebih mudah */ $db_host = 'localhost'; $db_user = 'root'; $db_password = ''; $db_name = 'database'; /* Membuat koneksi ke database */ $link = mysqli_connect( "$db_host", "$db_user", "$db_password", "$db_name" ); /* Pastikan koneksi berhasil */ if ( mysqli_connect_errno() ) { printf( "Tidak dapat terhubung ke database: %s\n", mysqli_connect_error() ); exit(); }/** * di bagian aplikasi (contoh: index.php) */ /* include file database */ require_once ('database.php'); /* Melakukan Query */ $result = mysqli_query( $link, "SELECT * FROM nama_tabel" ); /* Ambil hasilnya Bila Berhasil */ if ( $result ) { $row = mysqli_fetch_assoc( $result ); print_r( $row ); // Tampilkan } else { // Bila query gagal tampilkan pesan kesalahan echo mysqli_error( $link ); }Koneksi Database dengan PDO
PDO menggunakan gaya syntax OOP (object oriented), aktifkan opsi ERRMODE_EXCEPTION agar ketika terdapat error si PDO melemparkan exception yang dapat di tangkap pada class yang anda gunakan. Try & Catch digunakan untuk menangkap error tersebut.
<?php $db_host = 'localhost'; $db_user = 'root'; $db_password = ''; $db_name = 'nama_tabel'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Throw Exception saat error PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // Return array associaive ]; /* DSN = Data Source Name */ $dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8mb4"; try { $pdo = new PDO($dsn, $db_user, $db_password, $options); $result = $pdo->query('SELECT * FROM nama_tabel' ); print_r( $result->fetchAll() ); } catch( PDOException $e ) { echo $e->getMessage(); }Prepared Statement
Dengan menggunakan Prepared Statement penulisan query jadi seperti menggunakan template. Anda dapat menggunakan query yang sama berulang kali namun dengan parameter yang berbeda. Extension mysqli juga sudah mendukung penggunaan prepared statement.
Prepared statement juga (katanya) lebih aman dari serangan sql injection, namun saya rasa semua itu kembali ke bagaimana cara kita menghandle user inputs. Dengan prepared statement anda tidak perlu memberikan tanda petik ke setiap value pada query karena driver pdo akan melakukan itu semua. contoh kode nya seperti dibawah ini: