Memperoleh Informasi Database Menggunakan PHP


Halo semua,

Kali ini saya ingin share source code untuk generator memperoleh suatu informasi dari database menggunakan bahasa pemrograman PHP. Pertama-tama saya ingin menjelaskan proses pembuatan codenya dahulu. Kurang lebih struktur dari codenya seperti ini. Kali ini, saya juga akan mencoba mendemonstrasikan konsep OO pada PHP di sini. Berikut adalah gambaran strukturnya :

 

Kemudian pada folder dbtype/mysql/ terdapat 3 buah file .php yang didalam berisi 3 class yang meng-implements suatu interface.

 

Saat ini, database yang didukung masih mysql, nanti kedepannya saya akan mencoba membuat postgresql. Kenapa sih kita harus cape2 buat ini ? kalau saya membuat ini tujuannya adalah untuk membuat code generator untuk framework-framework php seperti zend, code ignitor, dan lain-lain. Tutorial kedepannya, saya akan coba membuat generator untuk model di CI versi 2.0.3. Sebetulnya sih sudah selesai, tapi nanti akan saya share setelah ini.

Sekarang kita lihat file IDatabase.php

<?php

Interface IDatabase{

function openConnection();

function closeConnection();

function getTables();

function selectDb($dbname);

}

Kalau diperhatian file IDatabase.php hanya berupa interface yang nantinya harus diimplementasikan oleh setiap database (sebenarnya RDBMS) seperti Mysql, Postgres, Oracle, dan lain-lain karena code  untuk openConnection, closeConnection dapat berbeda-beda untuk setiap jenis RDBMS yang ada.

Kemudian function yang perlu diperhatikan kemudian adalah function getTables(). Pada dasarnya suatu database tertentu akan terdiri dari beberapa Tabel. Kemudian suatu Tabel akan berisi beberapa Fields. Sedangkan suatu fields memiliki attribute-attribute tertentu. Nah, oleh karena itu dalam Interface IDatabase.php saya definisikan getTables();

Selanjutnya pada Interface ITable.php

<?php
Interface ITable{
function initFields();
function getPrimaryKey();
function getFields();
function getTableName();
}

Sedangkan pada IField.php

<?php
interface IField{
function getName();
function setName($name);
function getType();
function setType($type);
function getIsNull();
function setIsNull($isNull);
function getKey();
function setKey($key);
function getDefault();
function setDefault($default);
function getExtra();
function setExtra($extra);
}

Nah, sekarang kita masuk ke class-class implementornya yaitu class MySQLDatabase, MySQLTable, dan MySQLField.

MySQLDatabase.php

<?php

include "class/IDatabase.php";
include "class/IField.php";
include "class/ITable.php";
include "class/dbtype/mysql/MySQLTable.php";
include "class/dbtype/mysql/MySQLField.php";

class MySQLDatabase implements IDatabase{
var $tables;
var $host;
var $port;
var $user;
var $password;
var $connection;
var $dbname;

function MySQLDatabase($host, $port, $user, $password){
$this->host = $host;
$this->port = $port;
$this->user = $user;
$this->password = $password;
}

function initTable(){
$listOfTableByName = $this->getListOfTablesName();
$this->tables = array();
foreach($listOfTableByName as $tableName){
$table = new MySQLTable($tableName);
$this->tables[$tableName] = $table;
}
}

function openConnection(){
$this->connection = mysql_connect($this->host.":".$this->port, $this->user, $this->password);
}

function setDb($dbname){
$this->selectDb($dbname);
}

function selectDb($dbname){
$this->dbname = $dbname;
mysql_select_db($this->dbname);
$this->initTable();
}

function closeConnection(){
mysql_close($this->connection);
}

private function getListOfTablesName(){
$sql = "SHOW TABLES FROM $this->dbname";
$result = mysql_query($sql);

if (!$result) {
return NULL;
}

$listOfTableName = array();

while ($row = mysql_fetch_row($result)) {
array_push($listOfTableName, $row[0]);
}
return $listOfTableName;
}

function getTables(){
return $this->tables;
}

}

Pada class ini, dapat dilihat bahwa untuk open connection ke database saja, kita menggunakan fungsi mysql_connect yang telah disediakan oleh PHP, bagaimana dengan postgresql ? apakah akan sama fungsinya ? tentu tidak, oleh karena itu, ketika kita hendak membuat koneksi dengan postgresql maka kita perlu fungsi lain yaitu pg_connect (kalau tidak salah). Nah, oleh karena itu, nantinya diperlukan implementasi yang berbeda untuk database postgreSQL. Sekarang kita fokus ke MySQL saja terlebih dahulu.

Pada fungsi initTables(); penulis mengambil data dari nama-nama tables yang terdaftar dari suatu database tertentu (dbname);

$listOfTableByName = $this->getListOfTablesName();

Fungsi getListOfTabelsName(); bersifat private sehingga fungsi ini hanya dapat dipanggil oleh class ini saja.

Jika diperhatikan pada funsi getListOfTablesName();


private function getListOfTablesName(){
$sql = "SHOW TABLES FROM $this->dbname";
$result = mysql_query($sql);

if (!$result) {
return NULL;
}

$listOfTableName = array();

while ($row = mysql_fetch_row($result)) {
array_push($listOfTableName, $row[0]);
}
return $listOfTableName;
}

Sebetulnya fungsi diatas mengeksekusi suatu sql yaitu SHOW TABLES …… lalu mengembalikan nama-nama table yang ada di suatu database tertentu.

Setelah memperoleh data nama-nama tabel, dilakukanlah loop sebanyak tabel yang diperoleh dan kemudian dibentuk object MySQLTable dengan parameter nama tabel. Object MySQLTable ini kemudian disimpan pada stuktur data array yaitu tables.

$this->tables = array();
foreach($listOfTableByName as $tableName){
$table = new MySQLTable($tableName);
$this->tables[$tableName] = $table;
}

MySQLTable.php

<?php
class MySQLTable implements ITable{
var $fields;
var $tableName;

function MySQLTable($tableName){
$this->tableName = $tableName;
$this->initFields();
}

function initFields(){
$result = mysql_query("SHOW COLUMNS FROM ".$this->tableName);
if (!$result) {
return NULL;
}

$this->fields = array();
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$field = new MySQLField($row['Field'], $row['Type'], $row['Null'], $row['Key'], $row['Default'], $row['Extra']);
$this->fields[$row['Field']] = $field;
}
}
}

function getPrimaryKey(){
foreach($fields as $field){
if($field->getKey() == "PRI" || $field->getKey() == "pri"){
return $field;
}
}
}

function getFields(){
return $this->fields;
}

function getTableName(){
return $this->tableName;
}

function getUpperCaseName(){
$camelName = $this->getCamelName();
$camelName[0] = strtoupper($camelName[0]);
return $camelName;
}

function getCamelName(){
$camelName = "";
$arrName = str_split($this->tableName);

for($i = 0; $i < strlen($this->tableName); $i++){
if($arrName[$i] == "_"){
$arrName[$i+1] = strtoupper($arrName[$i+1]);
}else {
$camelName .= $arrName[$i];
}
}
return $camelName;
}
}

 MySQLField.php

<?php
class MySQLField implements IField{
var $name;
var $type;
var $isNull;
var $key;
var $default;
var $extra;

function MySQLField($name, $type, $isNull, $key, $default, $extra){
$this->name = $name;
$this->type = $type;
$this->isNull = $isNull;
$this->key = $key;
$this->default = $default;
$this->extra = $extra;
}

function getName(){
return $this->name;
}

function getUpperCaseName(){
$camelName = $this->getCamelName();
$camelName[0] = strtoupper($camelName[0]);
return $camelName;
}

function getCamelName(){
$camelName = "";
$arrName = str_split($this->name);

for($i = 0; $i < strlen($this->name); $i++){
if($arrName[$i] == "_"){
$arrName[$i+1] = strtoupper($arrName[$i+1]);
}else {
$camelName .= $arrName[$i];
}
}
return $camelName;
}

function setName($name){
$this->name = $name;
}

function getType(){
return $this->type;
}

function setType($type){
$this->type = $type;
}

function getIsNull(){
return $this->isNull;
}

function setIsNull($isNull){
$this->isNull = $isNull;
}

function getKey(){
return $this->key;
}

function setKey($key){
$this->key = $key;
}

function getDefault(){
return $this->default;
}

function setDefault($default){
$this->default = $default;
}

function getExtra(){
return $this->extra;
}

function setExtra($extra){
$this->extra = $extra;
}
}

Ketika membuat object MySQLTable, di dalam contructor, ternyata juga dibuat object Fields (MySQLField) dan disimpan pada struktur data array. Secara detail, anda dapat melihatnya pada baris program diatas.

Anda dapat mengcopy-paste program-program diatas dengan nama file yang sesuai seperti pada contoh struktur berikut ini :

 

Setelah “library” sederhana ini selesai, sekarang saatnya Anda menjalankan program untuk melihat Hasilnya. Berikut langkah-langkahnya :

  • Pastikan MySQL Anda sudah berjalan, (saya menggunakan xampp untuk memudahkan)

 

  • Setelah itu, masuk ke browser untuk membuat suatu database “test” (http://localhost/phpmyadmin/) lalu buatlah fields dan isikan data dummy

 

  • Sekarang, buka text editor Anda, saya menggunakan Eclipse IDE PHP.  Saya buat pada root aplikasinya di luar folder class. “sample.php

  • Pada file sample.php, 
<?php
include "class/dbtype/mysql/MySQLDatabase.php";

$dbname = "test";
$db = new MySQLDatabase("localhost", "3306", "root", "");

$db->openConnection();
$db->selectDb($dbname);

$tables = $db->getTables();
foreach($tables as $tableName => $table){
echo $tableName;
echo "<br/>";echo "<br/>";
print_r($table);
echo "<br/>"; echo "<br/>";
}

$db->closeConnection();

  • Hasil pada layar adalah sebagai berikut :

 ~selamat mecoba😀

  1. Nice ilmu, keep post gan ya!

  2. kok masih php gan, bukan java???😛

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: