belajar memakai pdo

sebelum memulai .. ada beberapa step yang harus dikuasai untuk bisa memakai pdo yang lebih secure. Dimulai dari koneksi, query, input hingga nantinya memakai konsep prepare.

Terakhir pembahasan sebenarnya menjelaskan Prepare. Sebuah metode bagus untuk belajar pertahanan query.

Pada dasarnya Prepare adalah konsep untuk memakai query / proses memakai DBMS yang secure. Dasar dari prepare adalah memastikan input atau sebut saja parameter OK. Parameter OK dapat menghindari dari sql inject maupun kesalahan input.

Tanpa basa-basi langsung saja ya

KONEKSI

pada step ini saya berharap mendapatkan koneksi OK. Tetapi ada bagusnya kita awali dengan koneksi yang salah

Koneksi salah

hal tersulit dari pdo adalah menentukan koneksi yg sesuai. disini saya memakai mysql

source
 $dbh = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
 result:

Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES)’ in C:\php_folder\php_other\002-pdo.php:4 Stack trace: #0 C:\php_folder\php_other\002-pdo.php(4): PDO->__construct(‘mysql:host=loca…’, ‘root’, ‘salah’) #1 {main} thrown in…

Tidak perlu saya jelaskan bahwa sumber masalahnya pada user dan password yg salah

disini kita harus menyadari.. apabila kesalahan muncul.. maka sistem akan stop.. cara supaya stopnya tidak terlalu dramatis bagaimana? update sourcenya

$user='root'; $pass='salah'; try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); }

Hasil:

Error!: SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES)

kemudian kita masuk ke koneksi yg jalan dengan benar.. jadi kita isi user dan password yg sesuai.. tapi kok masih error juga?

Error!: SQLSTATE[HY000] [1049] Unknown database ‘test’

tentu saja error.. kita tak memiliki database test.. buat dan halamannya akan kosong!!?

buatlah database test dan 1 table mytable yg berisi hanya id dan nama saja

just info

pastikan php.ini semua ini tidak di komen

  • extension=php_pdo.dll extension=php_pdo_firebird.dll
  • extension=php_pdo_informix.dll extension=php_pdo_mssql.dll
  • extension=php_pdo_mysql.dll extension=php_pdo_oci.dll
  • extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll
  • extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll

Koneksi Benar

untuk metode ini kita memakai mysql. jadi caranya untuk koneksi seperti yang tertulis di atas.. dan apabila kita memakai koneksi. disarankan di akhir ada stop koneksi.. caranya cukup

$dbh = null;

untuk metode lain bisa memakai

  • odbc:SAMPLE’
  • pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass
  • sqlite:/opt/databases/mydb.sq3
  • sqlite::memory:
  • sqlite2:/opt/databases/mydb.sq2
  • sqlite2::memory:
  • mysql:host=localhost;port=3307;dbname=testdb
  • dan lain-lain

QUERY

untuk query kita harus faham bahwa ada banyak metode.. namun perlu di ingat.. apabila koneksi tidak ada.. maka proses query tak bisa dilakukan..

SELECT

pada dasarnya inilah yang akan kita lakukan

try {     $con = new PDO('mysql:host=localhost;dbname=test', $user, $pass); /*buka koneksi*/     $sql = "select name from mytable";     foreach ($con->query($sql) as $row) { /*query dan tampilkan*/         print $row['name'] . "\t";         print "<br/>";     }          $con = null; /*untuk close */      } catch (PDOException $e) {     print "Error!: " . $e->getMessage() . "<br/>";     die(); }

pertanyaannya sebenarnya adalah : bagaimana tampilan errornya?

Warning: Invalid argument supplied for foreach() in

kita harus cari akal agar bila ada error.. tidak keluar pernyataan diatas.. bagaimana cara membuat rapinya

try {     $con = new PDO('mysql:host=localhost;dbname=test', $user, $pass); /*buka koneksi*/     $sql = "select name from mytable2";     $res = $con->query($sql);     if(!$res){ /* intinya mengeluarkan error */         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     }     else{         foreach ($res as $row) { /*query dan tampilkan*/             print $row['name'] . "\t";             print "<br/>";         }     }         $con = null; /*untuk close */      } catch (PDOException $e) {     print "Error!: " . $e->getMessage() . "<br/>";     die(); }
  1. kita letakkan query yang kita jalankan di $res
  2. cek apakah valid atau tidak
  3. bila tidak maka kembalikan error dengan perintah throw
  4. bila ok maka dikeluarkan

lalu hasil yang kita dapat dari atas (error yg sudah diperbaiki)

Error!: code:42S02|error:42S02
 1146
 Table ‘test.mytable2’ doesn’t exist

untuk query dasar silakan menggunakan $con->query()

Metode Lain

untuk query yg berulang-ulang dan hanya beda parameter yg masuk.. barulah anda memakai prepare

For a query that you need to issue multiple times, you will realize better performance if you prepare a PDOStatement object using PDO::prepare() and issue the statement with multiple calls to PDOStatement::execute().

INSERT

pada proses ini.. kita akan jalankan perintah insert data.. tapi sayangnya tidak ada output yg keluar… untuk itu gunakan exec

$sql="insert into mytable(name) value('satu')";     if($res=$con->exec($sql)){         echo "OK";     }     else{         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     }

hasil keluarannya OK.. namun ini belum selesai.. coba ganti dengan mytable1 kita akan mendapatkan error

Error!: code:42S02|error:42S02
 1146
 Table ‘test.mytable1’ doesn’t exist

Tapi untuk tampilan yang lebih enak saya ubah menjadi seperti berikut

$sql="insert into mytable(name) value('satu'),('dua')";     $res = $con->exec($sql);     $insertOK= $res!=false ?$res:false;     if($insertOK){         echo "OK .. total perubahan ".$insertOK;     }     else{         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     }

apabila anda menjalankan exec.. nilai yang dikembalikan adalah berapa perubahan yang dilakukan.. bila melakukan

  • update. berapa data yang terupdate
  • delete. berapa data yang terhapus
  • insert. berapa data yang masuk?!

MODE TRANSAKSI

ini adalah mode yang bagus untuk transaksi.. jadi kita punya kasus pembelian barang.. saya membeli 3 barang.. ternyata sudah ambil, kasi ke kasir.. lalu saya batalkan.. nah bagaimana cara cancel semuanya? jawabannya bisa dengan roolback.. langsung coba aja ya

$con->beginTransaction(); /*=====ADA DATA DI INPUT.. NANTI DIBATALKAN */         $sql="insert into mytable(name) value('SALAH')";     $res = $con->exec($sql);     $insertOK= $res!=false ?$res:false;     if($insertOK){         echo "OK .. total perubahan ".$insertOK;     }     else{         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     } /*QUERY AWAL*/     echo "<p>DATA AWAL SEBELUM ROLLBACK</p>";     $sql = "select name from mytable";     $res = $con->query($sql);     if(!$res){         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     }     else{         foreach ($res as $row) { /*query dan tampilkan*/             print $row['name'] . "\t";             print "<br/>";         }     }     /* ROLLBACK */     $con->rollBack(); /*QUERY SETELAH ROLLBACK*/     echo "<p>DATA SESUDAH ROLLBACK</p>";     $sql = "select name from mytable";     $res = $con->query($sql);     if(!$res){         throw new PDOException('code:'.$con->errorCode().'|error:'.implode("<br/>",$con->errorInfo()));     }     else{         foreach ($res as $row) { /*query dan tampilkan*/             print $row['name'] . "\t";             print "<br/>";         }     }

perhatikan.. di awal2 (disarankan setelah parameter con) harus ada perintah Begintransaction agar aktif. selain itu tipe tablenya jg hrs bisa transaksi (innodb kl di mysql)

Hasil

OK .. total perubahan 1
DATA AWAL SEBELUM ROLLBACK
satu
 dua
 SALAH
DATA SESUDAH ROLLBACK
satu
 dua
 OK .. total perubahan 2

pada contoh diatas kita lihat ada data SALAH.. setelah di rollback data salah ‘hilang’

Sisanya matangkan saja dahulu memakai metode dan fungsi di atas… sebelum masuk ke prepare dan commit

KESIMPULAN

untuk 1 artikel.. ini terlalu panjang.. harusnya dipecah-pecah.. tapi yang penting bisa dicoba-coba kembali.. saya janji akan buat tutorial lagi yg beda untuk latihan saja!!

selamat belajar


Originally published at gundambison.wordpress.com on April 8, 2016.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.