Selasa, 29 Desember 2009

Zend_Db: Akses database MySQL

Zend_Db adalah class yang digunakan untuk mengakses database. Pada contoh kode, saya akan mendemonstasikan bagaimana menggunakan Class ini mengakses database MySQL.

Asumsikan kita memiliki tabel 'books':
-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Dec 29, 2009 at 11:06 
-- Server version: 5.1.37
-- PHP Version: 5.3.0

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `testosteros`
--

-- --------------------------------------------------------

--
-- Table structure for table `books`
--

CREATE TABLE IF NOT EXISTS `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `judul` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `books`
--

INSERT INTO `books` (`id`, `judul`) VALUES
(1, 'Sengsara membawa nikmat'),
(2, 'Menculik anak perawan');


Penggunaan Zend_Db pada artikel ini adalah menggunakannya langsung pada controller dan kita tidak menggunakan model.

<?php

require_once 'Zend/Db/Adapter/Pdo/Mysql.php'; 
Zend_Loader::loadClass('Zend_Controller_Action');
class databaseController extends Zend_Controller_Action {
 public function indexAction() { 
  try {
   $db = new Zend_Db_Adapter_Pdo_Mysql(array (
    'host' => 'localhost',
    'username' => 'root',
    'password' => '',
    'dbname' => 'testosteros'
   ));
  }
  catch(Zend_Db_Exception $e) {
   echo $e->getMessage();
  }
  $sql = 'select * from books';
  $result = $db->fetchAll($sql);
  
  
  
  
  foreach($result as $res) {
   echo '</br>';
   foreach($res as $d1) {
    echo $d1 . '&nbsp;';
   }
  }
  
 }
}

?>

Kode kita dimulai dengan meng-include-kan Zend/Db/Adapter/Pdo/Mysql.php . Class ini lah yang kita gunakan untuk berusan degan MySQL.

Pada indexAction kita melakukan instantiate Zend_Db_Adapter_Pdo_Mysql  . Kita menggunakan array yang berisi host, username, password dan nama database yang kita gunakan pada argumen konstruktor. Kita tempatkan dalam blok try agar mendapatkan laporan jika terjadi kesalahan (exception).

Untuk melakukan Query kita menggunakan function fetchAll() dengan argumen statement SQL. Fungsi ini mengembalikan (return) array - array dari tabel. Karena itu lah kita menggunakan foreach bersarang (nested) untuk melakukan pemformatan output.


Output Program

Artikel ini hanyalah contoh sangat sederhana menggunakan Zend_Db, penasaran? Ayo mainkan jari Anda dan mulailah mengetik kode.

Sabtu, 26 Desember 2009

Zend Framework: Mengambil data dari form HTML.

Input form HTML pada Zend Framework dikelola oleh class Zend_Controller_Request_Http. Penggunaan class ini cukup sederhana.

Asumsikan kita memiliki sebuah form HTML:
<form action="form/process" method="post" name="main">
<input id="data" name="data" type="text" />
 <input id="submit" name="submit" type="Submit" value="Analyze" />

</form>

Kita ingin mengambil input dari text box dengan nama "data":
$request = new Zend_Controller_Request_Http();
$frm_input = $request->getParam("data");
echo $frm_input;

Buat instance dari class Zend_Controller_Request_Http, lalu gunakan function getParam() dengan parameter nama input (dalam hal ini "data"). Fungsi ini akan mengembalikan nilai input text box tersebut. Namun input yang dikembalikan belum tersanitasi. Jika input berupa kode HTML, kode tersebut belum ter-escape.

Untuk melakukan sanitasi input, dalam hal ini melakukan escaping kode HTML, maka gunakanlah fungsi Zend_Filter::filterStatic() seperti contoh di bawah:
$frm_escape = Zend_Filter::filterStatic($frm_input, 'HtmlEntities');
echo "<p>Sanitation: " . $frm_escape;

Happy Hacking, jangan biarkan input tanpa sanitasi!

Hello Zend Framework (Versi Windows)

Menginstall Zend Framework pada dasarnya cukup sederhana. Tidak dibutuhkan skrip instalasi atau konfigurasi database. Yang kita butuhkan adalah mengikuti serangkaian aturan yang sering disebut konvensi. Aturan-aturan ini dibutuhkan oleh Zend Framework dan harus diikuti.

1. Download Zend Framework di: http://framework.zend.com/download/current/
Zend Framework terdiri dari versi full lengkap dengan Dojo Toolkit dan Demo sedangkan versi minimal yang hanya terdiri dari komponen-komponen utama Zend Framework. Dalam hal ini saya lebih memilih versi minimal. Saya tidak membutuhkan semua library dan tentu saja ukuran file-nya jauh lebih kecil.

2. Ekstrak file hasil download.
Setelah diekstrak, Anda akan menemukan file:
INSTALL.txt
README.txt
LICENSE.txt
Serta dua buah direktori
bin
library


Hasil ekstraksi Zend Framework 


Singkatnya, fokuslah pada direktori "library" karena didalam direktori inilah  Zend Framework berada.

3. Persiapkan struktur direktori.
Dalam Zend Framework, kita melakukan pemisahan file. File mana yang diakses secara langsung oleh Web Server (dalam hal ini berada dalam www_root atau htdocs) dan file yang diakses melalui kode. Idealnya Zend Framework tidak diakses langsung oleh Web Server, melainkan diakses melalui Call Pada kode.

Zend Framework memiliki sejumlah konvensi terkait hal ini.
  • Fungsionalitas Zend Framework diakses oleh sebuah file (index.php) yang dikenal sebagai file bootstrap.
  • Zend Framework memiliki konvensi struktur dan penamaan direktori yang lokasinya harus didefenisikan pada file bootstrap.
  • Seperti halnya direktori, juga ada konvensi penamaan dan peletakan file. 
  • Zend Framework mengusung konsep MVC (Model, View, Controller). 
Saya asumsikan kita menggunakan XAMPP sebagai web server. Dan htdocs berada di
C:\xampp\htdocs
maka kita buat direktori kerja kita di luar direktori htdocs.

Sesuai dengan konvensi, buat lah direktori untuk aplikasi Anda (perhatikan contoh).
C:\Web

Buat direktori App dibawah direktori Web. Disinilah sebenarnya letak aplikasi Anda.
C:\Web\App

Copy direktori "library" hasil ekstrak paket Zend Framework ke direktori
C:\Web

Setelah itu masuk ke direktori
C:\Web\App

dan buat direktori-direktori dibawah ini:

models
views
controllers

Diretori diatas adalah konvensi Zand Framework yang akan mencari file model, view dan controller Anda pada lokasi tersebut. 

Sehingga direktori kerja Anda menjadi:
C:\Web
C:\Web\App
C:\Web\library
C:\Web\library\Zend
C:\Web\App\models
C:\Web\App\views
C:\Web\App\controllers 
 
Direktori C:\Web

Direktori C:\Web\App

Sampai pada tahap ini, proses instalasi Zend Framework sudah selesai. Anda sudah siapkan direktori kerja, begitu juga dengan library Zend dan direktori App.

Perlu diingat, Anda dapat meletakkan library-library tambahan untuk aplikasi Anda di dalam direktori "library". Sedangkan direktori "models", "views" dan "controllers" adalah konvensi Zend Framework tempat dimana Zend akan mencari lokasi file model, view dan controller yang Anda buat.

Setelah menginstall Zend Framework, mari kita buat aplikasi sederhana dan sesuai "konvensi" programmer seluruh dunia, aplikasi pertama kita adalah mencetak tulisan "Hello World".

1. Bootstrap file
File bootstrap sederhananya adalah file "index.php" yang terletak pada webroot Web Server (htdocs). File inilah yang melakukan konfigurasi awal Zend Framework.
Buatlah file index.php dan letakkan pada direktory htdocs:
<?php 

/* Setting parameter PHP untuk melaporkan semua error. Tidak digunakan dalam production */
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', true);

/* set direktori aplikasi dan library */
$lib_paths = array();

$lib_paths[] = "c:/Web/library";
$lib_paths[] = "c:/Web/App";

$inc_path = implode(PATH_SEPARATOR, $lib_paths);
set_include_path($inc_path);

/* Load class-dasar dasar yang dibutuhkan */
require_once 'Zend/Loader.php';
require_once 'Zend/Controller/Front.php';

/* kode ini diletakkan dalam blok try agar mempermudah kita debugging */
try {
Zend_Loader::loadClass('Zend_Controller_Front');
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setParam('noErrorHandler', true);
$frontController->setControllerDirectory('C:/Web/App/controllers');

$frontController->dispatch();
}

/* catch jika terjadi exception dan laporkan */
catch (Exception $exp) {
$contentType = 'text/html';

header("Content-Type: $contentType; charset=utf-8");
echo 'exception!!';
echo '<h2> ' . $exp->getMessage() . '</h2><br/> <pre>';
echo $exp->getTraceAsString();
}

?>

Perhatikan code diatas dan jangan lupa komentarnya. File bootstrap melakukan beberapa fungsi dasar yaitu:
  • Set "Include Path" sehingga PHP dapat menemukan kode-kode kita.
  • Load class-class dasar.
  • Konfigurasikan / persiapkan Zend Framework melalui front controller
Setelah mempersiapkan bootstrap, buatlah file aplikasi Anda dengan mengikuti kaidah MVC. Buat lah file PHP untuk Model, View dan Controller. Karena aplikasi "Hello World" ini sangat sederhana, maka kita tidak membutuhkan database dan tidak perlu membuat Model.

2. Controller
Konvensi Zend Framework mewajibkan setiap class controller untuk diberi nama *Controller dan berada didalam file *Controller.php . Sehingga jika Anda membuat controller dengan nama "index", maka nama class haruslah "indexController" dan berada dalam file "indexController.php"

Di dalam kelas controller, Anda dapat menambahkan Action. Yaitu kode yang akan diproses jika mendapat request dari browser.

Misalnya jika ada request ke: " http://localhost/index/halo " maka jika dilihat dari sudut pandang Zend Framework adalah: Eksekusi Action "haloAction" yang berada dalam class (controller) "indexController".

Kembali ke aplikasi kita, buatlah file indexController.php dan simpan di direktori: C:\Web\App\controllers sebelumnya saya ingatkan lagi, penamaan file dan peletakan file adalah konvensi yang harus diikuti.

File indexController.php:
<?php

Zend_Loader::loadClass('Zend_Controller_Action');
class indexController extends Zend_Controller_Action {
 public function indexAction() {}
}

?>


Kita telah membuat sebuah controller dengan nama "indexController" yang memiliki sebuah action yang bernama "indexAction". Pada dasarnya controller adalh sebuah class yang diturunkan dari class "Zend_Controller_Action". Sedangkan action pada dasarnya adalah sebuah function.

Seperti yang terlihat pada contoh kode diatas, action yang kita buat adalah sebuah fungsi kosong. Kita tidak melakukan apa-apa pada action ini melainkan hanya menampilkan tulisan "Hello World" dan akan kita defenisikan pada view.

3. View
View mendefenisikan presentation. Atau tampilan dan pada konteks Web adalah kode HTML. Sekarang kita akan membuat view untuk indexAction yang telah didefenisikan sebelumnya.

Buatlah file dengan nama: "index.phtml" dan simpan dalam direktori: C:\Web\App\views\scripts\index\ :
<center><h1>HELLO WORLD!!</h1></center>

View yang kita buat, relatif terhadap nama Action. Dan disimpan didalam direktori yang relatif terhadap nama Controller. Jadi view index.phtml relatif terhadap indexAction dan disimpan di dalam direktori C:\Web\App\views\scripts\index relatif terhadap indexController.

Seandainya Anda membuat view untuk action "aboutAction" yang berada dalam kontroller "infoController", maka view harus diberi nama "about.phtml" dan disimpan di dalam direktori C:\Web\App\views\scripts\info .

4. .htacces
Kita akan membuat file .htaccess yang akan melakukan routing semua request kecuali resource (gambar, javascript, stylesheet, dll) diarahkan ke index.php . Lalu front controller akan mengambil alih dari sini.

File .htaccess:
RewriteEngine on
RewriteRule !\.(js|ico|txt|gif|jpg|png|css)$ index.php

Simpan file tersebut dalam direktori wwwroot (htdocs).

Sekarang semuanya sudah selesai, silahkan akses applikasi Anda di: http://localhost/index/index


HELLO WORLD!!

Anda dapat juga mengakses aplikasi ini langsung ke: http://localhost tanpa menambahkan /index/index karena akan secara otomatis diarahkan oleh Zend Framework.

Memang jika diperhatikan membangun aplikasi menggunakan Zend Framework terkesan rumit dan berbelit. Ya, jika Anda membangun aplikasi sangat sederhana seperti contoh diatas. Namun akan lain halnya jika Anda membangun aplikasi dengan skala yang lebih besar. Komponen-komponen Zend Framework akan sangat memudahkan Anda dan mempersingkat waktu pengembangan aplikasi.

Happy Hacking!!

Jumat, 25 Desember 2009

Nature is a labyrinth

Nature is a labyrinth in which the very haste you move with will make you loose your way.