PDA

View Full Version : [PHP][Advance]Menggunakan Perintah SELECT berbasis OOP



black_clavus
03-01-2011, 11:02 AM
:ehem: langsung kita mulai saja...
Gw mau share kelas yang digunakan untuk mengeksekusi perintah SQL (khususnya SELECT) pada mysql dengan menggunkan PHP.

Kelas-kelas tersebut adalah :
1. CSMysql = Digunakan untuk melakukan eksekusi perintah SQL



<?php
include_once 'CSMysqlResult.php';

class CSMysql {

private $link_id;
private $fields = '';
private $table = '';
private $conditions = array();
private $join = array();
private $group_by = '';
private $orderby = array();
private $limit = NULL;
private $offset = NULL;
/* akhir deklarasi field / variable kelas */

private function __construct($link_id) {
$this->link_id = $link_id;
}

public static function connect($host, $username, $password, $new_link = NULL) {
$link = @mysql_connect($server, $username, $password, $new_link);
$mysql = new CSMysql($link);
return $mysql;
}

public function select_database($database_name) {
return @mysql_select_db($database_name, $this->link_id);
}

public function get_link_id() {
return $this->link_id;
}

public function query($query) {
$resultset = @mysql_query($query, $this->link_id);
if ($resultset !== FALSE) {
$result_object = new CSMysqlResult($resultset);
return $result_object;
} else {
return FALSE;
}
}

public function select($fields = "*") {
if (is_array($fields)) {
$fields = implode(", ", $fields);
}
$this->fields = $fields;
}

public function from($table) {
$this->table = $table;
}

public function where($fieldname, $condition = '', $operator = ' = ') {
$this->conditions[] = "\n" . $fieldname . $operator . $condition;
}

public function join($table, $condition, $join_type = "") {
$this->join[] = $join_type . ' JOIN ' . $table . ' ON ' . $condition;
}

public function group_by($fields) {
if (is_array($fields)) {
$fields = implode(", ", $fields);
}
$this->group_by = $fields;
}

public function orderby($field, $type = 'ASC') {
$this->orderby[] = $field . ' ' . $type . "\n";
}

public function limit($offset, $limit) {
$this->offset = $offset;
$this->limit = $limit;
}

public function get_select() {
$query_select = $this->compile_select();
if ($query_select != '') {
$this->reset();
return $this->query($query_select);
} else {
return FALSE;
}
}

public function close() {
return @mysql_close($this->link_id);
}

public function get_error_message() {
return @mysql_error($this->link_id);
}

public function get_error_number() {
return @mysql_errno($this->link_id);
}

public function compile_select() {
if ($this->fields == '' OR $this->table == '') {
return '';
}

$query = 'SELECT ' . $this->fields . ' FROM ' . $this->table;

if (count($this->join)) {
$join = implode("\n", $this->join);
$query .= "\n" . $join;
}

if (count($this->conditions) > 0) {
$cond = implode(' AND ', $this->conditions);
$query .= ' WHERE ' . $cond;
}

if ($this->group_by != '') {
$query .= ' GROUP BY ' . $this->group_by;
}

if (count($this->orderby)) {
$order = implode(', ', $this->orderby);
$query .= "\nORDER BY " . $order;
}

if ($this->limit !== NULL && $this->offset !== NULL) {
$query .= "\nLIMIT " . $this->offset . ', ' . $this->limit;
}

return $query;
}

public function reset() {
$this->fields = '';
$this->table = '';
$this->conditions = array();
$this->join = array();
$this->group_by = '';
$this->orderby = array();
$this->limit = NULL;
$this->offset = NULL;
}

}
?>



2. Kelas CSMysqlResult : Kelas hasil dari eksekusi query yang berhasil dilakukan oleh CSMysql



<?php

class CSMysqlResult {

private $resultset;

function __construct($resultset) {
$this->resultset = $resultset;
}

public function fetch_array($result_type = MYSQL_BOTH) {
return @mysql_fetch_array($this->resultset, $result_type);
}

public function fetch_assoc() {
return @mysql_fetch_assoc($this->resultset);
}

public function fetch_row() {
return @mysql_fetch_row($this->resultset);
}

public function fetch_object() {
return @mysql_fetch_object($this->resultset);
}

public function fetch_field() {
return @mysql_fetch_field($this->resultset);
}

public function num_fields() {
return @mysql_num_fields($this->resultset);
}

public function num_rows() {
return @mysql_num_rows($this->resultset);
}
}
?>



3. Contoh Penggunaan



<?php
include_once 'CSMysql.php';

$mysql_wrapper = CSMysql::connect('localhost', 'root', '');
$mysql_wrapper->select_database('contoh_db_karyawan');

$mysql_wrapper->select(); //memilih semua field / (*)
$mysql_wrapper->from('tabel_karyawan'); //memilih tabel_karyawan
$mysql_wrapper->where('alamat', "'Bandung'"); //saring data karyawan yang beralamat di Bandung
$mysql_wrapper->orderby('id_karyawan', 'DESC'); //urutan berdasarkan id_karyawan secara descending

$r_karyawan = $mysql_wrapper->get_select();
if ($r_karyawan == FALSE) {
echo $mysql_wrapper->get_error_message() . "<br />" . "<br />";
}

if ($r_karyawan->num_rows() > 1) {
echo "<strong>Tabel Karyawan</strong>";
?>
<table border="1">
<tr>
<th>ID Karyawan</th>
<th>Nama</th>
<th>Alamat</th>
</tr>
<?php
while ($row = $r_karyawan->fetch_assoc()) {
echo '<tr>';
echo "<td>{$row['id_karyawan']}</td>";
echo "<td>{$row['nama']}</td>";
echo "<td>{$row['alamat']}</td>";
echo '<tr>';
}
?>
</table><br />
<?php
}
?>



Teknik ini terinspirasi dari teknik Active Record CodeIgniter. Namun isi kelas dan fungsi-fungsi berbeda.

http://codeigniter.com/

Kelas CSMysql memiliki beberapa kekurangan terutama dari segi keamanan karena tidak melakukan filter escape character. Kelas ini juga rentan terhadap error bila nilai yang dimasukan pada parameter tidak sesuai karena tidak dilakukan pengecekan sintaks sql terlebih dahulu.

Ini link download untuk file2 diatas. Dilengkapi dokumentasi dan contoh database
.:: You must click 'Thank You' before you can see the data contained here. ::.

mari kita diskusikan code2 diatas :onegai: agar lebih berkembang dan lebih baik lagi...
karena gw yakin kalian pasti bisa bikin yang lebih bagus dibanding yang ini,, Apalagi para master :hehe:
tapi :awas: jangan ngejunk, flamming dsb...

setanbedul
05-01-2011, 08:08 AM
public static function connect($host, $username, $password, $new_link = NULL) {
$link = @mysql_connect($server, $username, $password, $new_link);
$mysql = new CSMysql($link);
return $mysql;
} kok sy rada bingung ama yg ini ya.. soalnya kesannya berputar2 terus?!?

public function get_link_id() {
return $this->link_id;
} apa yg ini diperlukan sekali?
trus kenapa boros sampe dibutuhkan 2
*penting ini...*

en terakhir.. kenapa kamu membuatnya untuk mysql aja?

black_clavus
05-01-2011, 08:30 AM
public static function connect($host, $username, $password, $new_link = NULL) {
$link = @mysql_connect($server, $username, $password, $new_link);
$mysql = new CSMysql($link);
return $mysql;
} kok sy rada bingung ama yg ini ya.. soalnya kesannya berputar2 terus?!?

public function get_link_id() {
return $this->link_id;
} apa yg ini diperlukan sekali?
trus kenapa boros sampe dibutuhkan 2
*penting ini...*

en terakhir.. kenapa kamu membuatnya untuk mysql aja?

pertanyaan yang bagus....
Q : kenapa ada static trus ada get_link _id() ?
A : coba lihat kembali di index.php (cara menggunakan),, static digunakan untuk menginisalisasi Object, sedangkan get_link_id() digunakan agar objek yang lain dapat mendapatkan link_id yang sudah ada.

Q : trus kenapa pake static bukan pake constructor?
A : sebenarnya itu hanya teknik saja...terlihat lebih manusiawi saat ingin mengkoneksikan php ke mysql kita menggunakan fungsi connect...bukan membuat objek baru..begitu

Q : kenapa kamu buat untuk mysql aja?
A : sebenarnya saya uda ada untuk beberapa dbms lain seperti mssql dan postgre...tapi saya post yang lebih sederhana dulu dengan mysql...soalnya dengan tambahan akses dbms lain ada beberapa tambahan besar...karena sebenarnya kelas2 yang saya buat mengikuti Java (kode dalam file sedikit, tapi kelasnya banyak).

note : yang seperti ini juga sepi...ga ada yang komen :swt: gimana klo lebih rumit...

setanbedul
07-01-2011, 06:28 AM
waduh.. kl yg ini seh bisa dibilang kurang tepat
untuk programer yang memakai ini buat mysql kurasa dah cukup.. tetapi akan lebih bagus kalau kamu buat nantinya ini digunakan buat non-MYSQL

saran kk seh lebih kepada index.phpnya (contoh)

include_once 'CSMysql.php';disini bisa dibilang dah tepat... tetapi akan bagus kalau includee nya beri nama database.. ato class_db.php


$mysql_wrapper = CSMysql::connect('localhost', 'root', '');
$mysql_wrapper->select_database('contoh_db_karyawan');

namun akan lebih baik kalau kamu mmbuat $db sebagai var class kamu daripada $mysql_wrapper >> yg notabene lebih panjang nulisnya
akan lebih baik kalau yg kamu ketik bukan
CSMysql::connect('localhost', 'root', ''); tetapi
CSMysql::connect( );
why... karena belum tentu yang membaca tulisan ini ato pemula faham
*kk bisa akui kl script mysql db kk jg demikian
terakhir dan paling penting adaah ini
$mysql_wrapper->select_database('contoh_db_karyawan'); berikan nama yang nanti dapat digunakan untuk dabatase lain.. untuk contoh ini udah tepat namun akan lebih tepat kalau masuk ke connect jadi saat connect.. udah termasuk milih DBNamenya

sebenarnya kl bisa dibilang ganti nama script yg pertama database ato apalah
sedangkan script kedua
CSMysqlkarena isinya mysql
nantinya kl pilihannya bukan mysql tp postgress kamu pasti merujuk ke sana

nb:
maaf kalau bahasanya agak advance.. sy senang isinya begini. tp lebih senang kalau bisa memikirkan sampe bahasa/dataase selain MYSQL:angel4::angel4:

black_clavus
07-01-2011, 07:32 AM
:blink: :blink: :blink:

:xiexie: saya paham maksud om bedul disini...
:terharu: :terharu: :terharu:

saya akan perbaiki kembali kodenya...

:maaf: terima kasih

setanbedul
07-01-2011, 08:36 AM
bukan diperbaiki.. tetapi di kembangkan
walau sebenarnya km harus pelajar bahwa kalau kamu mencoba cara ini dengan 2 DB berbeda.. akan terlihat keanehan

btw.. tantangan aja neh.. gw punya 2 DB tetapi tablenya sama.. anggap aja table orang_ganteng
DB pertama nama2 bule
DB kedua nama2 Indonesia

pertanyaannya.. gimana menampilkan keduanya dgn benar.. ingat nama table sama jadi sqlnya sama.. hanya databasenya berbeda

dan jg km coba baca2 ttg PEAR DB

black_clavus
07-01-2011, 09:21 AM
bukan diperbaiki.. tetapi di kembangkan
walau sebenarnya km harus pelajar bahwa kalau kamu mencoba cara ini dengan 2 DB berbeda.. akan terlihat keanehan

btw.. tantangan aja neh.. gw punya 2 DB tetapi tablenya sama.. anggap aja table orang_ganteng
DB pertama nama2 bule
DB kedua nama2 Indonesia

pertanyaannya.. gimana menampilkan keduanya dgn benar.. ingat nama table sama jadi sqlnya sama.. hanya databasenya berbeda

dan jg km coba baca2 ttg PEAR DB

DBMSnya sama? :bloon:

:semangat: :semangat: baik akan saya segera coba solve......

PEAR itu sejenis php ekstention ya :iii:
:TKP:

setanbedul
07-01-2011, 10:39 AM
iya donk.. sama2 mysql
sebelum km upgrade di atas dgn script km yg berikutnya.. lebih baik coba pastikan script km ini bisa dipake 2 DB dr DBMS yg sama
nantinya kl skrip km dah update.. maka jgnkan dari 1 dbms yg sama.. dari 2 dbms berbeda juga bisa!!

black_clavus
07-01-2011, 11:03 AM
iya donk.. sama2 mysql
sebelum km upgrade di atas dgn script km yg berikutnya.. lebih baik coba pastikan script km ini bisa dipake 2 DB dr DBMS yg sama
nantinya kl skrip km dah update.. maka jgnkan dari 1 dbms yg sama.. dari 2 dbms berbeda juga bisa!!

:blink: :blink:

sebenarnya sudah terbayang...cuman masih belum ada waktu :malu:

terima kasih bimbingannya om bedul :maaf:

setanbedul
08-01-2011, 02:54 PM
sebenarnya anggap aja ini tantangan.. krn mysql entah kenapa ada problem..
*menurut yg di kaskus

en coba pake tehnik ini..tehnik u dan gw itu sama2 memakai sistem.. saat class dipanggil maka mysql di connect?!?

sekarang coba pake tehnik begini..

saat dipanggil.. mysql ngak diconnect?!?!?
tetapi hanya menyimpan data2 kayak database, server, user, pass dan db
saat kamu melakukan aksi dalam hal ini query...
baru kamu melakukan connect mysql, query
dan jangan lupa close!!


trus sebisa mungkin scriptnya

<?php
class JConfig {
//semua config ada disini
}
$db=new myDB(); //semua konfigurasi ada di class jConfig

$db->query($sql);
$data=$db->listData(); //bentuk array ato class?! terserah kamu
$totdata=$db->num(); // anggap 6

black_clavus
09-01-2011, 02:47 PM
sebenarnya anggap aja ini tantangan.. krn mysql entah kenapa ada problem..
*menurut yg di kaskus

en coba pake tehnik ini..tehnik u dan gw itu sama2 memakai sistem.. saat class dipanggil maka mysql di connect?!?

sekarang coba pake tehnik begini..

saat dipanggil.. mysql ngak diconnect?!?!?
tetapi hanya menyimpan data2 kayak database, server, user, pass dan db
saat kamu melakukan aksi dalam hal ini query...
baru kamu melakukan connect mysql, query
dan jangan lupa close!!


trus sebisa mungkin scriptnya

<?php
class JConfig {
//semua config ada disini
}
$db=new myDB(); //semua konfigurasi ada di class jConfig

$db->query($sql);
$data=$db->listData(); //bentuk array ato class?! terserah kamu
$totdata=$db->num(); // anggap 6


hmm......saya pun sebenarnya terpikir untuk memisah kelas untuk konfigurasi...

bila teknik koneksi dilakukan hanya saat melakukan query saja apakah tidak menambah waktu eksekusi.... :pusing:

tapi bisa jadi lebih efektif seperti itu.... :fufufu:

setanbedul
09-01-2011, 05:17 PM
ada 2 pikiran..
kecepatan dan flexible..
apalagi kl nanti class ini bukan main 1 database tp 2.. dan ditambah lagi enginenya bukan mysql