Cara menggunakan pdo vs mysqli 2022

Kedua jenis style pemrograman mysqli ini menggunakan nama fungsi dan method yang kurang lebih sama. Sebagai contoh, di dalam procedural stylemysqli, terdapat fungsi mysqli_query(),sedangkan dalam OOP style mysqli, kita menggunakan method $mysqli->query(). Kita akan membahas lebih dalam tentang cara penggunaan 2 style ini.

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:

  1. Membuat koneksi ke database
  2. Mengirimkan query yang kemudian akan didapat respon berupa “mysql result”
  3. 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:

Apa perbedaan penggunaan MySQLi dan PDO?

PDO menggunakan pemrograman objek, mysqli extension tersedia dalam bentuk objek dan prosedural (diakses melalui fungsi-fungsi) sedangkan mysql extension sepenuhnya menggunakan pemograman prosedural.

Mengapa menggunakan PDO?

PDO bertujuan untuk membuat satu buah interface yang seragam untuk koneksi ke beragam jenis database. Ketika Anda menggunakan database yang didukung oleh PDO seperti misalnya MySQL, Oracle, MS.

Apa bedanya MySQL sama MySQLi?

Perbedaan MySQL dan MySQLi adalah tipe dukungan yang disediakan. Jika MySQL hanya mendukung MySQL server sampai di versi 4.1.3, MySQLi dapat dipakai sampai dengan versi paling baru. Fiturnya pun lebih banyak bisa dipakai ketika menggunakan MySQLi dibandingkan menggunakan MySQL.

Apa yang dimaksud dengan PDO?

"PDO - PHP Data Objects - adalah lapisan akses database yang menyediakan metode akses yang seragam ke beberapa database." Ini tidak memperhitungkan sintaks database-spesifik, namun memungkinkan proses peralihan database dan platform menjadi lebih mudah, cukup dengan mengganti string koneksi dalam banyak instance.