Welcome

Welcome, thanks to look my blog

Tuesday 29 July 2014

PHP MySQL Connectivity

PHP MySQL Connectivity


Ada beberapa metode untuk melakukan koneksi ke MySQL melalui PHP yaitu menggunakan
  • MySQL
  • MySQLi
  • PHP Data Object (PDO)

Karena alasan keamanan pada MySQL extension, maka sebaiknya jika ingin melakukan koneksi ke MySQL dari PHP maka disarankan untuk menggunakan PDO atau MySQLi kalau MySQL yang digunakan adalah versi 4.1.3 dan yang lebih tinggi.

MySQL Extension

extension ini adalah extension yang disediakan oleh PHP yang memeberikan akses kepada para programmer PHP untuk menciptakan aplikasi yang memerlukan dukungan database MySQL yang lebih lama dari versi 4.1.3.
Pada extension ini semua fungsi yang digunakan adalah fungsi-fungsi yang berdiri sendiri. Untuk lebih jelasnya kita akan melihat contoh berikut untuk menampilkan semua nama depan dan nama belakang dari tabel userdetails yang telah kita buat sebelumnya..

<?php
// buat koneksi ke MySQL
$conn = mysql_connect(‘localhost’, ‘user’, ‘password’);
if(!$conn) {
die(‘Gagal melakukan koneksi ke MySQL: ‘ . mysql_error());
}
// memilih database
//fungsi yang sama seperti perintah USE pada MySQL
$database = mysql_select_db(‘pemrograman’);
if(!$database) {
die(‘database tidak ditemukan: ‘ . mysql_error());
}
//mencoba melakukan query
$sql = “SELECT nama_depan, nama_belakang FROM userdetails”;
$hasil = mysql_query($sql);
// lakukan perulangan untuk menampilkan semua hasil dari query di atas
while($row = mysql_fetch_array($hasil)) {
echo “Nama : “. $row['nama_depan'].” “.$row['nama_belakang'];
}
//kosongkan memori yang digunakan untuk menampung hasil query
mysql_free_result($hasil);
//tutup koneksi
mysql_close($conn);
?>

ketika kita menyimpan file tersebut dengan nama mysqltest.php dan memanggilnya dari browser ke alamat http://localhost/mysqltest.php maka kita akan ditampilkan seluruh data nama depan dan nama belakang yang tersimpan pada tabel userdetails.
Tampilan untuk mysqltest.php adalah sebagai berikut
Gambar x.

Penjelasan Kode

Pada Latihan di atas, pertama sekali kita akan membuat koneksi ke database yang berada pada localhost dengan username user dan password-nya adalah password menggunakan perintah
$conn = mysql_connect(‘localhost’, ‘user’, ‘password’);
if(!$conn) {
die(‘Gagal melakukan koneksi ke MySQL: ‘ . mysql_error());
}
pada perintah di atas setelah koneksi dibuat, kita akan menguji koneksi tersebut menggunakan percabangan if untuk melihat apakah fungsi melakukan koneksi berhasil atau tidak. Jika username kita ganti menjadi sebuah username lain yang tidak ada datanya pada mysql server, misalnya user1 maka ketika halaman ini dipanggil akan ditampilkan error seperti pada gambar x.
gambar x.
kemudian kita akan memilih database sebagai tempat kita menerapkan semua perintah sql yang nantinya akan dilakukan dengan perintah
$database = mysql_select_db(‘pemrograman’);
if(!$database) {
die(‘database tidak ditemukan: ‘ . mysql_error());
}
Jika argumen yang digunakan pada perintah di atas, diganti menjadi sebuah nama database yang tidak ada pada mysql server, misalnya toko, yang kebetulan pada mysql server yang digunakan pada pembuatan buku ini tidak memiliki database dengan nama toko. Untuk melakukan pengucian ini kembali kita menggunakan if seperti yang dapat kita lihat pada contoh di atas.Maka tampilannya ketika dipanggil halaman tersebut akan menjadi seperti pada gambar x.
Gambar x.
kemudian kita akan membuat sebuah query yang berfungsi untuk menampilkan seluruh nama depan dan nama belakang yang ada pada tabel userdetails.
$sql = “SELECT nama_depan, nama_belakang FROM userdetails”;
Perintah sql ini kemudian akan dieksekusi menggunakan fungsi mysql_query() seperti berikut ini dan hasildari perintah ini akan disimpan pada variabel $hasil.
$rhasil = mysql_query($sql);
Hasil dari fungsi mysql_query() akan dibaca satu per satu menggunakan perulangan while seperti pada kode berikut ini
while($row = mysql_fetch_array($result)) {
echo “Nama : “. $row['nama_depan'].” “.$row['nama_belakang'];
}
Dua perintah berikutnya pada kode di atas adalah untuk mengosongkan memori menggunakan fungsi mysql_free_result() dan menutup koneksi melalui perintah mysql_close().
Dari contoh di atas maka kita dapat menyimpulkan bahwa ada empat langkah sederhana untuk dapat bekerja dengan database MySQL melalui PHP. Langkah-langkah tersebut adalah
  1. Buka koneksi ke MySQL
  2. Pilih database
  3. Lakukan operasi pada database.
  4. Tutup koneksi

Kelemahan MySQL extention

Extension ini tidak mendukung prepared statements, jadi ada kemungkinan untuk dapat dilakukan SQL injection pada skrip PHP jika menggunakan extension ini. Orang-orang yang bertanggung jawab bisa saja menggunakan kelemahan ini untuk mendapatkan data-data yang bersifat rahasia dari database. Atau yang lebih merusak dengan menghapus semua data dan tabel pada database kita.
Kelemahan ini masih bisa ditutupi dengan ‘membersihkan’ semua masukan dari user dan juga data-data yang akan dimasukkan ke dalam database. Untuk melakukan hal ini, extension ini menyediakan fungsi mysql_real_excape_string() yang akan merubah karakter-karakter khusus menjadi menggunakan tanda backslash. Fungsi lainnya untuk membersihkan masukan dari user adalah htmlentities() dan strip_tags(). Namun, bagaimanapun kemungkinan untuk diserang melalui SQL injection tetap ada walaupun input dari user sudah dibersihkan dari karakter khusus.

Beberapa Fungsi MySQL yang sering digunakan

mysql_connect()
Fungsi ini harus selalu dipanggil terlebih dahulu sebelum bisa melakukan perintah lainnya pada MySQL. Fungsi ini menerima 3 argumen. Alamat server di mana MySQL diinstal, username pada MySQL yang dituju dan yang terakhir adalah password untuk username tersebut. Seluruh argumen ini bersifat optional. Jika ketiganya tidak dimasukkan maka PHP akan menggangap kita menggunakan localhost, username pada web-server dan tanpa password.
Jika koneksi berhasil maka fungsi ini akan mengembalikan sebuah link identifikasi, namun jika gagal yang akan dikembalikan adalah NULL. Link ini akan digunakan nanti ketika kita memanggil query.
mysql_list_dbs()
fungsi ini memiliki kegunaan yang sama seperti perintah SHOW DATABASES pada MySQL. Argumen yang digunakan pada fungsi ini adalah link identifikasi yang juga bersifat optional. Fungsi ini akan mengembalikan sebuah pointer pada array yang mengandung nama-nama database. Pada contoh berikut maka array $hasil akan berisi nama-nama database.
$hasil = mysql_list_dbs($conn);
mysql_error()
Fungsi ini akan menampilkan error yang terjadi pada database MySQL sehingga akan memudahkan programmer untuk melakukan debugging.
mysql_select_db()
Fungsi ini adalah sama seperti perintah USE pada MySQL. Sehingga semua perintah yang dilakukan akan memberi hasil hanya pada database yang menjadi argument pada fungsi ini. Fungsi ini akan mengembalikan true jika berhasil dan false jika gagal.
Fungsi ini memerlukan sebuah argumen yang berupa nama dari database yang akan digunakan dan sebuah optional argumen yang berupa link identifikasi. Pada contoh berikut
mysql_select_db(“pemrograman”, $mysql);
jika sebelum memanggil fungsi mysql_select_db() tidak ada koneksi yang dibuat, maka fungsi ini akan mencoba untuk membuka sebuah koneksi terlebih dahulu sebelum memilih database yang akan digunakan.
mysql_list_tables()
Fungsi ini memiliki kegunaan yang sama seperti perintah SHOW TABLES pada MySQL. Argumen untuk fungsi ini adalah nama database dan sebuah optional argumen yang berupa link identifikasi. Sama seperti pada fungsi mysql_list_dbs(), fungsi ini juga akan mengembalikan sebuah pointer pada array yang mengandung nama-nama tabel dari database.
$hasil = mysql_list_tables(“pemrograman”, $mysql);
mysql_query()
Fungsi ini akan melakukan perintah SQL yang dimasukkan sebagai argumen pada fungsi ini. Fungsi ini mampu melaksanakan perintah SELECT, INSERT, UPDATE dan perintah-perintah lainnya.

mysql_num_rows()
fungsi ini akan mengembalikan jumlah baris atau record yang dihasilkan dari sebuah query. Fungsi ini memerlukan sebuah argumen yang berupa result set.
$jumlah_record = mysql_num_rows($hasil);
fungsi ini digunakan pada result set yang dikembalikan oleh perintah SELECT dan perintah sql lainnya yang mengembalikan baris atau record.

mysql_affected_rows()
Pada perintah INSERT, UPDATE dan DELETE akan mempengaruhi satu atau beberapa baris dari tabel. Untuk mengetahui jumlah baris yang terpengaruh dari perintah-perintah di atas maka kita menggunakan fungsi ini.
Penggunaan perintah DELETE tanpa WHERE akan menghapus seluruh isi dari tabel dan menyebabkan fungsi mysql_affected_rows() akan mengembalikan angka 0.
fungsi mysql_num_rows() dan mysql_affected_rows() akan mengembalikan sebuah angka yang berupa hasil dari perhitungan berapa jumlah baris, berbeda dengan fungsi mysql_list_dbs() dan mysq_list_tables() yang akan mengembalikan pointer dari sebuah result set.

mysql_fetch_array()
Melakukan perubahan dari hasil yang dikembalikan oleh fungsi mysql_query() menjadi array.

mysql_fetch_row()
untuk mendapatkan baris-baris atau record-record yang didapatkan dari server setelah sebuah query dipanggil maka kita memerlukan fungsi mysql_fetch_row(). Fungsi ini akan menggunakan sebuah argumen yang berupa pointer dari result set pada query yang kita lakukan sebelumnya. Sebuah array yang berisi semua baris akan dikembalikan dari fungsi ini jika berhasil dan false jika fungsi ini gagal.
$array_hasil = mysql_fetch_row($hasil);

mysql_free_result()
Fungsi ini berguna untuk mengosongkan memori yang pernah digunakan oleh fungsi mysql_query(), sehingga kecepatan untuk memproses skrip lainnya lebih cepat.


mysql_close()
Tutup koneksi yang dibuka oleh fungsi mysql_connect(). Sebenarnya tanpa memanggil fungsi ini, koneksi ke MySQL akan ditutup ketika skrip ditutup. Tapi umumnya kita ingin menutup koneksi sebelum akhir skrip sehingga kita memanggil fungsi ini. Link identifikasi yang dibuat pada saat membuka koneksi menggunakan fungsi mysql_connect() akan digunakan sebagai argumen pada fungsi mysql_close(). Jika argumen dikosongkan maka link identifikasi sebelumnya yang akan digunakan secara default dan jika tidak ada link identifikasi pada skrip tersebut maka semua fungsi mysql_* yang menggunakan link identifikasi akan ditutup.
Ketika fungsi mysql_close() berhasil dipanggil dan berhasil maka nilai true akan dikembalikan dan false jika fungsi ini gagal.

die()
Fungsi ini adalah sama seperti fungsi exit(). Ketika fungsi ini dipanggil maka eksekusi terhadap PHP akan dihentikan. Fungsi ini bisa diberikan argumen tambahan berupa pesan error yang akan ditampilkan ketika fungsi ini dipanggil.
Tugas
Membuat fungsi phpmyadmin mini

The MySQLi Extension

Berdasarkan petunjuk manual MySQL, extension ini adalah direkomendasi jika MySQL server yang digunakan adalah versi 4.1.3 atau yang lebih baru.
Beberapa keuntungan menggunakan MySQLi dibandingkan dengan MySQL extension adalah sebagai berikut,
  • MySQLi mendukung pemrograman Object-oriented dan Procedural
  • MySQLi bisa mengeksekusi beberapa perintah SQL sekaligus
  • MySQLi memiliki fitur kemampuan untuk debugging
  • MySQLi sudah mendukung prepared statements

Prepared Statements

MySQLi dan PDO telah menyediakan sebuah fitur yang sangat berguna yaitu prepared statement. Pada prepared statement kita bisa memisahkan antara data yang digunakan pada perintah SQL dan dengan perintah SQL itu sendiri. Selama ini orang-orang yang tidak bertanggung jawab cenderung menggunakan perintah SQL untuk melakukan SQL injection karena programmer tidak dapat memisahkan antara data dan perintah SQL. Sehingga dengan menggunakan prepared statement semua data yang dikirim oleh user telah terlebih dahulu dibersihkan, dengan begitu kemungkinan terkena SQL injection adalah sangat kecil.
Sebuah prepared statement bekerja sangat mirip dengan perintah-perintah yang ada pada MySQL. Hanya saja pada prepared statement menggunakan tanda tanya untuk menggantikan data pada saat perintah pertama sekali dibuat.
Misalnya kita akan menampilkan semua nama depan dari setiap orang yang memiliki nama belakang sesuai dengan yang diinputkan user pada text field di halaman kita. Sehingga kita bisa menggunakan superglobal array $_POST atau $_GET untuk mendapatkan data ini dan menggunakan dalam perintah SQL kita seperti perintah berikut.
$sql = “SELECT nama_depan FROM userdetails WHERE nama_belakang = ‘$_POST[nama_belakang]‘”;
Pada contoh di atas data yang kita terima dari user tidak kita bersihkan sehingga ada kemungkinan user memasukkan data yang salah untuk merusak seluruh sistem. Untuk menghindari ini kita bisa menggunakan perintah seperti berikut
$sql = “SELECT nama_depan FROM userdetails WHERE nama_belakang =?”
tanda tanya ini merupakan tanda di mana data nanti akan dimasukkan dalam perintah SQL tersebut. Dan memberitahukan kepada MySQL apapun yang akan menggantikan tanda tanya ini pada query tersebut akan digunakan sebagai parameter hanya untuk query ini. Hal ini dapat mencegah user untuk memasukkan kode-kode tertentu yang dapat merusak sistem yang sedang kita bangun.
Penggunaan MySQLi
Pada MySQLi, kita menggunakan interface berorientasi object untuk melakukan koneksi ke MySQL. Perbedaan utama antara OOP (Object Oriented Programming) dan pemrograman prosedural adalah object dapat menyimpan informasi, sehingga membebaskan kita dari hal-hal seperti pengiriman variabel dari satu fungsi ke fungsi yang lain.
Walaupun begitu, MySQLi masih menyediakan interface yang bersifat prosedural. Untuk lebih memahami penggunaan MySQLi kita dapat melihat contoh di awal bab ini yang sudah dimodifikasi sehingga akan menampilkan hasil yang sama seperti sebelumnya tapi sekarang kita menggunakan MySQLi.

<?php
// buat Koneksi ke MySQL pada database pemrograman
$mysql = new mysqli(‘localhost’, ‘user’, ‘password’, ‘pemrograman’);
if(mysqli_connect_errno()) {
die(‘Gagal melakukan Koneksi ke MySQL : ‘ . $mysql->error());
}
// buat dan eksekusi SQL query
$sql = “SELECT nama_depan, nama_belakang FROM userdetails”;
$hasil = $mysql->query($sql);
//baca seluruh data yang didapat melalui perulangan
while($baris = $hasil->fetch_assoc()) {
printf(“Nama: %s <br />”, $baris['nama_depan'].” “.$baris['nama_belakang']);
}
// kosongkan memori yang digunakan untuk menampung hasil query
$hasil->close();
// tutup koneksi
$mysql->close();
?>

ketika kita menyimpan file tersebut dengan nama mysqlitest.php dan memanggilnya dari browser ke alamat http://localhost/mysqlitest.php maka kita akan ditampilkan seluruh data nama depan dan nama belakang yang tersimpan pada tabel userdetails.
Tampilan untuk mysqltest.php adalah sebagai berikut
Gambar x.
Penjelasan Kode di atas
Pada kode di atas, pertama sekali kita akan membuat koneksi ke database pemrograman yang berada pada localhost dengan username user dan password-nya adalah password menggunakan perintah. Karena MySQli berorientasi object maka di sini kita akan membuat object baru dari kelas mysqli dengan nama mysql yang memiliki empat buah argumen, yaitu host, username, password, dan nama database.
$mysql = new mysqli(‘localhost’, ‘user’, ‘password’, ‘pemrograman’);
if(!$mysql) {
die(‘Gagal melakukan Koneksi ke MySQL : ‘ . $mysql->error());
}
pada perintah di atas setelah koneksi dibuat, kita akan menguji koneksi tersebut menggunakan percabangan if untuk melihat apakah fungsi melakukan koneksi berhasil atau tidak. Jika username kita ganti menjadi sebuah username lain yang tidak ada datanya pada mysql server, misalnya user1 maka ketika halaman ini dipanggil menggunakan browser chrome akan ditampilkan error seperti pada gambar x.
gambar x.
Jika argumen yang digunakan pada perintah di atas, diganti menjadi sebuah nama database yang tidak ada pada mysql server, misalnya toko, yang kebetulan pada mysql server yang digunakan pada pembuatan buku ini tidak memiliki database dengan nama toko. Untuk melakukan pengucian ini kembali kita menggunakan if seperti yang dapat kita lihat pada contoh di atas.Maka tampilannya ketika dipanggil halaman tersebut akan menjadi seperti pada gambar x di atas.
Kemudian kita akan membuat sebuah query yang berfungsi untuk menampilkan seluruh nama depan dan nama belakang yang ada pada tabel userdetails.
$sql = “SELECT nama_depan, nama_belakang FROM userdetails”;
Perintah sql ini kemudian akan dieksekusi menggunakan method query() dari kelas mysqli seperti berikut ini dan hasil dari perintah ini akan disimpan pada variabel $hasil.
$hasil = $mysql->query($sql);
$hasil akan dibaca satu per satu menggunakan perulangan while seperti pada kode berikut ini
while($baris = $hasil->fetch_assoc()) {
printf(“Nama: %s<br />”, $baris['nama_depan'].” “.$baris['nama_belakang']);
}
Dua perintah berikutnya pada kode di atas adalah untuk mengosongkan memori menggunakan fungsi $hasil->close() dan menutup koneksi melalui perintah $mysql->close().
Sistem kerja MySQLi serupa dengan MySQL extension, namun perbedaannya adalah pada MySQLi tidak menyediakan fungsi-fungsi yang terpisah tapi dapat menggunakan semua method atau pun fungsi yang berada dalam object MySQLi.
Untuk meng-eksekusi perintah SQL kita memanggil method query() dan menjadikan variabel yang berisi perintah MySQL sebagai argumen pada method ini. Pada OOP kita memanggil method dari sebuah variabel object dengan memanggil variabel object tersebut diikuti tanda panah (- > ) dan nama method. Misalkan pada baris berikut yang merupakan bagian dari kode di atas memperlihatkan bagaimana kita memanggil method query dari object mysql yang telah kita buat sebelumnya.
$hasil = $mysql->query($sql);
method query() akan mengembalikan sebuah object mysqli_result yang juga memiliki method yang akan mengizinkan kita untuk mengakses informasi yang dikembalikan dari query. Untuk mengakses informasi ini secara beurut kita menggunakan perulangan terhadap array yang dihasilkan dari method ini.
$hasil->fetch_assoc();

Penggunaan Prepared Statements pada MySQLi

selain yang sudah disebutkan di atas, sebenarnya yang benar-benar membedakan MySQLi dari MySQL extension adalah kemampuan MySQLi untuk menggunakan prepared statement. Jika kita ingin melihat tanggal lahir dari sesorang berdasarkan nama depan dan nama belakangnya maka kita dapat menggunakan prepared statement seperti pada latihan berikut :
Latihan
1. ketik kode berikut pada sebuah teks editor
<?php
if($_SERVER['REQUEST_METHOD']==’POST’) {
$mysql = new mysqli(‘localhost’, ‘user’, ‘password’, ‘pemrograman’);
if(mysqli_connect_errno()) {
die(‘Gagal melakukan koneksi ke MySQL: ‘ . $mysqli->error());
}
// Buat Query dan eksekusi
$sql = “SELECT tanggal_lahir FROM userdetails WHERE nama_depan=? AND nama_belakang=?”;
if($stmt = $mysql->prepare($sql)) {
$stmt->bind_param(‘ss’, $_POST['nama_depan'], $_POST['nama_belakang']);
$stmt->execute();
$stmt->bind_result($tanggal);
while($stmt->fetch()) {
printf(“Tanggal Lahir : %s<br />”, $tanggal);
}
$stmt->close();
}
// Close the connection
$link->close();
}
else {
?>
<form action=”mysqlitest2.php” method=”post”>
<label for=”nama_depan”>Nama Depan :</label>
<input type=”text” name=”nama_depan” id=”nama_depan” value=”” />
<label for=”nama_belakang”>Nama Belakang :</label>
<input type=”text” name=”nama_belakang” id=”nama_belakang” value=”” />
<input type=”submit” />
</form>
<?php } ?>
  1. simpan dengan nama mysqlitest2.php ke /var/www/
  2. Panggil dengan browser ke alamat http://localhost/mysqlitest2.php


ketika user mengirim form, sebuah object dari MySQLi dibuat. Kemudian kita membuat sebuah query dengan dua nama variabel yang berasal dari web form yang dimasukkan user pada klausa WHERE, hal ini dapat kita lihat dari jumlah tanda tanya (?) yang digunakan pada variabel $sql.
Kita bisa memanggil method prepare() pada object MySQLi kita dan memasukkan variabel $sql sebagai argumen pada method ini seperti berikut
$mysql->prepare($sql)
Kalau kita menggunakan method prepare() untuk prepared statement kita perlu memberitahukan kepada MySQL bagaimana menangani masukan dari user dan bagaimana user input ini dimasukkan ke dalam query. Ini disebut dangan binding parameter ke dalam query dan kita menggunakan method bind_param() dari variabel $stmt yang baru saja kita buat yang merupakan object MySQLi_STMT.
Pada proses binding parameter ada beberapa langkah, pertama adalah dengan menentukan tipe data dari parameter yang akan kita masukkan yang diikuti dengan parameter kedua yang merupakan nilai yang akan dimasukkan sebagai parameter.
MySQLi mendukung empat tipe data, yaitu :
  • i : Integer
  • s : String
  • d : double
  • b : blob

pada contoh di atas kita memasukkan dua variabel yang kita dapat dari web form yaitu nama_depan dan nama_belakang. Untuk menangkap masukkan ini kita menggunakan superglobal Array $_POST sehingga menjadi $_POST['nama_depan'] dan $_POST['nama_belakang']. Setelah parameter ini bersatu dengan query, baru kita bisa meng-eksekusi perintah sql dengan menggunakan method execute(). Setelah query dieksekusi, kita harus menyediakan sebuah variabel untuk menampung hasil dari eksekusi query ini menggunakan method bind_result(). Pada contoh di atas kita menyimpan tanggal lahir pada variabel $tanggal.
Sekarang skrip PHP kita sudah mengetahui di mana hasil query harus disimpan. Dan selanjutnya kita akan menggunakan perulangan untuk menampilkan hasilnya. Terakhir kita akan menghapus result set dan menutup koneksi ke MySQL dengan memanggil method close, baik pada object MySQLi_STMT dan MySQLi.
Adapun tampilan dari halaman ini ketika pertama kali dipanggil adalah seperti yang ditunjukkan pada gambar x.
Gambar x.
Setelah user memasukkan nama depan = sayed dan nama belakang = Muchallil, maka ketika tombol submit ditekan, kedua data dari web form ini akan diproses untuk menampilkan tanggal lahir dari data yang dimiliki database jika mempunyai nama depan dan nama belakang sesuai dengan yang dimasukkan oleh user, seperti pada gambar berikut
Gambar x.

PHP Data Objects (PDO)

PDO memiliki persamaan dengan MySQLi dalam hal pendekatan object oriented untuk menangani query yang mendukung prepared statement. Perbedaan utama antara keduanya adalah pada layer akses database. Artinya PDO mendukung banyak database dan menyediakan fungsi yang sama untuk semua database dalam berinteraksi dengan database. Hal ini tentu saja suatu keuntungan untuk sebuah aplikasi yang membutuhkan back-end dari berbagai tipe database.
Menggunakan PDO, untuk mengganti dari satu database ke database lain kita hanya harus menulis sedikit kode tambahan, sehingga hal ini akan memudahkan programmer dalam mengganti driver database yang lama pada PDO.
Kelemahan dari PDO adalah disebabkan oleh tidak tersedianya fitur-fitur tertentu dari MySQL, seperti dapat mengeksekusi banyak perintah sekaligus. Sebagai tambahan, PDO sangat tergantung pada fitur OOP di PHP5, sehingga tidak akan dapat berjalan pada server yang menggunakan PHP4. Walaupun sekarang banyak server yang sudah menggunakan PHP5, sehingga hal ini tidak akan jadi masalah. Namun, sebaiknya pemilihan cara akses database pada aplikasi kita juga mempertimbangkan masalah ini.
Berikut adalah contoh penggunaan PDO pada skrip PHP untuk menampilkan nama depan dan nama belakang untuk semua record yang ada dalam tabel userdetails.
<“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
<head>
</head>
<body>
<h1>Daftar Nama</h1>
<?php
$db = “mysql:dbname=pemrograman”;
$username = “user”;
$password = “password”;
try {
$conn = new PDO( $db, $username, $password );
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch ( PDOException $e ) {
echo “Koneksi Gagal: ” . $e->getMessage();
}
$sql = “SELECT * FROM userdetails”;
echo “<ul>”;
try {
$rows = $conn->query( $sql );
foreach ( $rows as $row ) {
echo “<li>nama depan adalah ” . $row["nama_depan"] . ” dan Nama belakang adalah ” . $row["nama_belakang"] . “</li>”;
}
} catch ( PDOException $e ) {
echo “Query failed: ” . $e->getMessage();
}
echo “</ul>”;
$conn = null;
?>
</body>
</html>
ada pun tampilan dari kode di atas adalah sebagai berikut
Gambar x.
kita juga dapat memodifikasi contoh kode pada Latihan MySQLi dengan menggunakan PDO. Sehingga kodenya menjadi seperti berikut

<?php
if($_SERVER['REQUEST_METHOD']==’POST’) {
// Buat koneksi ke MySQL
$db = ‘mysql:host=localhost;dbname=pemrograman';
$user = ‘user';
$password = ‘password';
$conn = new PDO($db, $user, $password);
// Buat query dan eksekusi
$sql = “SELECT tanggal_lahir FROM userdetails WHERE nama_depan=? AND nama_belakang=?”;
$stmt = $conn->prepare($sql);
if($stmt->execute(array($_POST['nama_depan'],$_POST['nama_belakang']))) {
while($row = $stmt->fetch()) {
printf(“tanggal lahir : %s<br />”, $row['tanggal_lahir']);
}
$stmt->closeCursor();
}
$conn = null;
}
else {
?>
<form action=”PDOtest.php” method=”post”>
<label for=”nama_depan”>Nama Depan :</label>
<input type=”text” name=”nama_depan” id=”nama_depan” value=”” />
<label for=”nama_belakang”>Nama Belakang :</label>
<input type=”text” name=”nama_belakang” id=”nama_belakang” value=”” />
<input type=”submit” />
</form>
<?php } ?>

Penjelasan Kode

Pertama sekali sama seperti yang lainnya, kita harus membuat koneksi ke MySQL, perbedaan dari pembahasan sebelumnya adalah disebabkan kemampuan dari PDO yang bisa melakukan koneksi ke berbagai tipe database, sehingga kita harus menentukan database apa yang ingin kita koneksikan.
Jadi kita akan membuat sebuah variabel yang bernama $db yang meminta PDO untuk menggunakan driver MySQL pada localhost dan menggunakan database yang bernama pemrograman. Kemudian kita akan membuat dua variabel lainnya yaitu $user dan $password yang masing-masing kita gunakan untuk menampung username dan password dari database.
Setelah kita membuat sebuah object PDO yang baru menggunakan ketiga variabel di atas, kita akan membuat sebuah variabel bernama $sql. Karena kita akan menggunakan prepared statement seperti sebelumnya kita akan memanggil method prepare yang menggunakan variabel $sql sebagai argumen. Method ini akan mengembalikan object PDOStatement yang kita letakkan pada variabel $stmt.
Selanjutnya kita memanggil method execute() yang menggunakan argumen berupa array dari masukan user menggunakan web form. Method ini adalah sama seperti gabungan kedua method bind_param() dan execute() pada MySQli.
Setelah perintah sql ini dieksekusi, seperti biasa kita akan menggunakan perulangan untuk membaca semua record yang dihasilkan dari perintah sql sebelumnya. Kemudian kita akan menghapus data dari stmt pada memori dengan menggunakan method closeCursor().
jika tidak terjadi kesalahan dalampengetikan kode, maka ketika kita pertama kali memanggilPDOtest.php maka kita akan mendapatkan tampilan seperti berikut
Gambar x.

Setelah user memasukkan nama depan = sayed dan nama belakang = Muchallil seperti pada gambar x, maka ketika tombol submit ditekan, kedua data dari web form ini akan diproses untuk menampilkan tanggal lahir dari data yang dimiliki database jika mempunyai nama depan dan nama belakang sesuai dengan yang dimasukkan oleh user, seperti pada gambar x.
Gambar x.
Gambar x.

Koneksi dengan PDO

Untuk mengkoneksikan antara skrip PHP dengan MySQL yang perlu kita lakukan hanya membuat sebuah object PDO yang baru. Pada saat pembuatan object ini kita mebutuhkan tiga argumen. Argumen yang pertama adalah sumber database, yaitu teridiri dari nama database atau tipe database, kemudian alamat server database dan nama database. Kedua adalah username dari database yang kita gunakan dan yang terkahir adalah password untuk username tersebut.
Object yang baru dibuat ini merupakan koneksi dari skrip PHP kita ke database.
$conn = new PDO($db, $user, $password);
cara mendefinisikan sumber database atau yang dikenal dengan istilash Database Source Name (DSN) adalah sebuah string yang mendeskripsikan atribut dari koneksi seperti yang telah disebutkan di atas. DSN berikut merupakan contoh untuk melakukan koneksi ke MySQL yang berada pada localhost dan database yang digunakan adalah pemrograman
$db = ‘mysql:host=localhost;dbname=pemrograman';
Jika host tidak diisi maka skrip ini akan menganggap kita mau melakukan koneksi ke MySQL yang berada pada localhost. Sehingga untuk contoh di atas kita bisa mengganti definisi dari DSN menjadi seperti berikut
$db = ‘mysql:dbname=pemrograman';
setelah kita selesai menggunakan koneksi ini, kita sebaiknya menutupnya karena ini akan mengosongkan sebagian memori sehingga bisa digunakan oleh program lain. Walaupun pada umumnya engine PHP akan melakukannya untuk kita, tapi lebih baik untuk membiasakan diri selalu menutup koneksi yang sudah dibuat.
Untuk menutup koneksi, masukkan nilai null pada variabel koneksi kita. Ini akan menghapus object PDO dan tentu saja dengan terhapusnya object PDO maka koneksi juga akan terhapus
$conn = null;

Penanganan Error

Ada kalanya error pada database sangat sulit untuk ditracking dan ditangani. Salah satu keunggulan lainnya dari PDO adalah kemudahan dalam membaca error yang dihasilkan dari PDOException. Exception ini dapat dibangkitkan menggunakan kata kunci try dan catch pada PHP untuk menangani error yang dihasilkan, sehingga kita bisa menanganinya sesuai dengan kebutuhan.
Untuk membuat sebuah PDO object dapat membangkitkan exception setiap terjadi error pada database, kita harus menggunakan method PDO::SetAttribute untuk menentukan mode error pada Object PDO.
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
sekarang kita bisa menangkap setiap error yang terjadi ketika melakukan koneksi ke database dengan menggunakan blok try .. catch. Jika kita membuat aplikasi yang rumit, mungkin kita akan menyimpan error yang ditangkap ini ke dalam file log. File ini kemudian akan dikirim ke web master untuk menginformasikan mengenai error yang terjadi. Namun pada contoh PDO yang pertama kita hanya akan menampilkan error yang terjadi pada halaman web tanpa mengirimkan ke email web master.

try {
$conn = new PDO( $db, $username, $password );
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch ( PDOException $e ) {
echo “Koneksi Gagal: ” . $e->getMessage();
}
Adapun tampilan dari contoh pertama PDO di atas jika kita mengganti username menjadi user1 adalah seperti yang ditunjukkan pada gambar x berikut ini
Gambar x
PHP akan menjalankan kode di dalam blok try terlebih dahulu, jika terjadi exception pada PDO catch block akan menampilkan pesan error.

Mendapatkan Data

Setelah kita terkoneksi ke database MySQL kita, sekarang kita dapat membaca data pada tabel yang berada di dalam database pemrograman menggunakan perintah SELECT. Untuk mengirimkan perintah SQL ke MySQL server kita menggunakan method query() pada yang dimiliki oleh object PDO. Method ini membutuhkan sebuah argumen yang berupa perintah SQL. Jika perintah SQL tersebut mengembalikan record dalam bentuk baris dari result set, kita bisa memproses record ini dengan menyimpan hasil yang dikembalikan ini ke dalam sebuah variabel terlebih dahulu.
$rows = $conn->query( $sql );
hasil yang dikembalikan dari method query() adalah object yang lain. Object ini disebut PDOStatement. Object ini bisa langsung digunakan pada perulangan foreach untuk mendapatkan record-record dari hasil query datu persatu. Pada contoh di awal, setiap $row pada perulangan foreach merupakan assosiativ array yang mengandung nama kolom sebagai key dan data dari masing-masing kolom.
$rows = $conn->query( $sql );
foreach ( $rows as $row ) {
echo “<li>nama depan adalah ” . $row["nama_depan"] . ” dan Nama belakang adalah ” . $row["nama_belakang"] . “</li>”;
}

Pada Bab-bab selanjutnya, untuk mengakses database akan digunakan PDO.

No comments:

Post a Comment