Minggu, 10 Juni 2012

Membuat Access Control List

Tidak ada komentar:

Tulisan ini adalah lanjutan dari tulisan sebelumnya, kali ini kita akan bahas mengenai pembuatas Access Control List dengan frame work CodeIgniter, mengingat CI sendiri secara default tidak menyediakan modul ACL.
Pada tulisan sebelumnya, saya sudah jelaskan bagan program dan struktur databasenya. Itu yang akan kita pakai, kita terapkan di CodeIgniter. Sesuai bagan tidak ada hubungan langsung dari table users ke table rules yang menyimpan list class dan methods dari aplikasi yang kita punyai.
Jadi sesuai kesepakatan di atas:
  • seorang user harus tergabung dengan 1/+ groups
  • suatu group harus memiliki 1/+ roles
  • suatu role memiliki beberapa/banyak rules sesuai roles tersebut.
Di forum CodeIgniter saya menemukan orang baik yang membagi kode untuk administrasi ACL ini. Forum bisa dilihat lengkapnya di sini http://codeigniter.com/forums/viewthread/139747/ dan source program bisa didapatkan di sini http://svn.supergluetech.com/repositories/codeigniter/acl/.
Kode program dari Dean Rantala tersebut hanyalah berupa kumpulan fungsi yang bisa memudahkan pembuatan modul ACL ini, bukan aplikasi/atau modul siapa pakai, jadi masih perlu banyak modifikasi, karena memang belum lengkap. Beliau juga tidak menyediakan hubungan sampai ke table rules, hanya sampai table roles saja. Ini optional, boleh dimanfaatkan atau tidak. Berdasarkan bagan, arsitektur, dan aturan yang kita bahas pada tulisan sebelumnya, kita bisa membuat sendiri aplikasi administrasi untuk modul ACL ini, sesuai selera.
Saya sendiri tidak akan membahas cara pembuatan modulnya, karena dari bagan sudah jelas. Saya akan membahas trik-triknya pemanfaatan aplikasi berbasis CodeIgniter kita.
Membentuk session saat login
<?php
$session_data = array(
        ’user_classes’ => $login_user_class,  //array
        ’user_class_methods’ => $login_user_class_method,  //array
        ’user_id’ => $login_user_id,
        ’user_name’ => $login_user_name,
        ’user_description’ => $user_user_description,
        ’user_logged’ => TRUE
    );
$this->session->set_userdata($session_data);
?>
Perhatikan script di atas, itu session yang kita harus bikin saat user login.
  1. user_class : array list class dari user login, data class disimpan di table rules, ini optional, bisa memudahkan saat kita membentuk section navigasi aplikasi kita berdasarkan hak user login.
  2. user_class_methods : array list kombinasi class dan method dari user login, data method disimpan di table rules juga, mutlak harus ada, kombinasi ini yang akan kita bandingkan untuk menentukan user berhak atau tidak mengakses sebuah method dari class/controller kita
  3. Data selebihnya adalah data informasi user logged, tentu saja diperlukan.
  4. Contoh array yang dibentuk bisa dilihat di bawah.
Membandingkan kombinasi current class dan current method dengan array ‘user_class_methods’ yang di simpan di session.
Harus kombinasi yang kita bandingkan, agar tidak terjadi kesalahan, karena mungkin saja dari beberapa controller kita, ada nama method/function yang sama.
<?php
    $current_class = $this->uri->rsegment(1);
    $current_method = $this->uri->rsegment(2);
    $current_class_method = $current_class . "." . $current_method;
  
    $user_class_methods = $this->session->userdata(‘user_class_methods’);
  
    if(!in_array($current_class_method, $user_class_methods)){
        die(‘maaf, anda tidak punya akses ..’);
    }
?>
Pada script di atas saya mengkombinasikan keduanya dengan karakter . (titik), tentu saja harus sesuai dengan cara pengkombinasian saat session dibentuk. Pembandingan kombinasi current class dan current method menggunakan syntax in_array native PHP.
Manfaatkan hook CodeIgniter.
Ini dia trik yang sesungguhnya, hook CI. Jika di setiap method kita selalu menambahkan sebaris script di atas untuk control user tentu tidak bagus, jadul lagi. CI menyediakan fasilitas hook, yaitu suatu function atau method yang extend core CI, dipanggil saat aplikasi CI dijalankan, silahkan baca selengkapnya di sinihttp://codeigniter.com/user_guide/general/hooks.html.
Langkah memanfaatkan hook adalah sebagai berikut:
  1. Enable hook di application/config/config.php
  2. Daftarkan hook di application/config/hooks.php
  3. Buat hooknya di folder application/hooks, untuk script hooknya sendiri saya akan sertakan di tulisan ini,lihat di bawah.
Dengan hook CI, aplikasi kita akan terlihat rapi dan jauh lebih mudah dikelola, karena mekanisme Access Control terpusat. Controller dan method kita pun jadi bersih tanpa script untuk membandingkan session login dengan curent class-method.
Selamat mencoba, dan semoga bermanfaat.
Kode untuk di pasang di application/config/hooks.php
<?php
$hook['post_controller_constructor'] = array(
                                ‘class’    => ”,
                                ‘function’ => ‘isallowed’,
                                ‘filename’ => ‘isallowed.php’, // misalnya namanya demikian
                                ‘filepath’ => ‘hooks’,
                                ‘params’   => array()
                                );
?>
Kode application/hooks/isallowed.php
<?php
function isallowed() {
    $ci =& get_instance();
    $ci->load->model(‘acl’);
  
    $user_class_methods = $ci->session->userdata(‘user_class_methods’);
    $user_classes = $ci->session->userdata(‘user_classes’);
    $user_info = $ci->session->userdata(‘user_info’);
    $user_logged = $ci->session->userdata(‘user_logged’);
  
    $current_class = $ci->uri->rsegment(1);
    $current_method = $ci->uri->rsegment(2);
    $current_class_method = $current_class . "." . $current_method;
  
    if(!$user_logged and $current_class!=’login’){
        header("location: /login");
        exit;
    }
  
    // set controller yang user selalu HARUS BOLEH akses
    $all_allowed_classes = array(‘login’, ‘logout’, ‘home’, ‘forbidden’);
  
    if(!in_array($current_class, $all_allowed_classes)){
        if(!in_array($current_class_method, $user_class_methods) and !in_array($current_class, $all_allowed_classes)){
            header("location: /forbidden"); // arahkan ke halaman khusus forbidden
            exit;
        }
    }
}
?>
Contoh array yang dibentuk, agar lebih mudah membayangkan ..
Array 'user_class_methods'
(
    [0] => groups.index
    [1] => groups.edit
    [2] => groups.users
    [3] => groups.roles
    [4] => groups.add
    [5] => groups.update
    [6] => groups.delete
    [7] => groups.set_users
    [8] => groups.set_roles
    [9] => articles.list
 dst ...
)

Array 'user_classes'
(
    [0] => groups
    [9] => home
    [10] => roles
    [17] => rules
    [22] => users
    [31] => channels
    [37] => articles

 dst ...
)
 source
Read More

PDO (PHP Data Objects)

Tidak ada komentar:

PDO Introduction

PDO (PHP Data Objects) adalah salah satu ekstensi yang disupport oleh PHP5 untuk mendefinisikan lightweight DBMS connection abstraction library atau dapat juga disebut database abstraction library. PDO digunakan untuk melakukan koneksi dengan berbagai macam database yang di support oleh PHP.
Jika anda pernah menggunakan PHP dan database MySQL anda pasti pernah menggunakan perintah-perintah sebagai berikut:
mysql_connect($host, $user, $password);
mysql_select_db($db);
Atau ketika anda menggunakan PHP dan database SQL Lite maka anda menggunakan perintah:
$dbh = sqlite_open($db, 0666);
Dengan menggunakan perintah-perintah tersebut diatas maka aplikasi yang anda buat akan terikat dengan database yang anda gunakan secara spesifik. Ketika anda akan melakukan migrasi database maka anda harus merubah seluruh script anda, dan hal ini akan sangat menyulitkan anda.
PDO menawarkan cara yang berbeda untuk bekerja dengan database secara lebih umum, dengan PDO perintah yang anda tuliskan untuk koneksi dengan database MySQL, SQLite, dan Postgree adalah sebagai berikut:
// For MySQL:
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
// For SQLite:
$conn = new PDO("sqlite:$db");
// And for PostgreSQL:
$conn = new PDO("pgsql:host=$host dbname=$db", $user, $pass);
Dengan PDO anda akan tidak perlu mengganti kode yang sudah anda buat sebelumnya ketika akan melakukan migrasi program.
Pada tutorial dibawah ini penulis akan menunjukan bagaimana cara bekerja dengan database menggunakan PDO.

Database Sample

Buat sample database yang akan digunakan pada aplikasi contoh, pertama buat database dengan nama pdokemudian buat dua table dengan nama books dan authors
mysql> create database pdo;
Query OK, 1 row affected (0.05 sec)
mysql> use pdo;
Database changed
mysql> create table books(
    -> id int primary key not null auto_increment
    -> author int not null,
    -> title varchar(70) not null,
    -> isbn varchar(20),
    -> publisher varchar(30) not null,
    -> year int(4) not null,
    -> summary text(2048));
Query OK, 0 rows affected (0.17 sec)
mysql> create table authors(
    -> id int primary key not null auto_increment
    -> firstName varchar(30) not null,
    -> lastName varchar(40) not null,
    -> bio text(2048));
Query OK, 0 rows affected (0.00 sec)
Tambahkan record kedalam table author sebagai berikut:
mysql> insert into authors(firstName, lastName, bio) values(
     -> 'Marc', 'Delisle', 'Marc Delisle is a member of the MySQL
Developers Guide');
Query OK, 1 row affected (0.14 sec)
mysql> insert into authors(firstName, lastName, bio) values(
     -> 'Sohail', 'Salehi', 'In recent years, Sohail has contributed
to over 20 books, mainly in programming and computer graphics');
Query OK, 1 row affected (0.00 sec)
mysql> insert into authors(firstName, lastName, bio) values(
     -> 'Cameron', 'Cooper', 'J. Cameron Cooper has been playing
around on the web since there was not much of a web with which to
play around');
Query OK, 1 row affected (0.00 sec)
Jika anda select semua data pada table authors maka dapt dilihat recordnya sebagai berikut:
mysql> select id, firstName, lastName from authors;
+----+-----------+----------+
| id | firstName | lastName |
+----+-----------+----------+
|  1 | Marc      | Delisle  |
|  2 | Sohail    | Salehi   |
|  3 | Cameron   | Cooper   |
+----+-----------+----------+
3 rows in set (0.03 sec)
Tambahkan record pada table books sebagai berikut:
mysql> insert into books(author, title, isbn, publisher, year, 
summary) values(
     -> 1, 'Creating your MySQL Database: Practical Design Tips and
Techniques', '1904811302', 'Packt Publishing Ltd', '2006',
     -> 'A short guide for everyone on how to structure your data and
set-up your MySQL database tables efficiently and easily.');
Query OK, 1 row affected (0.00 sec)
mysql> insert into books(author, title, isbn, publisher, year, 
summary) values(
     -> 2, 'ImageMagick Tricks', '1904811868', 'Packt Publishing
Ltd', '2006',
     -> 'Unleash the power of ImageMagick with this fast, friendly
tutorial, and tips guide');
Query OK, 1 row affected (0.02 sec)
mysql> insert into books(author, title, isbn, publisher, year,
summary) values(
     -> 3, 'Building Websites with Plone', '1904811027', 'Packt
Publishing Ltd', '2004',
     -> 'An in-depth and comprehensive guide to the Plone content
management system');
Query OK, 1 row affected (0.00 sec)

Mendesain Kode

Desain arsitektur aplikasi yang baik adalah salah satu kunci membangun aplikasi selain desain data model yang benar. Pada contoh aplikasi yang akan dibuat kali ini, pertama anda harus membuat file untuk koneksi dengan database yang akan dipanggil disetiap file yang membutuhkan koneksi dengan database.
Pertama buat file dengan nama common.inc.php yang akan berisi kode untuk koneksi dengan database. Kemudian tuliskan kodenya sebagai berikut:
<?php
/**
 *File untuk koneksi 
 */
//dbconnection string dan username/password
$connStr="mysql:host=localhost;dbname=pdo";
$user="root";
$pass="";

function showHeader($title){
?>
  <html>
  <head><title><?=htmlspecialchars($title)?></title></head>
  <body>
  <h1><?=htmlspecialchars($title)?></h1>
  <a href="books.php">Books</a>
  <a href="authors.php">Authors</a>
  <hr/>
<?php 
}

function showFooter(){
?>
  </body>
  </html>
<?php    
}

//membuat connection object
$conn = new PDO($connStr,$user,$pass);
?>
Untuk menampilkan data yang ada pada table books buat file books.php, kemudian ketikan kode berikut:
<?php
include_once 'common.inc..php';

$q = $conn->query("select * from books order by title");

showHeader('Books');
?>
<table width="100%" border="1" cellpadding="3">
<tr style="font-weight: bold">
  <td>Title</td>
  <td>ISBN</td>
  <td>Publisher</td>
  <td>Year</td>
  <td>Summary</td>
</tr>
<?php
while($r=$q->fetch(PDO::FETCH_ASSOC)){
?>
  <tr>
    <td><?=htmlspecialchars($r['title'])?></td>
    <td><?=htmlspecialchars($r['isbn'])?></td>
    <td><?=htmlspecialchars($r['publisher'])?></td>
    <td><?=htmlspecialchars($r['year'])?></td>
    <td><?=htmlspecialchars($r['summary'])?></td>
  </tr>
<?php    
}
?>
</table>
<?php
    showFooter();
?>
Jika dijalankan maka tampilannya adalah sebagai berikut :
image
Untuk menampilkan data pada table author buat halaman dengan nama authors.php, kemudian ketik kodenya sebagai berikut:
<?php
include_once 'common.inc.php';
$q=$conn->query("select * from authors order by lastname,firstname");
showHeader('Authors');
?>
<table width="100%" border="1" cellpadding="3">
<tr style="font-weight: bold">
  <td>First Name</td>
  <td>Last Name</td>
  <td>Bio</td>
</tr>
<?php
    while($r=$q->fetch(PDO::FETCH_ASSOC)){
?>
    <tr>
        <td><?=htmlspecialchars($r['firstName'])?></td>
        <td><?=htmlspecialchars($r['lastName'])?></td>
        <td><?=htmlspecialchars($r['bio'])?></td>
      </tr>
<?
    }
?>
</table>
<?php
    showFooter();
?>
image
 
Menggunakan Parameter untuk menampilkan Author
Pada contoh dibawah ini akan ditunjukan bagaimana cara untuk menggunakan parameter yang dikirimkan lewat url (query string). Buat file dengan nama authordetails.php kemudian tulis kode berikut:
<?php
include_once('common.inc.php');
 
$id = $_REQUEST['id'];
$q = $conn->query("select * from authors where id=$id");
$author = $q->fetch(PDO::FETCH_ASSOC);
$q->closeCursor();
 
if(!$author){
    showHeader('Error');
    echo "Salah memasukan id author";
    showFooter();
    exit;    
}
showHeader("Author: $author[firstName] $author[lastName]");
$q = $conn->query("select * from books where author=$id order by title");
$q->setFetchMode(PDO::FETCH_ASSOC);

?>
<h2>Author</h2>
<table width="60%" border="1" cellpadding="3">
<tr>
  <td><b>First Name</b></td>
    <td><?=htmlspecialchars($author['firstName'])?></td>
</tr>
<tr>
  <td><b>Last Name</b></td>
  <td><?=htmlspecialchars($author['lastName'])?></td>
</tr>
<tr>
  <td><b>Bio</b></td>
  <td><?=htmlspecialchars($author['bio'])?></td>
</tr>
</table>

<h2>Books</h2>
<table width="100%" border="1" cellpadding="3">
<tr style="font-weight: bold">
  <td>Title</td>
  <td>ISBN</td>
  <td>Publisher</td>
  <td>Year</td>
  <td>Summary</td>
</tr>

<?php
while($r=$q->fetch()){
?>
<tr>
      <td><?=htmlspecialchars($r['title'])?></td>
      <td><?=htmlspecialchars($r['isbn'])?></td>
      <td><?=htmlspecialchars($r['publisher'])?></td>
      <td><?=htmlspecialchars($r['year'])?></td>
      <td><?=htmlspecialchars($r['summary'])?></td>
</tr>
<?php 
}
?>
</table>
<?php
showFooter();
?>
Jalankan dengan menuliskan alamat url http://localhost/authordetails.php?id=2, anda dapat melihat hasil tampilan sebagai berikut:image
Jika id yang anda masukan tidak ada misal: http://localhost/authordetails.php?id=99 maka akan muncul halaman error-nya
image
Menggabungkan Dua Table
Pada contoh dibawah ini akan digabungkan dua table yaitu books dan authors, kemudian ketika user memilih daftar author yang ada maka detail author akan ditampilkan.

<?php
include_once('common.inc.php');

$q = $conn->query("SELECT authors.id, firstName, lastName, books.*
                   FROM authors, books WHERE author=authors.id ORDER BY title");
$q->setFetchMode(PDO::FETCH_NUM);
showHeader('Books');
?>
<table width="100%" border="1" cellpadding="3">
<tr style="font-weight: bold">
  <td>Author</td>
  <td>Title</td>
  <td>ISBN</td>
  <td>Publisher</td>
  <td>Year</td>
  <td>Summary</td>
</tr>
<?php
while($r=$q->fetch()){
?>
<tr>
    <td><a href="authordetails.php?id=<?=$r[0]?>">
    <?=htmlspecialchars("$r[1] $r[2]")?></a></td>
    <td><?=htmlspecialchars($r[5])?></td>
    <td><?=htmlspecialchars($r[6])?></td>
    <td><?=htmlspecialchars($r[7])?></td>
    <td><?=htmlspecialchars($r[8])?></td>
     <td><?=htmlspecialchars($r[9])?></td>
</tr>
<?php
}    
?>
</table>
<?php
    showFooter();
?>
image

Error Handling

PHP5 mempunyai fasilitas try..catch untuk menangani error yang terjadi, dengan PDO anda juga dapat menangkap error yang dapat terjadi, sebagai contoh tambahkan kode berikut pada file common.inc.php.
<?
function showError($message){
    echo"<h2>Error</h2>";
    echo "<p>".htmlspecialchars($message)."</p>";
    showFooter();
    exit;
}
//membuat connection object
try
{
    $conn = new PDO($connStr,$user,$pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
    showHeader('Error');
    showError("Maaf, error ditemukan.. koneksi gagal.. \n" . $e->getMessage());
}
?> 
Jika terjadi error maka akan tampil halaman sebagai berikut:
image

 

Membuat Fasilitas Edit Books

Sekarang kita akan menambahkan fasilitas untuk mengedit data pada table books, buat file dengan nama editbook.php. sebelum menambahkan kode program tambahkan dulu index pada field isbn pada table books, karena field isbn tidak boleh diisi dengan nilai yang sama.
CREATE UNIQUE INDEX idx_isbn ON books(isbn);
Kemudian ketik kode berikut pada file editbook.php
<?php
include_once('common.inc.php');

//ambil id buku
$id = (int)$_REQUEST['book'];
if($id){
    $q = $conn->query("select * from books where id=$id");
    $book = $q->fetch(PDO::FETCH_ASSOC);
    $q->closeCursor();
    $q=null;
}
else{
    //membuat buku baru
    $book=array();
}

//membuat list dari author
$author = array();
$q = $conn->query("SELECT id, lastName, firstName FROM authors ORDER BY lastName, firstName");
$q->setFetchMode(PDO::FETCH_ASSOC);
while($a=$q->fetch()){
    $authors[$a['id']]="$a[lastName], $a[firstName]";
}

if($_POST['submit']) {
      // memvalidasi setiap field
      $warnings = array();
      //title 
      if(!$_POST['title']) 
    {
        $warnings[] = 'Silahkan menginputkan book title';
    }
    // Author harus ada dalam key pada $authors array
      if(!array_key_exists($_POST['author'], $authors)) 
      {
        $warnings[] = 'Silahkan memilih author yang mengarang buku';
      }
      // ISBN harus berupa 10-digit number
      if(!preg_match('~^\d{10}$~', $_POST['isbn'])) {
        $warnings[] = 'ISBN harus 10 digits';
      }
      // Published tidak boleh kosong
      if(!$_POST['publisher']) {
        $warnings[] = 'Silahkan masukan publisher';
      }
      // Year harus 4 digits
      if(!preg_match('~^\d{4}$~', $_POST['year'])) {
        $warnings[] = 'Year harus 4 digits';
      }
      // Sumary tidak boleh kosong
      if(!$_POST['summary']) {
        $warnings[] = 'Silahkan masukan summary';
      }
      
      //jika tidak ada error
      if(count($warnings) == 0) {
        if(@$book['id']) {
              $sql = "UPDATE books SET title=" . $conn>quote($_POST['title']) . 
            ', author=' . $conn->quote($_POST['author']) . 
            ', isbn=' . $conn->quote($_POST['isbn']) . 
            ', publisher=' . $conn->quote($_POST['publisher']) . 
            ', year=' . $conn->quote($_POST['year']) . 
            ', summary=' . $conn->quote($_POST['summary']) . 
            " WHERE id=$book[id]";
    }
    else { //klo belum ada maka tambahkan data
              $sql = "INSERT INTO books(title, author, isbn, publisher,
              year,summary) VALUES(" . 
            $conn->quote($_POST['title']) . 
              ', ' . $conn->quote($_POST['author']) . 
            ', ' . $conn->quote($_POST['isbn']) . 
            ', ' . $conn->quote($_POST['publisher']) . 
            ', ' . $conn->quote($_POST['year']) . 
            ', ' . $conn->quote($_POST['summary']) . 
            ')';
    }
    try 
    {
        $conn->query($sql);
          header("Location: books.php");
          exit;
    }
    catch(PDOException $e) 
    {
        $warnings[] = 'Error: Duplikasi ISBN..';
    }
  }
}
else {
     // Form tidak tersubmit
      $_POST = $book;
}


showHeader('Edit Book');

if(count($warnings)) { 
      echo "<b>Please correct these errors:</b><br>";
      foreach($warnings as $w) 
      {
        echo "- ", htmlspecialchars($w), "<br>";
      }
}

?>

<form action="editBook.php" method="post">
<table border="1" cellpadding="3">
<tr>
    <td>Title</td>
    <td>
      <input type="text" name="title" 
           value="<?=htmlspecialchars($_POST['title'])?>">
    </td>
  </tr>
  <tr>
    <td>Author</td>
    <td>
      <select name="author">
        <option value="">Please select...</option>
        <?php foreach($authors as $id=>$author) { ?>
          <option value="<?=$id?>" 
            <?= $id == $_POST['author'] ? 'selected' : ''?>>
            <?=htmlspecialchars($author)?>
          </option>
        <?php } ?>
      </select>
    </td>
  </tr>
  <tr>
    <td>ISBN</td>
    <td>
      <input type="text" name="isbn" 
         value="<?=htmlspecialchars($_POST['isbn'])?>">
    </td>
  </tr>
  <tr>
    <td>Publisher</td>
    <td>
      <input type="text" name="publisher" 
         value="<?=htmlspecialchars($_POST['publisher'])?>">
    </td>
  </tr>
  <tr>
    <td>Year</td>
    <td>
      <input type="text" name="year" 
         value="<?=htmlspecialchars($_POST['year'])?>">
    </td>
  </tr>
  <tr>
    <td>Summary</td>
    <td>
      <textarea name="summary"><?=htmlspecialchars( 
                                    $_POST['summary'])?></textarea> 
  </td>
  </tr>
  <tr>
    <td colspan="2" align="center">
      <input type="submit" name="submit" value="Save">
    </td>
  </tr>
  </table>
  <?php if(@$book['id']) { ?>
    <input type="hidden" name="book" value="<?=$book['id']?>">
  <?php } ?>
</form>
<?php
// Display footer
showFooter();
?>
Kemudian tambahkan kode berikut pada halaman books.php
<tr>
    <td><?=htmlspecialchars($r['title'])?></td>
    <td><?=htmlspecialchars($r['isbn'])?></td>
    <td><?=htmlspecialchars($r['publisher'])?></td>
    <td><?=htmlspecialchars($r['year'])?></td>
    <td><?=htmlspecialchars($r['summary'])?></td>
    <td>
      <a href="editBook.php?book=<?=$r['id']?>">Edit</a> //tambahan
    </td>
</tr>

</table>
<a href="editBook.php">Tambah Buku...</a> //tambahan
image
Ketika link edit ditekan maka muncul tampilan dibawah ini:
image
Ketika link Tambah Buku ditekan maka tampil halaman berikut untuk menambah data:
image

Membuat Fasilitas Edit Author

Setalah membuat halaman untuk edit books maka sekarang kita akan membuat halaman untuk edit author, buat halaman dengan nama editauthor.php kemudian tambahkan kode berikut:
<?php
include('common.inc.php');

$id = (int)$_GET['author'];

if($id){
    $q = $conn->query("select * from authors where id=$id");
    $author = $q->fetch(PDO::FETCH_ASSOC);
    $q->closeCursor();
    $q=null;
}
else{
    $author=array();
}

if($_POST['submit']){
    $warnings=array();
    
    if(!$_POST['firstName']) {
        $warnings[] = 'Silahkan masukan first name';
      }

      if(!$_POST['lastName']) {
        $warnings[] = 'Silahkan masukan last name';
      }
  
      if(!$_POST['bio']) {
        $warnings[] = 'Silahkan masukan bio';
      }
  
      //jika tidak ditemukan error 
    if(count($warnings)==0){
            $sql = "update authors set firstName=".$conn->quote($_POST['firstName']).
            ",lastName=".$conn->quote($_POST['lastName']).
            ",bio=".$conn->quote($_POST['bio']).
            " where id=".$_POST['author'];
        $conn->query($sql);
        header("Location: authors.php");
    }
  
}
else { //form tidak disubmit
    $_POST=$author;
}

showHeader("Edit Author");

if(count($warnings)){
    echo "<strong>Error ditemukan :<br/></strong>";
    foreach($warnings as $w){
        echo "- ". htmlspecialchars($w), "<br/>";;
    }
}
?>

<form action="editAuthor.php" method="post">
  <table border="1" cellpadding="3">
  <tr>
    <td>First name</td>
    <td>
      <input type="text" name="firstName" 
           value="<?=htmlspecialchars($_POST['firstName'])?>">
    </td>
  </tr>
  <tr>
    <td>Last name</td>
    <td>
      <input type="text" name="lastName" 
           value="<?=htmlspecialchars($_POST['lastName'])?>">
               </td>
  </tr>
  <tr>
    <td>Bio</td>
    <td>
      <textarea name="bio"><?=htmlspecialchars($_POST['bio'])?>
      </textarea> 
    </td>
  </tr>
  <tr>
    <td colspan="2" align="center">
         <input type="submit" name="submit" value="Save" />
    </td>
  </tr>
  </table>
 
    <input type="hidden" name="author" value="<?=$_POST['id']?>" />

</form>
<?php
// Display footer
showFooter();
?>
Kemudian pada halaman author.php tambahkan kode untuk link ke halaman editauthor sebagai berikut:
<tr>
    <td><?=htmlspecialchars($r['firstName'])?></td>
    <td><?=htmlspecialchars($r['lastName'])?></td>
    <td><?=htmlspecialchars($r['bio'])?></td>
    <td>
      <a href="editAuthor.php?author=&lt;?=$r['id']?>">Edit</a>
    </td>
</tr>

untuk lebih lengkapnya lihat source
Read More

Selasa, 24 Januari 2012

Text mengikuti objek pada Corel Draw

Tidak ada komentar:
Membuat text mengikuti bentuk suatu objek munkin sudah banyak tutorial yang membahas tentang ini, tapi tak apalah buat berbagi pada orang orang yang nyasar di blog saya ini hehhe.
langsung saja buka Corel Draw dan lakukan tahapan seperti di bawah ini. Selamat mencoba.


Buat objek lingkaran
 1. buatlah objek lingkaran


2. Buat text dan  letakan cunsor pada objek lingkaran.



3. Untuk memutar posisi text pindahkan cunsor pada di bawah text sampai terlihat titik berwarna merah dan kerakan sesuai posisi yang di inginkan.


 4. Untuk memisahkan text dari objek lingkaran langsung saya klik text kemudian Arrange > Break Text   Apart.


5.text telah berhasil di pisahkan dari objek lingkaran.

Read More

Senin, 23 Januari 2012

Perfesioner

Tidak ada komentar:
perpect
Perfeksioner pertama mendengar kata kata ini saya merasa aneh dan bertanya-tanya apa sih artinya? setelah mencari-cari dari beberapa sumber di google akhirnya saya dapat meyimpulkan bahwa perfeksionis merupakan suatu karakter sesorang yang ingin selalu tampil sempurna dan terbaik dalam segala hal. ya, mungkin di satu sisi ini baik untuk memotifasi seseorang untuk menjadi yang terbaik tapi apakah yang terjadi bila orang yang memiliki sifat ini tidak mendapatkan yang di inginkan sesuai dengan yang di harapkan. frustasi, putus asa, menyalahkan dirisendiri, meyalahakan perbuatan yang di lakukan di masa lalu kenapa dulu tidak ini tidak itu, menyalahakan orang lain atas ketidak ketidak sempurnaan yang di harapkan.
orang-orang yang memiliki ini cenderung mengangap suatu memandang hidup ini terlalu serius. bahkan ketika berada dalam keadaan tidak bisa melakukan yang di inginkan engan untuk bertanya maupun meminta bantuan kepada orang lain, mereka menganggap bisa melakukan sendiri.
bahkan di beberapa artikel yang saya baca sifat seperti ini dapat memicu penyakit fisik dan memperpendek umur seperti yang di tulis pada artikel yang di tulis portal berita detik.com dan vivanews.com.
mempunyai keinginan menjadi sempurna itu tidak salah tapi jangan sampai berlebihan apalagi kalau berambisi ingin sempurna di berbagai hal. ingatlah tidak ada ada manusia yang sempurna di dunia ini, setiap manusia mempunyai keahlianya di bidangnya masing masing dan jangan engan meminta bantuan pada orang yang lebih ahli.

cara mengatasi atau menghilangkan sikap Perfesioner  :

1. Jangan terlalu serius
dalam hidup serius itu penting tapi jika berlebihan serius dan tidak mau merilekskan pikiran dampaknya akan menjadi tidak baik. orang yang terlalu serius memandang hidup akan lebih besar mengalami stress, depresi, insomia, bahkan sampai gangguan fisikologi lainya.

2. Berinteraksi sosial
manusia memang di ciptakan sebagai mahluk sosial. hidup bersama, dan menjalani aktifitas bersama pula.
lihatlah orang-orang yang hidup berkecukupan tapi kekurangan dan haus akan interaksi sosial mereka, mungkin kita akan melihat hidup mereka sangat bahagia tapi coba tanyakan pada mereka apakah mereka merasa bahagia, jawabanya jelas saja tidak. Mereka akan sangat merasa kesepian.
dan coba lihatlah mereka yang mempunyai interaksi sosial yang baik. mereka akan sangat nyaman dalam hidupnya berada di sekitar orang-orang yang perduli dan orang-orang yang mempunyai tingkat interaksi sosial tinggi juga akan mempunya kesempatan mendapatkan karir yang baik.
selain mendapatkan kebagian melakukan interaksi sosial juga membuat kita sadar akan kemampuan setiap manusia. manusia tidak akan bisa melakukan apa saja yang mereka inginkan.

3. Mendekatkan diri kepada sang Pencipta
sebenernya inilah ini agar kita menjadi manusia yang dapat berbahagia di dunia dan akhirat.
dengan mendekatkan diri kepada sang Pencipta kita akan sadar manusia itu sangatlah rendah, tak memiliki kemampuan apapun kecuali atas kehendaknya.
ingatlah sebenarnya Allah berkendak atas semua yang terjadi di kehidupan ini. jadi jika kita gagal tak ada yang perlu di sesali karena semua sudah di atur oleh sang Pencipta. Hal yang terpenting adalah usaha soal hasil tak perlu terlalu di pikirkan yang utama kita sudah mempunyai tujuan dari apa yang sudah kita kerjakan.


Hidup ini seperti sebuah video game dimana untuk mencapai tujuan kita harus melewati beberapa level dan setiap level mempunyai tantangan tersendiri dimana semakin tinggi level itu semakin berat pula tantangan yang harus di hadapi jika kita kalah pada suatu level kita bisa mencobanya kembali belajar dari pengalaman dan ketika kita bisa melewati rintangan dalam level tersebut kita juga akan semaki kuat.


Read More

Sabtu, 21 Januari 2012

Pantai Sudak, Yogyakarta

Tidak ada komentar:
Sundak dari atas tebing
Liburan telah tiba, mungkin pantai merupakan pilihan liburan murah yang banyak menarik perhatian masyarakat Indonesia khususnya mahasiswa yang semua ingin murah tapi berkualitas :D.
kali ini pantai yang bernama Sundak menjadi pilihan penulis dan kawan-kawan untuk belibur. pantai yang terletak di kabupaten Wonosari, Yogyakarta ini telah banyak mengalami perubahan setelah kurang lebih setahun lamanya tak berkunjung kesana.
pantai yang dulunya belum terjamah dan kurang perhatian dari pemerintah kini sudah banyak terjadi pembagunan fasilitas pedukung untuk para wisatawan yang berkunjung kesana. mulai di tata pantai yang bersih dan banyak tempat tempat yang di sewakan untuk para pengunjung untuk berteduh.
kata para penduduk disana si pantai ini memang sedang di lakukan proyek pariwisata agar tidak kalah dengan pantai yang ada Bali dan pulau Lombok.
ya, memang tidak salah kalau ingin di tandingkan dengan pantai yang ada di pulai Dewata itu, indonesia memang punya banyak pantai yang saat indah tapi mungkin prasarana penunjang untuk menuju ke pantai itu yang kurang mendukung pantai-pantai lain di Indonesia kurang pengunjung. seperti pantai Sundak ini, untuk bisa sampai ke pantai ini saja kurang lebih memelukan waktu dua jam bila di tempuh dengan motor apalagi bagi para pendatang dari luar Jogja, angkutan umum yang kesana saatlah susah di dapatkan bila ada pun di perlukan biaya yang tidak murah. kalau di lihat dari pemandangan alamnya saya lebih memilih pantai Sundak ini. memang pantai di daerah Wonosari yang terletak di daerah selatan pulau jawa dan bertemu langsung dengan samudra Hindia memang memiliki pesona alam yang saat indah. pantai yang terdapat tebing tebing menjulang tinggi.
keindahan ini lebih terasa bila para pengunjung melihat lautan dari atas tebing.
tapi selain keindahan itu pantai selatan ini juga cukup berbahaya karena ombaknya yang terkenal cukup besar.
munkin anda berpikir itu bagus untuk beselancar, kalau soal ini saya saat tidak menganjurkan. karena di bawah air terdapat palung laut dan karang karang yang berserakan jadi saat bahaya bila di gunakan untuk berselancar tau berenang.
yang bagi yang belibur kesana cukup dengan menikmati keindaan alam dan bermain air di pinggir pantai sudah meyenangkan hati. dan jangan lupa untuk mengabadikan liburan dengan berfoto foto ria.




Lihat Peta Lebih Besar
Read More

Rabu, 04 Januari 2012

Era Netbook belum berakhir di 2012

Tidak ada komentar:


Mungkin tahun 2012 banyak yang memprediksi era Netbook akan di gantikan oleh tablet PC.
ya, memang pendapat itu tak sepenuhnya salah jika di lihat peforma table PC yang sekarang sudah jauh meningkat serta tingkat portabilitas yang tinggi dan harga yang mulai terjangkau membuat orang mulai beralih ke tablet PC apalagi pada tahun 2012 ini kabarnya ubuntu sudah akan ikut terjun ke pasaran tablet PC dan smartphone sehingga tidak ada dominasi android pada gadget ini.
tapi awal tahun 2012 ini intel mengeluarkan prosesor varian Atom terbaru untuk Netbook yang merupakan versi hemat energi sehingga dapat membuat daya tahan netbook menjadi lebih lama dan menjadi nilai plus pagi para pengguna untuk setia dengan komputer mini ini.
Sistem operasi, mungkin hal inilah yang membuat orang masih bertahan menggunakan Netbook berbasis Windows untuk mengerjakan tugas yang tidak bisa di kerjakan oleh tablet yang berbasis android maupun Ipad yang berbasis IOS.
misalnya saja pekerjaan yang menggunakan Corel, Photoshop maupun Pemograman yang masih bisa di kerjakan oleh Netbook.
untuk para mahasiswa menggunakan Netbook merupakan suatu pilihan yang bijak, karena dengan menggunakan Netbook saja sudah cukup untuk menyelesaikan tugas-tugas kampus maupun sekedar hiburan di kost untuk menghilankan sepi.
selain daya tahan yang semakin lama. di prediksi Netbook dengan menggunakan prosesor Atom terbaru akan menjadi lebih tipis dari sebelumnya sehingga tingkat portabilitas makin tinggi.

Read More

Computer yang soleh

Tidak ada komentar:
Computer yang soleh, emh judul yang kelihatannya tak berlebihan bila komputer kita dapat mengingatkan waktu sholat dan membunyikan suara merdu azan dari speaker komputer. ya, asalkan speakernya gak di matiin.
agar komputer dapat menjadi soleh atau dalam hal ini dapat mengingatkan pemiliknya dengan waktu sholat perlu menginstall sebuah softaware yang bernama Shollu. software ini akan memperlihatkan waktu sholat dan ketika waktu sholat telah datang maka suara azan akan di kumandangkan oleh Muazin digital kita:)


dan mudah-mudah dengan adanya software ini para muslim yang menggunakan komputer tidak lupa melakukan ibadah sholat dan tidak terlena dengan keasikan teknologi apalagi kalau sedang main game dan asik chatingan. :)
Read More

Aplikasi android di windows

Tidak ada komentar:
suka dengan game-game android maupun aplikasi android lainya. tapi masalahnya gak punya hp android. tak perlu repot-repot maupun bersusah payah mengumpulkan uang untuk membeli Android.
dengan menggunakan sebuah software yang bernama Bluestack. anda bisa menjalankan game-game android di komputer Windows anda, memang jika di bandingkan dengan menjalankan game di android terasa berbeda karena jika di gunakan di komputer kita tidak bisa memaksimalkan fungsi seperti layar sentuh, getar dan GPS seperti yang ada di hp Android tapi untuk sekedar mencoba dan buat iseng-iseng aplikasi ini tak salah menjadi pilihan alternatip.
untuk mendownload aplikasi bluestack silakan klik disini
Read More