PHP Pagination Basic

Tuesday, March 04, 2014

Rujukan ringkas untuk membuat paging di PHP.

<table class="table table-hover table-condensed">
 <thead>
 <tr>
  <th>title</th>
  <th>title</th>
  <th>title</th>
 </tr>
 </thead>
 <tbody>
<?php
$limitrekod=200; // 200 data akan dipaparkan dalam satu page.
if (isset($_GET["page"])) { $page  = $_GET["page"]; } else { $page=1; }; 
$start_from = ($page-1) * $limitrekod; 

$sql = "SELECT .... 
 LIMIT $start_from, $limitrekod";
$result = mysql_query($sql,$con);
while($row = mysql_fetch_array($result))
{
?> 
 <tr>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
  <td><?php echo $row['xxx']; ?></td>
 </tr>
<?php 
$runno++;
}
?>
 </tbody>
</table>

<!-- mula untuk pagination -->
<?php  
$sqlpg = "SELECT ...."; //select tanpa limit  
$rs_result = mysql_query($sqlpg,$con);
$total_records = mysql_num_rows($rs_result); 
$total_pages = ceil($total_records / $limitrekod); 
?>
<ul class="pagination mtm mbm">
 <li class="<?php if($page == 1) echo "disabled"; ?>"><a href="viewdata.php?page=1">«</a></li>
<?php 
for ($i=1; $i<=$total_pages; $i++) { 
?>
 <li class="<?php if($page == $i) echo "active"; ?>"><a href="viewdata.php?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php 
};
?>
 <li class="<?php if($page == $total_pages) echo "disabled"; ?>"><a href="viewdata.php?page=<?php echo $total_pages; ?>">»</a></li>
</ul>

Hasilnya akan dapat seperti di bawah

Jika datanya ada sejuta, maka akan terpaparlah butang page sebanyak (1000000/200) = 5 ribu butang.

Bagi data yang tidak banyak, sesuailah code di atas digunakan. Jika data yang terlalu banyak, perlu diringkaskan cara paparan paging tersebut.

File System PHP

Tuesday, January 28, 2014

Kegunaan fungsi file system di PHP

Nama FungsiKeterangan
basenameMenghasilkan nama file dari satu path
chmodMengubah mode akses file
chownMengubah pemilik file
copyMeng-copy file
dirnameMenghasilkan nama direktori dari suatu path file
disk_free_spaceMenampilkan baki space disk pada satu direktori
disk_total_spaceMenghasilkan jumlah size direktori
fcloseMenutup file yang dibuka
fgetcMengambil karakter-karakter dalam satu file teks
fgetsMengambil baris-baris dari file
file_existsPastikan satu file atau direktori wujud atau tidak
file_get_contentsMembaca isi file keseluruhan
file_put_contentsMenulis teks ke file
fileMembaca isi file ke dalam array
fileatimeMendapatkan waktu akses terakhir suatu file
filesizeMendapatkan ukuran file
filetypeMendapatkan tipe file
fopenMembuka file atau URL
is_dirPastikan satu filename itu adakah satu direktori
is_executablePastikan apakah filename boleh di execute
is_filePastikan apakah filename itu adakah satu file
is_readablePastikan filename boleh dibaca
is_writablePastikan filename boleh ditambah kemaskini kontennya
mkdirMembuat direktori
move_uploaded_fileMemindahkan file yang diupload ke lokasi baru
renameRename file atau direktori
rmdirPadam direktori
unlinkPadam file

basename

Fungsinya : Menghasilkan nama file dari suatu path
Sintaks php :
basename ( string $path [, string $suffix ] )
Parameter :
$path, adalah alamat file dengan lokasi direktorinya, contoh : /var/www/gambar/fileku.jpg
$suffix, akan menghilangkan akhirannya sesuai string $suffix

Contoh penggunaan: 
$path = "/home/httpd/html/index.php";
$file = basename($path);
echo $file;                         //Hasilnya index.php

$file = basename($path, ".php");
echo $file;                         //Hasilnya index
?>

chmod

Fungsinya : Mengubah mode akses file, untuk linux, unix
Sintaks php :

chmod ( string $filename , int $mode )
Contoh penggunaan :
// Read dan write hanya untuk pemilik
chmod("/direktori/filesaya", 0600);
// Pemilik boleh buat apa sahaja, read dan execute untuk others
chmod("/direktori/filesaya", 0755); 
?>

chown

Fungsinya : Mengubah pemilik file
Sintaks php :
chown ( string $filename , mixed $user )
Contoh penggunaan:
$file_name= "foo.php";
$path = "/home/sites/php.net/public_html/sandbox" . $file_name ;
$user_name = "root";
// Set pemilik file
chown($path, $user_name);
?>

copy

Fungsinya : Mengcopy file
Sintaks php :
copy ( string $source , string $dest [, resource $context ] )
Parameter :
$source , adalah file yang akan dicopy
$dest, adalah file tujuan
Contoh penggunaan :
$file = 'upload.php';
$newfile = 'uploadcopy.php';
if (!copy($file, $newfile)) {
    echo "gagal copy file $file...\n";
}else{
    echo "File $file berhasil di copy";
}
?>

dirname

Fungsinya : Menghasilkan nama direktori dari suatu path file
Sintaks php :
dirname ( string $path )
Contoh penggunaan :
$path = "/www/gambar/pic.jpg";
$file = dirname($path);
echo $file;
//Hasilnya /www/gambar
?>

disk_free_space

Fungsinya : Menghasilkan sisa space disk suatu direktori (dalam bytes)
Sintaks php :
disk_free_space ( string $directory )
Contoh penggunaan :
//linux, unix
$df = disk_free_space("/"); 
//Windows:
echo disk_free_space("C:");
echo disk_free_space("D:");
?>

disk_total_space

Fungsinya : Menghasilkan total size direktori (dalam bytes)
Sintaks php :
disk_total_space ( string $directory )
Contoh penggunaan :
//linux , unix
$df = disk_total_space("/");

//Windows:
echo disk_total_space("C:");
echo disk_total_space("D:");
?>

fclose

Fungsinya : Menutup file yang dibuka
Sintaks php :
fclose ( resource $handle )
Contoh penggunaan :
$file = fopen('somefile.txt', 'r');
fclose($file);
?>

fgetc

Fungsinya : Mengambil karakter-karakter suatu file teks
Sintaks php :
fgetc ( resource $handle )
Contoh penggunaan :
Misal anda punya filesaya.txt, yang isinya : 
namaorang
$fp = fopen('filesaya.txt', 'r');
if (!$fp) {
    echo 'filesaya.txt tidak ada';
}
while (false !== ($char = fgetc($fp))) {
    echo "$char";
}
?>
Hasilnya : n a m a o r a n g

fgets

Fungsinya : Mengambil baris-baris dari file
Sintaks php :
fgets ( resource $handle [, int $length ] )
Parameter :
$handle, adalah file yang akan diambil barisnya
$length, adalah panjang/ukuran file, isi aja kira kira yang melebihi panjang file
Contoh penggunaan :
$handle = @fopen("filesaya.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 1000000);
        echo $buffer;
    }
    fclose($handle);
}
?>

file_exists

Fungsinya : Cek apakah file atau direktori tersebut ada
Sintaks php :
file_exists ( string $filename )
Contoh penggunaan :
$filename = 'filesaya.txt'; 
if (file_exists($filename)) {
    echo "File $filename ada";
} else {
    echo "File $filename tidak ada";
}
?>

file_get_contents

Fungsinya : Membaca isi file/ web keseluruhan menjadi string
Sintaks php :
file_get_contents ( string $filename [, int $flags= 0 [, resource $context [, int $offset= -1 
[, int $maxlen= -1 ]]]] )
Parameter :
$filename, file atau web yang akan dibaca isinya
Contoh penggunaan :
$homepage = file_get_contents('http://ayus80.blogspot.com/');
echo $homepage;
?>

file_put_contents

Fungsinya : Menulis teks ke file
Sintaks php :
file_put_contents ( string $filename , mixed $data [, int $flags= 0 [, resource $context ]] )
$filename, file yang akan ditulis
$data, data yang akan ditulis ke file, boleh string atau array
$flags, option, FILE_APPEND (jika file sudah ada, teks akan ditambahkan)
Contoh penggunaan :
$file = 'data.txt';
$nama = 'nama orang';
file_put_contents($file, $nama);
?>
Contoh di atas akan membuat file data.txt dan menuliskan 'nama orang' di dalam data.txt

file

Fungsinya : Membaca isi file perbatis, dimasukkan ke dalam array
Sintaks php :
file ( string $filename [, int $flags= 0 [, resource $context ]] )
Parameter :
$filenama, file yang akan dibaca isinya
$flags, option :
  • FILE_IGNORE_NEW_LINES  : Jangan tambahkan baris baru di akhir elemen array
  • FILE_SKIP_EMPTY_LINES  : Abaikan baris yang kosong
Contoh penggunaan :
$lines = file('filesaya.txt');
print_r($lines);
?>

fileatime

Fungsinya : Mendapatkan waktu akses terakhir suatu file
Sintaks php :
fileatime ( string $filename )
Contoh penggunaan :
$filename = 'filesaya.txt';
if (file_exists($filename)) {
    echo "$filename terakhir kali diakses pada: ";
 echo date("F d Y H:i:s.", fileatime($filename));
}
//filesaya.txt terakhir kali diakses pada: January 28 2014 10:02:12
?>

filesize

Fungsinya : Mendapatkan ukuran file
Sintaks php :
filesize ( string $filename )
Contoh penggunaan:
$filename = 'filesaya.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
?>

filetype

Fungsinya : Mendapatkan tipe file
Sintaks php :
filetype ( string $filename )
Contoh penggunaan :
echo filetype('filesaya.txt');  // file
echo filetype('/var/');         // dir
?>

fopen

Fungsinya : Membuka file atau URL
Sintaks php :
fopen ( string $filename , string $mode [, bool $use_include_path= false [, resource $context ]] )
$filename, namafile atau URL
$mode :
mode
Description
'r'Dibuka hanya untuk untuk dibaca; pointer diletakkan di awal file
'r+'Dibuka untuk dobaca dan ditulis; pointer diletakkan di awal file
'w'Dibuka hanya untuk ditulis; pointer diletakkan diawal file, jika file tidak ada, akan dibuat automatik
'w+'Dibuka untuk dibaca dan ditulis; pointer diletakkan diawal file, jika file tidak ada, akan dibuat automatik
'a'Dibuka hanya untuk ditulis; pointer diletakkan di akhir file, jika file belum ada, akan dibuat automatik.
'a+'Dibuka hanya untuk dibaca dan ditulis; pointer diletakkan di akhir file, jika file belum ada, akan dibuat automatik.
Contoh penggunaan :
$handle = fopen("/home/pentaho/file.txt", "r+");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>

is_dir

Fungsinya: Cek apakah filename adalah sebuah directori
Sintaks php :
is_dir ( string $filename )
Contoh penggunaan :
if(is_dir('filesaya.txt')){
    echo "Ini adalah direktori";
}else{
    echo "Ini adalah file";
}
?>

is_executable

Fungsinya: Pastikan apakah filename boleh di execute
Sintaks php :
is_executable ( string $filename )
Contoh penggunaan :
$file = 'filesaya.txt';

if (is_executable($file)) {
    echo $file.' boleh diexecute';
} else {
    echo $file.' tidak boleh diexecute';
}
?>

is_file

Fungsinya: Cek apakah filename adalah sebuah file
Sitaks php :
is_file ( string $filename )
Contoh penggunaan :
if(is_file('filesaya.txt')){
    echo "Ini adalah file";
}else{
    echo "Ini bukan file";
}
?>

is_readable

Fungsinya: Pastikan apakah filename boleh dibaca
Sintaks php :
is_readable ( string $filename )
Contoh penggunaan :
if(is_readable('filesaya.txt')){
    echo "file ini boleh dibaca";
}else{
    echo "file ini tidak boleh dibaca";
}
?>

is_writable

Fungsinya: Cek apakah filename boleh ditulis
Sintaks php :
is_writable ( string $filename )
Contoh penggunaan :
if(is_writable('filesaya.txt')){
    echo "file ini boleh ditulis";
}else{
    echo "file ini tidak boleh ditulis";
}
?>

mkdir

Fungsinya: Membuat direktori
Sintaks php:
mkdir ( string $pathname [, int $mode= 0777 [, bool $recursive= false [, resource $context ]]] )
Contoh penggunaan :
mkdir("gambar", 0700);
?>

move_uploaded_file

Fungsinya: Memindahkan file yang diupload ke lokasi baru
Sintaks php :
move_uploaded_file ( string $filename , string $destination )
Contoh penggunaan :
Upload multiple file
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?>

rename

Fungsinya: Rename file atau directori
Sintaks php :
rename ( string $oldname , string $newname [, resource $context ] )
Contoh penggunaan :
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>

rmdir

Fungsinya: Delete direktori
Sintaks php :
rmdir ( string $dirname [, resource $context ] )
Contoh penggunaan :
rmdir('examples');
?>

unlink

Fungsinya: Delete file 
Sintaks php :
unlink ( string $filename [, resource $context ] )
Contoh penggunaan :
unlink('test.html');
?>


Validate Checkbox

Friday, October 18, 2013

Sama seperti isu sebelum ini. Ini validate di mana user perlu pilih sekurang-kurangnya satu checkbox.

Masalah yang sama timbul. Jika satu sahaja data, array tidak berjalan. Jadi, check dahulu samada array cuma satu data sahaja atau lebih.


 <html>  
  <head>  
   <title>Mi-Scramble</title>  
 <SCRIPT LANGUAGE="JavaScript">  
 <!-- Begin  
 function validatePwd() {  
 if(document.getElementsByName('userassign[]').length == 1)  
 {  
  if(document.myForm.userassign.checked)  
  {  
   return true;  
  } else {  
   alert ("You must select minimum one user! ");  
   return false;  
  }  
 } else {  
  var flag = 0;  
  for (var i = 0; i< document.getElementsByName('userassign[]').length; i++) {  
  if(document.myForm["userassign[]"][i].checked){  
   flag ++;  
   }  
  }  
  if (flag < 1) {  
  alert ("You must select minimum one user!");  
   return false;  
  }  
  return true;  
  }  
 }  
 </script>  
 </head>  
 <body>  
 <form action="assignuserupd.php" method="post" name=myForm onSubmit="return validatePwd()">  
     <table class="responsive table table-striped">  
      <thead>  
      <tr>  
       <th style="">User Name</th>                
       <th>Action</th>  
      </tr>   
      </thead>  
      <tbody>  
 <?php   
 $sqlrtbl="SQL";  
 $resulrtbl=pg_query($sqlrtbl);  
 while($rowr = pg_fetch_assoc($resulrtbl))  
 {  
 ?>           
      <tr>  
       <td><?php echo $rowr['username']; ?></td>     
       <td>  
        <input type="checkbox" name="userassign[]" value="<?php echo $rowr['username']; ?>">  
       </td>  
      </tr>  
 <?php  
 }   
 ?>    
      <tr>  
       <td colspan="2" align="right">  
         <input type="submit" value="Submit" class="btn btn-primary">  
       </td>  
      </tr>   
     </tbody>  
     </table>  
 </form>  
  </body>  
 </html>  

Sourcecode for blogspot http://codeformatter.blogspot.com/

Validate Radio Button

Sekiranya cuma ada 1 sahaja radio button, array tak jalan. Tak boleh nak check guna kaedah array. Jadi, pisahkan. Jika jumpa satu, check seperti biasa, jika lebih, baru buat checking guna array.

if(document.getElementsByName('namatbl').length == 1){ }else { }

Dalam isu ni, user mesti pilih satu radio button.

 <html>  
  <head>  
   <title>Mi-Scramble</title>  
 <SCRIPT LANGUAGE="JavaScript">  
 <!-- Begin  
 function validatePwd() {  
 if(document.getElementsByName('namatbl').length == 1)  
 {  
  if(document.myForm.namatbl.checked)  
  {  
   return true;  
  } else {  
   alert ("You must select one table! ");  
   return false;  
  }  
 } else {  
  var flag = 0;                       
  for (var i = 0; i< document.myForm.namatbl.length; i++) {     
  if(document.myForm.namatbl[i].checked){  
   flag++;   
   }  
  }  
  if (flag < 1) {  
   alert ("You must select one table! ");  
   return false;  
  }  
  return true;  
  }  
 }  
 </script>  
 </head>  
 <body>  
 <form action="assignuserselect.php" method="post" name=myForm onSubmit="return validatePwd();">  
     <table class="responsive table table-striped">    
      <tr>  
       <th>Server</th>   
       <th>Database</th>  
       <th>Table</th>  
       <th>Action</th>       
      </tr>  
 <?php   
 $sqlrtbl="SQL";  
 $resulrtbl=pg_query($sqlrtbl);  
 while($rowr = pg_fetch_assoc($resulrtbl))  
 {  
 ?>   
      <tr>  
       <td><?php echo $rowr['server']; ?></td>   
       <td><?php echo $rowr['dbname']; ?></td>  
       <td><?php echo $rowr['dbtbl']; ?></td>  
       <td><input type="radio" name="namatbl" value="<?php echo $rowr['dbtbl']; ?>"></td>                
      </tr>    
 <?php  
 }  
 if(!$namatable)  
 {  
 ?>   
      <tr>  
       <td colspan="4"><font color="red"><center>No scrambled table from you.</center></font></td>              
      </tr>    
 <?php  
 }  
 ?>  
      <tr>  
       <td>&nbsp;</td>   
       <td>&nbsp;</td>  
       <td>&nbsp;</td>  
       <td>  
       <?php if($namatable) { ?>  
        <input class="btn btn-primary" type="submit" value="Submit">  
       <?php } ?>  
       </td>                
      </tr>    
     </table>  
 </form>  
  </body>  
 </html>  

Sourcecode for blogspot http://codeformatter.blogspot.com/

MySQL 5.5 Encode Base64

Monday, July 01, 2013

Seringkali pengguna MySQL version 5.5 dan ke bawah mengalami masalah apabila sesuatu data itu perlu diencode atau sebaliknya. Masalah MySQL tidak menyediakan fungsi tersebut.

Secara defaultnya ketika ini, apabila kita membuat installation, MySQL akan memberikan kita versi 5.5.

Jika mahu menggunakan fungsi encode base64, MySQL sediada perlu ditukar kepada MySQL version 5.6.

Ada sesetengah orang, mereka mahu menggunakan MySQL version sedia ada. Jadi, mereka perlu menambah function tersebut ke dalam application MySQL.

Kita tidak perlu susah berfikir bagaimana untuk membuat coding dan compile ke dalam aplikasi tersebut. Guna sahaja apa yang telah disediakan oleh Y.Kentaro ini.

Ini Sesuai untuk pengguna Linux.

Cara untuk install. Pada paparan terminal, download dan compile code tersebut.

 $ git clone https://github.com/y-ken/mysql-udf-base64.git  
 $ cd mysql-udf-base64  
 $ gcc -Wall -fPIC -I/usr/local/include -shared base64.c -o base64.so  
 $ sudo install -m 755 base64.so `mysql_config --plugindir`  


Selesai install, kita perlu cipta function tersebut ke dalam MySQL.

Masuk pula ke dalam application.

 mysql> CREATE FUNCTION base64encode RETURNS STRING SONAME 'base64.so';  
 mysql> CREATE FUNCTION base64decode RETURNS STRING SONAME 'base64.so';  


Selepas itu, kita boleh cuba melihat keberkesanannya.

 mysql> SELECT base64encode(nama) FROM tablesample;  


Sedikit Masalah Setelah dicuba, memang ianya berjaya. Tetapi masalah timbul, bila proses ini dilakukan bersama dengan encryption aes, hasilnya tidak dapat seperti data asal.

Contoh Encode:
 select base64encode(aes_encrypt('firdaus', 111)) from dual;  

 Result:   IcCTWM8Recp QE HRTBQ==   

Decode:
 select base64encode(aes_encrypt(' IcCTWM8Recp QE HRTBQ==', 111)) from dual;  

 Result: WC8ARIk1 q5+ gVKcUZcSQCU mEkCQAN b9x NR8LvA=  


Mungkin terdapat beberapa perkara yang saya terlepas pandang. Jadi, masalah ini akan saya lihat kemudian.


Peringatan: Semasa kita buat installation MySQL, kita perlu install MySQL library untuk development. Jika tidak, compilation akan gagal dan keluar error.
untuk install, hanya dapatkan sahaja dari repository.
 $ apt-get install libmysqlclient-dev  

Rujukan: https://github.com/y-ken/mysql-udf-base64

Form Validation jQuery Ringkas

Saturday, February 09, 2013

Ini contoh mudah bagaimana hendak membuat semakan sama ada input dimasukkan atau tidak pada form menggunakan jquery. Kita anggap html di bawah sudah berada di dalam framework bootstrap. Jadi <div>, <class> semua tu tak perlu diambil kisah.

<html>
<head>
<title>Test</title>

<script type="text/javascript" src="script/jquery-x.x.x.min.js"></script>
<script type="text/javascript">
function checklogin() {
    var userpass,usernama,output = true;

 usernama = document.logmasuk.myusername;
 userpass = document.logmasuk.mypassword;
 $("#userpassMessage").text("").removeClass("label label-danger");
 $("#userpassMessage").text("").removeClass("label label-danger");

    if(!usernama.value) {
        usernama.focus();
        $("#myusername").innerHTML = "required";
        $("#usernamaMessage").text("Masukkan username!").toggleClass("label label-danger");
        output = false;
    }   
    if(!userpass.value) {
        userpass.focus();
        $("#mypassword").innerHTML = "required";
        $("#userpassMessage").text("Masukkan password!").toggleClass("label label-danger");
        output = false;
    }   
    return output;
}
</script> 
</head>
<body>
<form action="checklogin.php" method="post" name="logmasuk" onSubmit="return checklogin();">

 <div class="input-icon right">
  <i class="fa fa-user"></i>
  <input id="myusername" type="text" placeholder="username" class="form-control" name="myusername" />
  <span id="usernamaMessage"></span>
 </div>    

 <div class="input-icon right">
  <i class="fa fa-lock"></i>
  <input id="mypassword" type="password" placeholder="password" class="form-control" name="mypassword" />
  <span id="userpassMessage"></span>
 </div>

 <div class="col-lg-9">
  <button type="submit" class="btn btn-default" name="Submit">Sign In</button>
 </div>

</form>
</body>
</html>

Panggil file js jquery pada header html. Ikutlah versi jquery mana yang disukai tapi pastikan ianya berjalan. Lagi baik yang terkini.

<script type="text/javascript" src="script/jquery-x.x.x.min.js"></script>

Cipta function untuk buat semakan. Sebagai contoh, function checklogin() {}. Function ini boleh dibuat di dalam <head> mahupun <body>. Apa yang penting, file jquery.js mestilah di dalam head, bukan body. Di dalam function ini, letak code untuk buat semakan.

Declare siap-siap dan dapatkan valuenya dengan memanggil data dari form. Dalam jquery, kita gunakan document, diikuti dengan nama form.

var userpass,usernama,output = true;
usernama = document.logmasuk.myusername;
userpass = document.logmasuk.mypassword;

Dalam jquery, bila kita guna tanda ni #,ia merujuk kepada ID sesuatu element dalam html tersebut. Jika dilihat pada code, kita guna <input id="myusername"... dan dalam js kita panggil semula menggunakan $("#myusername")...

removeClass digunakan pada awal code supaya javascript bersihkan dulu jika ada error sebelum ini yang telah terpapar.

Bagi keterangan lanjut dalam hal ini, rujuk jQuery Selectors

Ini digunakan bagi memasukkan text dan class ke dalam html <span id="usernamaMessage">.

$("#usernamaMessage").text("Masukkan username!").toggleClass("label label-danger");

Di dalam jQuery, biasakan diri menggunakan id berbanding name. Selain untuk elemen form, id juga boleh digunakan untuk elemen-elemen lain dalam html seperti <p>, <span>, <h1> dan lain-lain. Dan jquery boleh bermain dengan semua ini, bukan dengan form sahaja.