Penggunaan fungsi URLDECOD pada PHP

NET105 – Migrasi PHP ke ASP.NET

Migrasi

PHP ke ASP.NET (NET105)

Willy Ali Ahmad Heryana Rimbun Marpaung Basirudin Rachman

Project Otak 2005 Project Otak – http://otak.csharpindonesia.net

2

NET105 – Migrasi PHP ke ASP.NET

Project Otak Project otak adalah project community yang bertujuan untuk menyediakan resources tentang informasi teknologi .NET bagi orang-orang yang ingin belajar teknologi .NET.

Trademark Acknowledgements Team project otak akan berusaha menyediakan informasi trademark termasuk semua produk yang telah disebut didalam buku ini. Windows, Framework .NET, C#, dan Visual Studio.NET adalah trademark dari Microsoft.

Credits Project Manager

Secretary

Agus Kurniawan

Dewi Maya

Technical Writer Willy (Leader) Ali Ahmad Heryana Rimbun Marpaung Basirudin Rachman

Editor Agus Kurniawan

Cover Designer Danni Afasyah

Version 1.0 Printed: 26 Juni 2005 Book Code: NET105 Update E-Book : http://otak.csharpindonesia.net

Semua materi yang ada didalam buku ini adalah satu kesatuan. Tidak boleh sebagian atau seluruh materi didalam buku ini diubah tanpa seijin team project otak.

Project Otak – http://otak.csharpindonesia.net

3

NET105 – Migrasi PHP ke ASP.NET

Kata Pengantar

Puji syukur kepada Tuhan YME atas rahmat-NYA sehingga team project otak dapat menyelesaikan e-book ini melalui project otak. Buku ini ditulis untuk melengkapi kasanah sumber ilmu dalam bidang pemrogaman. Buku ini merupakan buku migrasi dari PHP ke ASP.NET. Buku ini sangat cocok untuk para pembaca yang memiliki dasar pemrograman PHP. Penulis juga sebagai manusia biasa maka penulis tidak lepas dari kesalahan sehingga penulis menerima saran dan kritik yang membangun. Semoga buku ini berguna untuk para mahasiswa, developer, professional dan pemerhati software.

Depok, 26 Juni 2005

Team Project Otak

Project Otak – http://otak.csharpindonesia.net

4

NET105 – Migrasi PHP ke ASP.NET

Tentang Penulis Willy Willy lulusan Universitas Bina Nusantara, saat ini bekerja sebagai software developer pada salah satu perusahaan swasta di Jakarta menggunakan VB dan .NET sebagai bahasa pemrograman utama. Lahir di Jakarta, pada tahun 1982. Kupersembahkan buku ini untuk Meifei. Willy telah memberikan kontribusi di buku ini pada bab 1, 6, 7, dan 8

Ali Ahmad Heryana Ali Ahmad Heryana, saat ini bekerja sebagai Developer di PT Ericsson Indonesia. Lahir di Subang - Jawa Barat dan menamatkan kuliahnya di salah satu PT di Bandung. Ali adalah salah seorang pencetus munculnya web csharpindonesia.net dan aspxindonesia.net yang sekarang menjadi bagian dari INDC. Semua hal yang berhubungan dengan IT dan Telekomunikasi sangat digemari untuk dipelajarinya. Selain sebagai salah satu group leader di INDC pada komunitas ASP.NET Indonesia, di waktu luangnya, Ali tidak ketinggalan untuk mengikuti dunia otomotif terutama yang berhubungan dengan Motor. Kupersembahkan buku ini: " buku/ebook ini dipersembahkan buat putri pertama ku Nabila & istriku Azan N" Ali Ahmad Heryana telah memberikan kontribusi di buku ini pada bab 9

Project Otak – http://otak.csharpindonesia.net

5

NET105 – Migrasi PHP ke ASP.NET

Rimbun Marpaung Rimbun lahir di Medan, pada tanggal 11 Oktober 1980. Lulusan DIII Ilmu Komputer USU. Bekerja sebagai Software Engineer di PT. Halotec Indonesia. Baru serius dalam pemrograman sekitar tahun 2003. Kupersembahkan buku ini: Buat kedua orang tuaku, dan keempat saudaraku serta orang yang dekat denganku, Hilda Fitri Yanti Rimbun Marpaung telah memberikan kontribusi di buku ini pada bab 2, 3, dan 4

Basirudin Rachman Basirudin lulusan Ilmu Komputer IPB, Bekerja di PT Kontinum Era Artha sebagai Team Leader/ Software Development Manager. Koordinator Group Leader C# di INDC, Founder komunitas Virtual Garage (alumni Ilmu Komputer IPB), Anggota Moslem Information Technology Association (MIFTA). Kupersembahkan buku ini : Untuk dunia ilmu pengetahuan, Istriku (yg sedang belajar .NET :) ), .NET ers ... , PHP ers ... Basirudin Rachman telah memberikan kontribusi di buku ini pada bab 5

Project Otak – http://otak.csharpindonesia.net

6

NET105 – Migrasi PHP ke ASP.NET

Daftar Isi Project Otak .......................................................................................................3 Credits .................................................................................................................3 Kata Pengantar .....................................................................................................4 Tentang Penulis ....................................................................................................5 Daftar Isi ...............................................................................................................7 1. Pengenalan Dasar ............................................................................................9 1.1 Pengenalan Dasar PHP ............................................................................................. 9 1.2 Pengenalan Dasar ASP.NET..................................................................................... 9 2. Sintak PHP Dan ASP.NET..............................................................................12 2.1 Syntax Dasar ........................................................................................................... 12 2.2 Variable.............................................................................................................. 18 2.3 Flow Kontrol...................................................................................................... 21 2.4 Array .................................................................................................................. 27 2.5 Fungsi................................................................................................................. 30 3. Manajemen State............................................................................................34 3.1 Cookies ................................................................................................................... 34 3.2. Session ................................................................................................................... 44 3.3 View State Pada ASP.Net ....................................................................................... 50 4. Validasi ...........................................................................................................53 4.1 Validasi Pada PHP .................................................................................................. 54 4.2 Validasi Pada ASP.Net ........................................................................................... 58 5. Penanganan Error...........................................................................................72 5.1 Penanganan Error.................................................................................................... 72 5.2 Penanganan Error Pada PHP................................................................................... 74 5.2.1 Penanganan Error................................................................................................. 75 5.2.2 Penanganan Error Pada PHP 5............................................................................. 80 5.3 Penanganan Error Pada C# ..................................................................................... 84 5.3.1 Try Statement ....................................................................................................... 85 5.3.2 Melempar Exception ............................................................................................ 86 5.3.3 Pernyataan Catch ................................................................................................. 87 5.3.3.1 Menentukan Catch Untuk Menangkap Exception Tertentu.............................. 88 5.3.3.2 Penggunaan Beberapa Blok Catch.................................................................... 89 5.3.4 Pernyataan Finally ............................................................................................... 90 5.3.5 Lebih Jauh Tentang Class Exception................................................................... 92 5.3.6 Custom Exception ................................................................................................ 94 6. Koneksi Data...................................................................................................97 6.1 Koneksi ke Database pada PHP.............................................................................. 97 6.2 Koneksi ke Database pada ASP.NET ................................................................... 102 6.2.1 Melakukan Koneksi ke Database................................................................... 103 6.2.2 Membuat Data Set.......................................................................................... 107 6.2.3 Menampilkan Isi Data Set.............................................................................. 108

Project Otak – http://otak.csharpindonesia.net

7

NET105 – Migrasi PHP ke ASP.NET

6.2.4 Menampilkan Data dengan Data View .......................................................... 109 6.2.5 Manipulasi Data dengan Data Set.................................................................. 110 6.3 Menambah, Merubah, dan Menghapus Data ........................................................ 110 7. Caching dan Send Email ..............................................................................113 7.1 Caching pada ASP.NET........................................................................................ 113 7.1.1 Caching Web Form ........................................................................................ 113 7.1.2 Fragment Caching.......................................................................................... 115 7.1.3 Caching Data Aplikasi ................................................................................... 117 7.2 Send Email ............................................................................................................ 118 7.2.1 Send Email dengan PHP ................................................................................ 119 7.2.2 Send Email dengan ASP.NET ....................................................................... 119 8. Debug ...........................................................................................................121 8.1 Debug pada PHP ................................................................................................... 121 8.2 Debug pada ASP.NET dengan VS.NET............................................................... 121 9. Tool “PHP to ASP.Net Migration Assistant” ..................................................123 9.1 Apakah Itu Tool “PHP to ASP.Net Migration Assistant” ?.................................. 123 9.2 Menggunakan Tool “PHP to ASP.Net Migration Assistant” ............................... 123 9.2.1 Visual Studio .Net.............................................................................................. 124 9.2.2 Command Window ............................................................................................ 128 9.3 Keuntungan dan Kelemahan Tool “PHP to ASP.Net Migration Assistant”......... 130 9.3.1 Keuntungan Tool “PHP to ASP.Net Migration Assistant”................................ 130 9.3.2 Kelemahan Tool “PHP to ASP.Net Migration Assistant” ................................. 132 Lampiran...........................................................................................................133 Strukutur Organisasi Project Otak 2005-2006 ..................................................134 Program Donatur Project Otak..........................................................................136

Project Otak – http://otak.csharpindonesia.net

8

NET105 – Migrasi PHP ke ASP.NET

1. Pengenalan Dasar Willy

PHP dan ASP.NET adalah dua bahasa pemrograman yang digunakan pada pembuatan aplikasi web yang bersifat server side. Kedua bahasa ini dapat diintegrasikan dalam HTML sehingga suatu halaman web dapat menjadi halaman yang dinamis. Seperti kita ketahui, aplikasi web menggunakan arsitektur client-server. Aplikasi web ditempatkan pada sisi server untuk memberikan respon (response) atas setiap permintaan (request) dari client melalui internet. Respon yang diberikan akan dikirimkan ke client dan ditampilkan dalam browser.

1.1 Pengenalan Dasar PHP PHP merupakan singkatan dari Personal Home Page tool dan sering digunakan pada web server yang berbasis Linux, walaupun begitu PHP juga dapat digunakan pada komputer yang berbasis Windows. Untuk dapat menggunakan PHP, Anda harus menginstall web server pada komputer Anda. Web server yang umum digunakan untuk sistem operasi windows adalah Personal Web Server (PWS) untuk Windows 98 atau Internet Information Service/Server (IIS) untuk Windows 2000, XP, atau NT. Sedangkan pada komputer berbasis Linux, web server yang umum digunakan adalah Apache. PHP dapat “melakukan” semua hal yang bisa dilakukan oleh aplikasi program CGI, seperti mengambil nilai form, menghasilkan halaman web yang dinamis, serta mengirim dan menerima cookie. PHP juga dapat berkomunikasi dengan layanan-layanan yang menggunakan protokol IMAP, SNMP, NNTP, POP3, HTTP, dan lain-lain. Namun tampaknya kelebihan PHP yang paling signifikan adalah kemampuannya untuk melakukan koneksi dengan berbagai macam database, seperti MySQL, PostgreSQL, dBase, Oracle, Direct MS-SQL, Informix, dan lain-lain. Untuk mendapatkan file distribusi instalasi PHP, Anda dapat mencarinya pada situs resmi PHP, yaitu http://www.php.net. Di sana terdapat file distribusi baik untuk sistem operasi yang berbasis UNIX maupun Windows.

1.2 Pengenalan Dasar ASP.NET ASP.NET adalah salah satu platform dari Microsoft yang dapat Anda gunakan untuk membuat aplikasi web dan web service yang berbasis IIS. ASP.NET juga merupakan bagian dari .NET Framework dan terdiri dari beberapa komponen pendukung. • Namespace System.Web

Project Otak – http://otak.csharpindonesia.net

9

NET105 – Migrasi PHP ke ASP.NET

Namespace ini merupakan bagian dari .NET Framework dimana didalamnya terdapat class-class yang digunakan dalam pemrograman aplikasi web seperti HTTP request, HTTP response, browser, dan e-mail. • Server control dan HTML control Merupakan komponen user-interface yang Anda gunakan mengumpulkan informasi atau menyediakan informasi kepada user.

untuk

Selain komponen-komponen di atas, ASP.NET juga menggunakan beberapa tools tambahan yang merupakan kunci dalam pemrograman ASP.NET, seperti: • Microsoft Internet Information Services (IIS). IIS bertugas untuk mengatur aplikasi web pada sisi server, meneruskan request dari klien ke aplikasi, dan mengembalikan respon dari aplikasi ke klien. • Bahasa pemrograman Visual Basic .NET, Visual C#, dan Visual J# Ketiga bahasa pemrograman ini memiliki dukungan yang sudah terintegrasi dalam Visual Studio .NET untuk pembuatan aplikasi web. • .NET Framework Merupakan suatu set lengkap dari kumpulan class-class yang digunakan dalam pemrograman .NET, termasuk class-class ASP.NET dan class-class yang digunakan dalam tujuan pemrograman lainnya seperti array, manipulasi string, akses file, konversi tipe data, dan lain-lain. • Microsoft ADO.NET Komponen yang menyediakan akses terhadapa Microsoft SQL Server dan ODBC Database. Akses terhadap data seringkali menjadi kunci utama dalam aplikasi web. • Microsoft Application Center Test (ACT) Komponen Visual Studio .NET untuk melakukan testing pada aplikasi web. ASP.NET memiliki banyak kelebihan dibandingkan platform lain dalam hal pengembangan aplikasi web. Kelebihan utamanya adalah integrasi antara ASP.NET dengan Windows Server dan tools pemrogramannya. ASP.NET juga mudah untuk dibuat, debug, dan dikembangkan dalam satu aplikasi, yaitu Visual Studio .NET. Berikut adalah kelebihan-kelebihan lain dalam pembuatan aplikasi web dengan menggunakan ASP.NET: • Sebagian dari aplikasi web dapat dikompilasi terlebih dahulu, sehingga mereka dapat dijalankan lebih cepat daripada skrip yang dijalankan secara interpreter seperti HTML. • Memiliki akses terhadap .NET Framework, yang memiliki banyak dukungan dan kemudahan dalam pemrograman berbasis Windows. • Manajemen state seacara otomatis untuk control-control pada halaman web (disebut server control) sehingga control tersebut memiliki sifat yang mirip dengan Windows control. • Kemampuan untuk membuat control baru atau pengembangan dari control yang sudah ada.

Project Otak – http://otak.csharpindonesia.net

10

NET105 – Migrasi PHP ke ASP.NET

• Sistem sekuriti yang terintegrasi dengan Windows atau menggunakan metode autentikasi lainnya. • Integrasi dengan ADO.NET yang menyediakan fasilitas akses data dan perancangan database dari dalan Visual Studio .NET. • Dukungan penuh terhadap Extended Markup Language (XML) dan Cascading Style Sheet (CSS). • Fitur caching dan penyesuaian bahasa dan seting dalam aplikasi sesuai regional setting pada Windows.

Project Otak – http://otak.csharpindonesia.net

11

NET105 – Migrasi PHP ke ASP.NET

2. Sintak PHP Dan ASP.NET Rimbun Marpaung

2.1 Syntax Dasar Pada bagian ini kita akan membicarakan mengenai syntax dasar dari kedua script, php dan asp.net. Tetapi sebelum kita masuk ke pembahasan yang lebih jauh mengenai syntax dari keduanya, kita akan membicarakan mengenai beberapa tehnik penulisan code pada asp.net. Untuk dapat membuat suatu script aspx, dapat digunakan beberapa cara, yaitu : 1. menuliskan script langsung pada halaman aspx cara inipun dapat dilakukan dengan dua style, yaitu : a. dengan menggunakan tag <script> <SCRIPT LANGUAGE=”C#”> …… kode ditulis disini…. contohnya : <script language=C# runat=server> // pendeklarasian variable String str; int i; int i2; //fungsi untuk mengembalikan nilai setelah dikali 2 int DoubleIt(int input) { int faktor = 2; return input * faktor; } <%

// pendeklarasian variable yang digunakan untuk // menyimpan nilai dari query string object varQueryString; varQueryString = Request.QueryString; Response.Write("querystringnya adalah " + Server.HtmlEncode(varQueryString.ToString()));

%>

b. dengan menggunakan asp directive <%@ PAGE LANGUAGE=”C#” %> … kode asp.net ….

catatan:

Project Otak – http://otak.csharpindonesia.net

12

NET105 – Migrasi PHP ke ASP.NET

directive ini harus dituliskan pada awal baris (paling atas) dari script contohnya : <%@ Page language="C#" %> <script runat="server" > public void Page_Load() { Response.Write(“Hello world !!!”); }

2. menuliskan script dengan menggunakan code-behind. Cara ini merupakan cara baru dalam penulisan script. Berbeda dengan asp klasik atau php yang scriptnya dituliskan pada halamannya langsung, asp.net dengan code-behind ini kodenya tidak dituliskan dihalamannya secara langsung, tetapi ada satu file lagi yang merefer pada halaman aspx tersebut, halaman inilah yang berisi dari keseluruhan kode asp.netnya. Jadi dengan kata lain, satu halaman asp.net terdiri dari dua buah file, yaitu: - satu halaman aspx, biasanya hanya digunakan untuk tampilan - satu halaman code-behind, berisi kode yang digunakan oleh halaman aspx. Dan satu kelebihannya lagi, halaman code-behind ini dapat dibuat dengan berbagai macam bahasa pemrograman, tentunya yang support dengan teknologi .net seperti vb.net, C#, dsb, dengan catatan bahasa yang digunakan hanya satu saja tidak lebih, tidak boleh bercampur antara bahasa vb.net dan c# sebagai contoh. File code-behind ini mempunyai ekstensi yang tergantung pada bahasa apa yang digunakan. Kalau kita menggunakan vb.net, maka filenya akan berekstensi .vb, kalau menggunakan bahasa c# akan berekstensi .cs. Untuk dapat membuat script yang menggunakan code-behind, hanya tinggal menambahkan satu baris kode pada file aspx. Baris ini berisi nama file yang merupakan code-behind dari file aspx tersebut. <%@ Page Language=”C#” Codebehind="nama_file.aspx.cs" %> contoh: Kita membuat satu page dengan menggunakan visual studio .net dari menu File > Add New Item…, lalu pilih Web Form pada menu template, maka visual studio .net akan membuat 2 buah file, yaitu halaman .aspx dan .aspx.cs jika menggunakan bahasa C#, .aspx.vb jika menggunakan bahasa VB. Jadi andaikan kita memberi nama web form tersebut dengan nama test.aspx, maka akan menghasilkan 2 buah file, yaitu: 1. file test.aspx, yang berisi: <%@ Page language="c#" Codebehind="test.aspx.cs" AutoEventWireup="false" Inherits="ASPCode.test" %>

test <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body ms_positioning="GridLayout"> <form id="Form1" method="post" runat="server"> </form> </body><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 13<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> </html><br /> <br /> 2. file test.aspx.cs (karena kita menggunakan bahasa C#), yang berisi: using using using using using using using using using using<br /> <br /> System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;<br /> <br /> namespace ASPCode { /// <summary> /// Summary description for test. /// public class test : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here // baris ini digunakan untuk menampilkan kata //Hello World !!! pada browser Response.Write("Hello World !!!"); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion }<br /> <br /> catatan: Semua kode diatas dibuat otomatis oleh visual studio.net kecuali baris yang bercetak tebal. Hasilnya adalah seperti gambar dibawah ini.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 14<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> untuk selanjutnya pembahasan pada bab ini dan bab yang akan datang akan menggunakan cara yang kedua ini, yaitu dengan memakai code-behind. Dan kode yang akan ditulis adalah pada baris yang bercetak tebal diatas, pada bagian private void Page_Load.<br /> <br /> 2.1.1 Tag Script<br /> <br /> PHP<br /> <br /> Setiap script php diawali dan diakhiri (diapit) oleh tag-tag tertentu yang menandai awal dan akhir dari scrip php. Untuk menuliskan tag pada php ada beberapa macam cara yang dapat digunakan, yaitu: - Cara I - Cara II - Cara III <script language=”php”> … script php … - Cara IV <% … script php … %><br /> <br /> ASP.NET Sedangkan pada ASP.Net, setiap script hanya diapit oleh tanda : <% … %> catatan: tag ini hanya digunakan pada file .aspx, tidak pada code-behind. Sedangkan pada codebehind, tidak diperlukan tag khusus.<br /> <br /> 2.1.2 Output<br /> <br /> PHP<br /> <br /> Untuk menghasilkan output kelayar pada PHP dapat digunakan perintah echo atau print. Misal: echo “hallo PHP”; print “hallo PHP”; ASP.NET<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 15<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> sedangkan pada ASP.Net dengan menggunakan Response.write. misal: Response.Write (“Hallo ASP.Net”);<br /> <br /> 2.1.3 Embedded dan Non Embedded Script<br /> <br /> PHP<br /> <br /> script pada php dapat disisipkan pada html dan dapat dibuat berdiri sendiri (terpisah dari html) dan dapat menyisipkan tag-tag html pada script php. - disisipkan pada html <html> <head> <TITLE> </head> <body> <p> </p></body> </html> atau: <html> <head> <TITLE> </head> <body> <p> <script language=”PHP”> echo “Hello world !!!”; </p></body> </html><br /> <br /> - script php yang berdiri sendiri: <br /> <br /> - menyisipkan tag html pada script php ”; echo “<head> echo “<TITLE> echo “ echo “</head> echo “<body> echo “<p> echo “Hello world !!!”; echo “</p></body> echo “</div></div></div></div></div></div></div></div></body></html> ?><br /> <br /> ketiga-tiganya akan menghasilkan output yang sama yaitu “Hello World !!!”. ASP.NET<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 16<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> sedangkan pada asp.net dapat dilakukan juga hal yang sama dengan mengganti tag php dengan tag asp.net, menjadi: <html> <head> <TITLE> </head> <body> <p> <% Response.Write(“Hello world !!!”); %> </p></body> </html> atau: <html> <head> <TITLE> </head> <body> <p> <script runat=”server”> Response.Write(“Hello world !!!”); </p></body> </html><br /> <br /> 2.1.4 Komentar Setiap kali membuat suatu script, terkadang kita ingin untuk menuliskan komentar pada bagian tertentu dari script kita tersebut, mungkin untuk sebagai dokumentasi atau untuk memudahkan bagi orang lain yang ingin memahami, membaca, atau mungkin ingin memodifikasi script kita tersebut. Komentar merupakan satu atau beberapa baris yang berisi sembarang keterangan yang tidak akan di eksekusi oleh php atau asp.net. PHP Untuk menuliskan komentar ada beberapa cara yang dapat dipergunakan, yaitu : - Cara I Cara ini biasa digunakan dalam bahasa C dan C++ yaitu dengan menggunakan dua buah garis miring (“//”) misal: // komentar untuk satu baris<br /> <br /> - Cara II dengan menggunakan kombinasi dari garis dan bintang (“ /* …. */ “). Cara ini biasa digunakan untuk membuat komentar yang lebih dari satu baris. Misal: /*<br /> <br /> cara penulisan komentar yang lebih dari satu bari dengan menggunakan kombinasi garis miring dan bintang<br /> <br /> */<br /> <br /> - Cara III<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 17<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> cara ini mirip dengan penggunaan komentar pada unix shell-style, yaitu dengan menggunakan tanda pagar (“ # “). Misal : # komentar dengan menggunakan unix shell-style<br /> <br /> ASP.NET<br /> <br /> sedangkan pada asp.net komentar dapat dilakukan sebagai berikut:<br /> <br /> - pada file .aspx <%-- .. komentar .. .. ditulis disini .. --%><br /> <br /> - pada code-behind // untuk komentar satu baris /* digunakan untuk menuliskan komentar yang lebih dari satu baris */<br /> <br /> 2.2<br /> <br /> Variable<br /> <br /> Variable merupakan suatu tempat untuk menyimpan data.<br /> <br /> 2.2.1 Pendeklarasian Variable PHP Pada php kita tidak perlu secara explicit mencantumkan tipe data untuk variable yang kita buat seperti halnya bahasa C, C++, Pascal ataupun bahasa yang lain. Kita hanya cukup dengan menuliskan nama variablenya saja, tanpa tipe data. Php akan secara otomatis mendeteksi tipe datanya ketika kita mengisikan data pada variable tersebut. Untuk menuliskan atau membuat suatu variable ada hal-hal yang harus diperhatikan, yaitu: - variable selau dimulai dengan tanda dolar (“$”) - variable harus selalu dimulai dengan huruf atau garis bawah (“_“), tidak boleh selainnya. - variable dapat berupa huruf, angka, garis bawah, atau kombinasi dari ketiganya, tidak boleh selainnya misal : < ? /* Mendeklarasikan variable */ $nama; $_alamat; /* Mengisi variable dengan nilai, dan membuat variable baru dan langsung mengisinya dengan nila */ $nama = “Rimbun“; //benar, diawali huruf $_alamat = “Jl. Jalan”; //benar $2orang = “2 orang”; //salah, diawali angka $orang ketiga = “Orang ketiga”; //salah, mengandung spasi $juml4h+saud4r4 = 4; //salah, mengandung ‘+’ ?><br /> <br /> ASP.NET<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 18<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Untuk mendeklarasikan variable pada asp.net, cukup dengan menggunakan cara: Tipe_data nama_variable; Misal: Int a; //mendeklarasikan variable a dengan tipe data integer String b; //mendeklarasikan variable b dengan tipe data string<br /> <br /> 2.2.2 Mengisi Nilai Variable Untuk mengisikan nilai kedalam variable kita menggunakan operator sama dengan (“=”). Tetapi bukan berarti operand yang disebelah kiri sama dengan operator yang sebelah kanan, tetapi mengisikan nilai operand yang disebelah kiri dengan operand yang disebelah kanan.<br /> <br /> PHP Secara default, variable selalu diisi dengan nilai atau dikenal dengan istilah assign by value, seperti pada contoh-contoh diatas, variable diisi dengan nilai yang ada pada sebelah kanannya. Selain mengisi dengan nilai, variable dapat juga diisi dengan reference atau dikenal dengan istilah assign by reference, yaitu mengisikan variable dengan data yang berada pada lokasi tertentu. Untuk membuat variable seperti ini kita cukup dengan menambah tanda ampersand (“&”) sebelum nama variable yang kita acu. Misal: ”; //output = 1 echo “variable_dua: $variable_dua”; //output = 1 ?><br /> <br /> pada contoh diatas, kita terlebih dahulu membuat satu variable yang bernama variable_satu dan kita isikan nilai 1 kedalamnya. Kemudian pada baris kedua, kita membuat variable yang kedua dengan nama variable_dua dan kita isikan dengan lokasi data variable_satu. Kedua-dua variable tersebut sama-sama menghasilkan nilai 1. ASP.NET Untuk mengisikan nilai kedalam variable cukup dengan memberikan nilai yang diinginkan kedalam variable. Misal: Int a; //pendeklarasian variable a sebagai integer string b; //pendeklarasian variable b sebagai string a = 123; //pengisian variable a dengan nilai integer 123 b = “asp.net ok…”; //pengisian variable b dengan string asp.net ok int c = 1; //pendeklarasian dan pengisian nilai variable c string d = “asp yes…”; //pendeklarasian dan pengisian nilai variable d<br /> <br /> 2.2.3 Tipe Data PHP<br /> <br /> ASP.Net<br /> <br /> 2.2.4 Konstanta Project Otak – http://otak.csharpindonesia.net<br /> <br /> 19<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> konstanta merupakan suatu tempat menyimpan data yang nilainya tetap, tidak akan dapat diubah. Biasanya konstanta digunakan untuk menyimpan data yang datanya tidak akan pernah berubah dibagian manapun dari script. Misalnya untuk phi yaitu 3.14, maka kita dapat membuat konstanta untuk phi yang berisi nilai 3.14, karena nilai tersebut tidak akan berubah (bersifat tetap). PHP Untuk membuat konstanta dapat digunakan fungsi define(). Misal: <br /> <br /> pada contoh diatas kita telah membuat satu buah konstanta dengan nama “phi” yang berisi nilai 3.14. ASP.NET Untuk membuat konstanta pada asp.net digunakan keyword const. Syntax: Const type_data nama_konstanta = nilai_konstanta; Misal: Const int myConst1 = 10; Const int myConst2 = myConst + 1;<br /> <br /> 2.2.5 Ekspresi Ekspresi merupakan bagian terpenting pada PHP. Pada PHP, hampir semua yang ditulis merupakan ekspresi, atau defenisi yang hampir mendekati, ekspresi adalah “segala sesuatu yang berisi nilai”. Misal: <br /> <br /> variable var_test pada contoh diatas kita isikan dengan nilai integer 10, maka 10 merupakan ekspresi. Dan apabila kita membuat sutu variable lagi dengan nama $var_dua = $var_test, maka $var_test merupakan ekspresi dengan nilai 10. Contoh yang lebih kompleks lagi adalah fungsi. Misal: pada contoh diatas, variable var_test diisi dengan ekspresi yang berupa fungsi yang memberi nilai kembali 10. jadi var_test berisi nilai 10. Catatan: Fungsi akan mempunyai pembahasan tersendiri dari bab ini. Penambahan dan Pengurangan (Pre/Post Increment dan Decrement) Pada PHP dikenal notasi ++ yang berarti penambahan dengan 1 dan – yang berarti pengurangan dengan 1 yang kedua notasi tersebut dapat ditulis sebelum atau sesudah nama variable. Pre-Increment dan Post-Increment merupakan dua hal yang hampir sama, hanya saja bedanya terletak pada proses yang dilakukan. Pre-Increment yang ditulis dengan<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 20<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> ‘++$nama_variable’, yaitu penambahan variable dengan 1 dan kemudian hasilnya dimasukkan kedalam variable. Sedangkan Post-Increment yang ditulis dengan ‘$nama_variable++’ yaitu mengambil nilai variable kemudian menambahkannya dengan satu. Decrement hampir sama seperti increment hanya saja bedanya kalau increment merupakan penambahan dengan 1, maka decrement pegurangan dengan 1. sedangkan cara menulisnya hanya mengganti notasi ++ menjadi – (--$nama_variable atau $nama_variable--).<br /> <br /> 2.2.6 Operator Operator Aritmatika 1. Penambahan (+) 2. Pengurangan (-) 3. Perkalian (*) 4. Pembagian ( ?) 5. Modulus - sisa hasil bagi (%) Operator String 1. tanda titik (.) yaitu penambahan string yang dikanan titik dengan string disebelah kiri titik misal: Operator Perbandingan 1. sama dengan (==) 2. identik (===) 3. tidak sama (!=) 4. tidak identik (!==) 5. lebih kecil (<) 6. lebih besar (>) 7. lebih kecil atau sama dengan (<=) 8. lebih besar atau sama dengan (>=) Operator Logika 1. AND (&&) 2. OR (||) 3. NOT (!)<br /> <br /> 2.3<br /> <br /> Flow Kontrol<br /> <br /> Dalam membuat suatu script seringkali kita dihadapkan pada suatu masalah dimana kita harus melakukan pengecekan terhadap suatu kondisi, misalkan pada ajang balap mobil formula one mengenai pemakaian ban yang sesuai. Untuk menentukan ban yang sesuai dilakukan pengecekan situasi trek, apakah basah, kering atau sedikit basah. Jika kondisi basah, maka dipakai ban basah, jika kondisi kering, maka pakai ban kering, jika tidak juga maka pakai ban intermediate.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 21<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 2.3.1 if if digunakan untuk melakukan pengujian terhadap suatu kondisi atau ekspresi. Jika kondisi atau ekspresi tersebut benar atau TRUE, maka baris-baris pada blok if tersebut akan dieksekusi.<br /> <br /> PHP<br /> <br /> 0 ) echo “satu besar nol”; ?><br /> <br /> catatan: jika blok kode lebih dari satu baris maka digunakan tanda kurung buka (‘{‘) dan kurung tutup (‘}’) untuk menandai awal dan akhir blok. Misal : 0 ) { echo “satu besar nol”; echo “nol kecil satu”; } ?><br /> <br /> ASP.NET if ( 1 > 0 ) { Response.Write “satu besar nol”; }<br /> <br /> 2.3.2 else else digunakan untuk melakukan suatu eksekusi jika kondisi atau ekspresi pada if tidak terpenuhi PHP <br /> <br /> ASP.NET if ( 1 < 0 ) { Response.Write “satu besar nol”; } else { Response.Write “nol besar Satu”; }<br /> <br /> 2.3.3 elseif elseif digunakan untuk melakukan pengecekan terhadap kondisi atau ekspresi bila blok if tidak terpenuhi. PHP <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 22<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> elseif ( 1 == 0 ) echo “satu sama dengan nol”; else echo “satu kecil nol”; ?><br /> <br /> ASP.NET if ( 1 < 0 ) Response.write “satu besar nol”; else if ( 1 = 0 ) Response.write “satu sama dengan nol”; else Response.write “satu kecil nol”;<br /> <br /> 2.3.4 while while digunakan untuk melakukan perulangan dimana perulangan akan terus dilakukan bilamana kondisi atau ekspresi yang diberikan bernilai benar atau TRUE. PHP <br /> <br /> ASP.NET int i = 0; while i < 10 { Response.Write (i.ToString() & “ “); i += 1; }<br /> <br /> kode diatas akan menghasilkan output: 0 1 2 3 4 5 6 7 8 9.<br /> <br /> 2.3.5 do..while do..while hampir sama dengan while, hanya saja bedanya pengecekan dilakukan dibagian akhir perulangan. PHP <br /> <br /> ASP.NET int i = 0; do { Response.Write (i.ToString() & “ “); i += 1; } while (i < 10);<br /> <br /> kode diatas akan menghasilkan output: 0 1 2 3 4 5 6 7 8 9 Project Otak – http://otak.csharpindonesia.net<br /> <br /> 23<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 2.3.6 for for digunakan untuk melakukan perulangan dimana nilai awal dan nilai akhir dari perulangan itu diketahui. PHP Syntax: for ($var = nilai_awal ; $var < nilai_akhir ; penambahan)<br /> <br /> Misal: <br /> <br /> ASP.NET Syntax: for variable_counter = nilai_awal ; nilai_akhir [step langkah] Misal: For ( int i=0 ; i < 10 ; i++ ) { Response.Write (i.ToString() & “ “); }<br /> <br /> kode diatas akan menghasilkan output: 0 1 2 3 4 5 6 7 8 9<br /> <br /> 2.3.7 foreach foreach digunakan untuk melakukan perulangan pada suatu object atau array. PHP Syntax: foreach (expression as $value) statement foreach (expression as $key => $value) statement<br /> <br /> misal: atau: $value) { echo "$value "; } ?><br /> <br /> kedua kode diatas akan menghasilkan output yang sama yaitu satu dua tiga. ASP.NET Syntax: foreach (key in expression)<br /> <br /> Misal: string[] arr = new string[] {“satu”, “dua”, “tiga”}; foreach (string key in arr) {<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 24<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> }<br /> <br /> Response.Write(key & “ “) ;<br /> <br /> output: satu dua tiga<br /> <br /> 2.3.8 Keluar Dari Perulangan Terkadang didalam perulangan kita ingin keluar walaupun perulangan tersebut belum berakhir. Untuk melakukan hal tersebut pada PHP dapat digunakan keyword BREAK di dalam perulangan, sedangkan pada ASP.Net digunakan keyword EXIT Misal: PHP ASP.NET for (int i=0 ; I < 10 ; i++) { if (i == 5) break; else Response.Write(i.ToString() & “ ”); }<br /> <br /> pada contoh diatas, akan menghasilkan output 0 1 2 3 4, sedangkan pada perulangan ke-5, maka perulangan tersebut akan bereakhir karena terdapat keyword break untuk mengakhiri perulangan.<br /> <br /> 2.3.9 continue Selain untuk menghentikan perulangan, kita dapat juga meneruskan perulangan dengan keyword continue. PHP Misal: <br /> <br /> ASP.NET<br /> <br /> for (int i = 0 ; i<10 ; i++) { if (i == 5) continue; Response.Write(i.ToString() & “ “); }<br /> <br /> 2.3.10 Multiple Selection PHP<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 25<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Switch digunakan untuk membuat suatu pilihan diantara beberapa pilihan. Misal: <br /> <br /> pada contoh diatas, akan menghasilkan output “dua” karena variable pilihan berisi nilai 2. Catatan: Keyword default digunakan untuk membuat suatu pilihan yang secara default akan dijalankan bila kriteria yang ditentukan tidak ditemukan. Jika variable $pilihan kita isi dengan nilai 5, maka php akan mengeksekusi baris default, sehingga outputnya akan menghasilkan “berapa yah???”. Keyword break digunakan agar program tidak menjalankan baris yang selanjutnya, karena php akan terus melakukan eksekusi terhadap keseluruhan baris dari blok switch walaupun kriteria yang ditentukan telah ditemukan. Pada contoh diatas, apabila keyword break tidak disertakan, outputnya akan menjadi “dua tiga berapa yah???”.<br /> <br /> ASP.NET<br /> <br /> string hari = "", namaHari = ""; hari = System.DateTime.Now.DayOfWeek.ToString(); switch (hari) { case "Sunday": namaHari = "Minggu"; break; case "Monday": namaHari = "Senin"; break; case "Tuesday": namaHari = "Selasa"; break; case "Wednesday": namaHari = "Rabu"; break; case "Thursday": namaHari = "Kamis"; break; case "Friday": namaHari = "Jum'at"; break; case "Saturday": namaHari = "Sabtu";<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 26<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> break; }// switch<br /> <br /> contoh diatas digunakan untuk mengubah format hari dalam bahasa inggris menjadi bahasa indonesia.<br /> <br /> 2.4<br /> <br /> Array<br /> <br /> Pada bahagian yang lalu kita telah membahas apa yang dinamakan dengan variable, yaitu tempat penyimpanan data. Dan sekarang kita akan membahas mengenai array. Lalu, apa yang dimaksud dengan array tersebut?. Array adalah suatu tempat penyimpanan data. Tetapi berbeda dengan variable yang hanya dapat menyimpan satu data saja, array dapat menyimpan data lebih dari satu, bisa dua, tiga, dan seterusnya. Misalkanlah kita akan membuat data nama pemain di kesebelasan PSMS ( ☺ maklum orang Medan…), jika dengan menggunakan variable, maka kita harus membuat 11 buah variable untuk dapat mengisi data nama pemain kedalamnya, memangsih kita masih sanggup buat (baru 11 doang, tinggal copy paste aja), tapi bagaimana kalau mau buat daftar peringkat sepakbola dunia yang dikeluarkan FIFA (kan lebih dari seratus…, masih pingin membuat variable??), maka untuk hal tersebut kita hanya cukup dengan membuat satu buah array, trus masukin aja data-data tersebut kedalamnya, selesai..<br /> <br /> 2.4.1 Array Pada PHP 2.4.1.1 Membuat Array Untuk membuat array dapat dilakukan dengan cara sebagai berikut: 1. mendeklarasikan array $nama_array = array();<br /> <br /> 2. mengisi nilai kedalam array $nama_array = {“isi1”, “isi2”, “isi3”, … };<br /> <br /> atau dengan mengisi langsung berdasarkan index: $nama_array[0] = “isi1”; $nama_array[1] = “isi2”;<br /> <br /> 2.4.1.2 Mengakses Array Untuk mengakses nilai dari array dapat dilakukan dengan cara: - menggunakan index dari array secara langsung, misal: echo $nama_array[0]; echo $nama_array[1];<br /> <br /> - menggunakan perulangan, misal: 1. foreach ($nama_array as $isi_array) { echo “$isi_array <br />”; } 2. while ($nama_array) { echo $nama_array[$index_array]; } 3. for ($i = 0 ; $i < count($nama_array) ; $i++) { echo “$nama_array[$i] <br />”; }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 27<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 2.4.1.3 Mendapatkan Jumlah Elemen Array Untuk mendapatkan jumlah elemen dari suatu array, kita dapat menggunakan: Count($nama_array);<br /> <br /> Misal: <br /> <br /> // jumlah element<br /> <br /> 2.4.2 Array Pada ASP.NET 2.4.2.1 Membuat Array - mendeklarasikan array. Type[] nama_array;<br /> <br /> - menginitialize dan mengisikan nilai array type[] nama_array = new type[jumlah_elemen];<br /> <br /> misal: string[] test_array = new string[2]; test_array[0] = “isi1”; test_array[1] = “isi2”;<br /> <br /> atau: type[] nama_array = {“isi1”, “isi2”, “isi3”, ..} ;<br /> <br /> misal: atau: type[] nama_array = new type[] {“isi1”, “isi2”, “isi3”, .. }; string[] test_array = new string[] {“isi1”, “isi2”, “isi3”};<br /> <br /> 2.4.2.2 Mendapatkan Jumlah Elemen Array Untuk mendapatkan jumlah element dari array dapat dilakukan sebagai berikut: Jumlah_Elemen = nama_array.length; misal: string[] test_array = {“isi1”, “isi2”, “isi3”}; int jlhElemen = test_array.length;<br /> <br /> 2.4.2.3 Mengakses Array Untuk mengakses array dapat langsung menggunakan index Misal: Response.write test_array[0];<br /> <br /> Atau dengan menggunakan perulangan: For (int i=0 ; I < nama_array.length ; i++ ) { //…… }<br /> <br /> 2.4.3 Contoh Kode Array PHP<br /> <br /> //Pendeklarasian array $arrHari = array(); //Pengisian nilai kedalam array $arrHari = array("Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu");<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 28<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> //Pendeklarasian dan pengisian array $arrBulan = array("Januari", "Pebruari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "Nopember", "Desember"); //Pengambilan jumlah elemen array $cntHari = count($arrHari); $cntBulan = count($arrBulan); //Pengaksesan array echo "Nama Hari : "; for ($i=0 ; $i<$cntHari ; $i++) { echo "$arrHari[$i]"; if ($i != $cntHari-1) { echo ", "; } } echo "<br />"; echo "Nama Bulan : "; $j = 1; foreach($arrBulan as $bulan) { echo "$bulan"; if ($j != $cntBulan) { echo ", "; $j++; } }<br /> <br /> ASP.NET private void Page_Load(object sender, System.EventArgs e) { //Pendeklarasian array dan //Pengisian nilai kedalam array string[] arrHari = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu"}; string[] arrBulan = new string[] {"Januari", "Pebruari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "Nopember", "Desember"}; //Pengambilan jumlah elemen array int cntHari = arrHari.Length; int cntBulan = arrBulan.Length; //Pengaksesan array Response.Write("Nama Hari : "); int i; for (i = 0; i < cntHari; i++) { Response.Write(arrHari[i]); if (i != cntHari - 1) { Response.Write(", "); } } Response.Write("<br />"); Response.Write("Nama Bulan : "); int j = 1; foreach ( object bulan in arrBulan ) { Response.Write(bulan); if (j != cntBulan) { Response.Write(", "); j++; } }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 29<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> }<br /> <br /> output:<br /> <br /> 2.5<br /> <br /> Fungsi<br /> <br /> Mungkin kita pernah membuat suatu script, dimana dalam script tersebut terdapat beberapa baris kode yang sama yang dituliskan berulang-ulang, padahal hal tersebut tidak perlu karena kita dapat meringkasnya dengan membuat suatu fungsi. Fungsi atau function adalah suatu blok code yang dapat digunakan untuk melakukan suatu proses yang dapat dipanggil dari bagian manasaja dari suatu script. Fungsi dapat berupa fungsi yang mengembalikan nilai atau fungsi yang tidak mengembalikan nilai. Misal: - fungsi yang tidak mengembalikan nilai function test_fungsi() { echo “test untuk fungsi”; }<br /> <br /> - fungsi yang mengembalikan nilai, cukup dengan menggunakan keyword return diikuti nilai yang mau dikembalikan. function test_fungsi2() { $var = 1; $var++; return $var; }<br /> <br /> - fungsi dapat juga menerima parameter yang digunakan untuk diproses lebih lanjut. Misal: Function test_fungsi3($parameter1, $parameter2) { $var1 = $parameter1 + $parameter2; echo $var1; }<br /> <br /> sedangkan fungsi pada asp.net dapat dilakukan sebagai berikut: - fungsi yang tidak mengembalikan nilai. Digunakan keyword void. misal: void test_fungsi() { ... }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 30<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> - fungsi yang mengembalikan nilai. Digunakan Misal: // deklarasi fungsi yang mengembalikan nilai string String test_fungsi2() { ... return (String) val; }<br /> <br /> - fungsi yang menerima parameter. misal: String parmfunction(String parameter1, String parameter2) { ... return (String) (parameter1 + parameter2); }<br /> <br /> 2.5.1 Contoh Kode Fungsi PHP <br /> $hari = ambilHari(); echo "Tanggal hari ini: $hari, "; //panggil fungsi tampilTanggal tampilTanggal(); echo "<br />"; //pindah baris //tampilkan nama lengkap echo "Nama: "; //panggil fungsi namaLengkap namaLengkap("Code", "Warrior"); echo "<br />"; //pindah baris //tampilkan umur $umur = tampilUmur(1980); echo "Umur: $umur tahun<br />"; //fungsi yang tidak mengembalikan nilai function tampilTanggal() { echo date("d-m-Y"); //tampilkan tanggal hari ini } /* catatan: fungsi date() digunakanan untuk menampilkan tanggal hari ini */ //fungsi yang mengembalikan nilai function ambilHari() { $hari = date("l"); switch($hari){ case "Sunday": return "Minggu"; break; case "Monday": return "Senin"; break; case "Tuesday": return "Selasa"; break; case "Wednesday": return "Rabu"; break; case "Thursday": return "Kamis";<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 31<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> break; case "Friday": return "Jum'at"; break; case "Saturday": return "Sabtu"; break; } // switch } //fungsi yang menerima parameter function namaLengkap($namaDepan, $namaBelakang) { echo $namaDepan . " " . $namaBelakang; } //fungsi yang menerima parameter dan mengembalikan nilai function tampilUmur($tahunLahir) { $today = date("Y"); return ($today - $tahunLahir); } ?><br /> <br /> ASP.NET private void Page_Load(object sender, System.EventArgs e) { string hari; int umur; hari = ambilHari(); Response.Write("Tanggal hari ini: " + hari + ", "); //panggil fungsi tampilTanggal tampilTanggal(); Response.Write("<br />"); //tampilkan nama lengkap Response.Write("Nama: "); namaLengkap("Code", "Warrior"); Response.Write("<br />"); //tampilkan umur umur = tampilUmur(1980); Response.Write("Umur: " + umur + " tahun<br />"); } string ambilHari() { string hari = "", namaHari = ""; hari = System.DateTime.Now.DayOfWeek.ToString(); switch (hari) { case "Sunday": namaHari = "Minggu"; break; case "Monday": namaHari = "Senin"; break; case "Tuesday": namaHari = "Selasa"; break; case "Wednesday": namaHari = "Rabu"; break;<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 32<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> case "Thursday": namaHari = "Kamis"; break; case "Friday": namaHari = "Jum'at"; break; case "Saturday": namaHari = "Sabtu"; break; }// switch return namaHari; } void tampilTanggal() { string tanggal = DateTime.Now.ToString("dd-MM-yyyy"); Response.Write(tanggal); } void namaLengkap(string namaDepan, string namaBelakang) { Response.Write(namaDepan + " " + namaBelakang); } int tampilUmur(int tahunLahir) { int today; today = System.DateTime.Now.Year; return (today - tahunLahir); }<br /> <br /> Output:<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 33<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 3. Manajemen State Rimbun Marpaung<br /> <br /> 3.1 Cookies Cookies adalah sejumlah kecil data yang disimpan baik itu dalam satu file teks di file system client atau di memory pada session browser client. Cookie ini berisi informasi suatu halaman tertentu yang dikirimkan server kepada client bersamaan dengan page output. Ketika user meminta (request) suatu halaman dari suatu situs, misalkan www.example.com, server tidak hanya mengirimkan halaman yang diinginkan, tetapi juga cookie yang berisi data dan waktu. Ketika browser pada user tersebut menerima halaman yang dipanggil, browser juga menerima cookie, yang kemudian cookie tersebut disimpan didalam folder di hard disk user. Pada lain waktu, ketika user meminta (request) satu halaman dari situs www.example.com, browser mencari cookie yang sesuai dengan URL tersebut di hard disk lokal. Jika cookie tersebut ditemukan, browser akan mengirim cookie tersebut bersamaan dengan halaman yang diminta (request). Cookie dapat digunakan untuk menyimpan informasi tentang client, session, atau aplication. Cookie di simpan di client device, dan ketika browser merequest suatu page, browser mengirimkan informasi yang terdapat pada cookie bersamaan dengan informasi request kepada server. Server bisa membaca cookie yang dikirimkan dan mengambil nilainya. Salah bentuk umum penggunaan cookie adalah untuk menyimpan suatu token (tanda) yang mengindikasikan user telah di autentikasi di dalam aplikasi. Catatan: Cookie jangan digunakan untuk menyimpan informasi yang sensitif, seperti user name atau password, karena orang yang tidak diinginkan dapat saja mengambil data dari cookie tersebut.<br /> <br /> 3.1.1 Cookie Pada PHP 3.1.1.1 Membuat Cookie Pada PHP, cookie dapat dibuat dengan dua cara, yaitu setcookie() dan setrawcookie(). 1. setcookie Syntax: setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])<br /> <br /> Parameter<br /> <br /> Keterangan<br /> <br /> name<br /> <br /> Nama cookie.<br /> <br /> value<br /> <br /> Nilai atau isi dari cookie. Niali ini<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> Contoh Nama cookie = 'namacookie' $_COOKIE['namacookie']<br /> <br /> Misalkan name = 'namacookie',<br /> <br /> 34<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> disimpan di computer client, jangan digunakan untuk menyimpan informasi yang sensitif (yang bersifat rahasia)<br /> <br /> nilainya bisa diambil dengan cara $_COOKIE['namacookie']<br /> <br /> time()+60*60*24*30, cookie expire<br /> <br /> Waktu berlakunya cookie dalam hitungan detik, dimulai dari cookie di bentuk.<br /> <br /> path<br /> <br /> Path (lokasi) di server dimana cookie akan berlaku.<br /> <br /> domain<br /> <br /> Domain berlaku<br /> <br /> secure<br /> <br /> Mengindikasikan cookie hanya akan dikirimkan melalui koneksi yang aman (https). Jika diset menjadi 1, cookie hanya akan diset jika koneksi yang secure (aman) tersedia. Nilai defaultnya adalah 0.<br /> <br /> dimana<br /> <br /> cookie<br /> <br /> akan<br /> <br /> akan diset berlaku hingga 30 hari. Jika tidak diset, cookie akan dihapus ketika akhir dari session (ketika browser ditutup). Jika diset menjadi ‘/’, cookie akan berlaku di seluruh domain. Jika di set menjadi ‘/contoh/’, cookie hanya akan berlaku dalam direktori /contoh/ dan semua subdirektorinya, seperti /contoh/misal/. Nilai defaultnya direktori sekarang dimana cookie akan diset. Untuk membuat cookie berlaku di semua subdomains dari example.com, maka harus diset menjadi '.example.com'. Tanda . tidak diperlukan tapi akan kompatibel dengan beberapa browser.<br /> <br /> 0 atau 1<br /> <br /> Contoh penggunaan: <br /> <br /> catatan: • nilai dari cookie hanya akan ditampilkan pada saat suatu page dipanggil untuk kedua kalinya. Hal ini disebabkan pada kesempatan pertama suatu halaman dipanggil, server baru saja mengirimkan cookiesnya dan meletakkannya dalam browser. Pada saat refresh atau dipanggil untuk kedua kalinya, browser melakukan permintaan kepada server sambil memberitahukan isi cookie kepada Project Otak – http://otak.csharpindonesia.net<br /> <br /> 35<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> •<br /> <br /> server. Untuk mencoba apakah cookie telah berhasil diset adalah dengan memeriksa cookie pada waktu page dipanggil untuk kedua kalinya sebelum batas waktu habis (expire) cookie. Salah satu cara untuk men-debug keberadaan dari suatu cookie adalah dengan menggunakan perintah print_r($_COOKIE). Cookies merupakan bagian dari HTTP header, jadi fungsi setcookie() harus dipanggil atau dijalankan sebelum output-output dikirimkan ke browser. Hal ini sama seperti fungsi header(), akan menimbulkan error bila sebelum fungsifungsi ini terdapat perintah output seperti echo(). Bila kita ingin menggunakan output sebelum fungsi - fungsi ini tanpa menghasilkan error, kita dapat menggunakan fungsi output buffering.<br /> <br /> Misal: <br /> ?> akan menghasilkan error bila dijalankan. Untuk menghilangkan error, kita dapat menggunakan output buffering. <br /> ?> contoh ini tidak akan menghasilkan error, karena output dari echo() akan disimpan di output buffer sampai function ob_end_flush() dipanggil. 2. setrawcookie setrawcookie – mengirimkan cookie tanpa urlencoding nilai dari cookie tersebut. syntax: setrawcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])<br /> <br /> Pada dasarnya setrawcookie() sama dengan setcookie(), hanya saja cookie tidak akan di urlencode secara otomatis pada waktu dikirim ke browser. 3.1.1.2 Pengaksesan Cookie Cookie dapat diakses dengan memanggil nama cookienya. Contoh: <br /> <br /> 3.1.1.3 Pencetakan Cookie<br /> <br /> Berikut ini adalah contoh pencetakan cookie: <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 36<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> // cara lain untuk men-debug/test untuk melihat semua cookies print_r($_COOKIE); ?><br /> <br /> 3.1.1.4 Menghapus Cookie Cookie dapat dihapus dengan cara membuat cookie dengan nama yang sama tetapi dengan data kosong (“”). Misal: <br /> <br /> 3.1.1.5 Menggunaan Cookie Dengan Array Selain sebagai data tunggal, cookie dapat juga dibuat dengan menggunakan data array. Misal: $isi) { echo "$nama : $isi <br />\n"; } } ?><br /> <br /> Hasil: satu : cookiesatu dua : cookiedua tiga : cookietiga 3.1.1.6 Memeriksa Dukungan Browser Terhadap Cookie Sebelum kita menggunakan cookies dalam aplikasi kita, ada baiknya kita uji dulu dukungan browser akan cookie. Jika browser tidak mendukung cookie, maka kita tidak akan dapat menggunakan cookie untuk menyimpan data yang kita inginkan. Berikut ini salah satu contoh untuk memeriksa dukungan browser terhadap cookie. Contoh ini berisi dua buah halaman. Halaman pertama melakukan pengisian cookie, sedangkan halaman kedua berisi pengecekan nilai cookie, jika nilai cookie dapat diambil, maka browser akan menampilkan pesan “Browser telah mendukung cookie”, jika tidak maka akan ditampilkan pesan “Browser tidak mendukung cookie”. Halaman pertama (file: cookie.php: <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 37<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> } ?><br /> <br /> Halaman kedua (CekCookie.php): <br /> <br /> jika kode pada halaman pertama dijalankan, apabila browser diset untuk menerima cookie, maka pada browser akan muncul teks “Browser telah mendukung cookie”, jika tidak maka akan muncul “Browser tidak mendukung cookie”.<br /> <br /> Gambar 3-1. tampilan browser apabila telah mendukung cookie<br /> <br /> 3.1.2 Cookies Pada ASP.Net 3.1.2.1 Membuat Cookies Cookie dapat dibuat dengan menggunakan objek Response. Cookie dapat ditambahkan kedalam Response.Cookies collection dengan beberapa cara. Yaitu: - membuat cookie dengan nama ‘NamaUser’, dengan nilai ‘nama user’, dan expire dalam satu hari dengan menggunakan objek Response: Response.Cookies("NamaUser").Value = "nama user" Response.Cookies("NamaUser").Expires = DateTime.Now.AddDays(1)<br /> <br /> - membuat cookie dengan nama ‘WaktuKunjung’, dengan nilai waktu sekarang, dan expire dalam satu hari dengan menggunakan objek cookie HttpCookie: Dim aCookie As New HttpCookie("WaktuKunjung") aCookie.Value = DateTime.Now.ToString aCookie.Expires = DateTime.Now.AddDays(1) Response.Cookies.Add(aCookie)<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 38<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 3.1.2.2 Cookies dengan Multi-Value (Subkeys) Pada contoh diatas, kita menggunakan satu cookie untuk tiap nilai yang ingin di buat. Kita dapat juga membuat satu cookie dengan banyak nilai. Misal: Response.Cookies("userInfo")("NamaUser") = "nama user" Response.Cookies("userInfo")("WaktuKunjung") = DateTime.Now.ToString Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)<br /> <br /> atau: Dim aCookie As New HttpCookie("userInfo") aCookie.Values("NamaUser") = "nama user" aCookie.Values("WaktuKunjung") = DateTime.Now.ToString aCookie.Expires = DateTime.Now.AddDays(1) Response.Cookies.Add(aCookie)<br /> <br /> 3.1.2.3 Ruang Lingkup Cookie Secara default, semua cookie untuk satu situs, disimpan bersama-sama di client dan semua cookie di kirim ke server dengan beberapa request kepada situs tersebut, dengan kata lain seluruh cookie dapat dipergunakan pada semua page pada situs tersebut. Untuk dapat membatasi jangkauan dari cookies dapat diset dengan 2 cara: 1. membatasi ruang lingkup cookies hanya pada satu folder, dengan cara menset path cookies property. Misal: Dim appCookie As New HttpCookie("AppCookie") appCookie.Value = "written " & Now.ToString appCookie.Expires = Now.AddDays(1) appCookie.Path = "/Contoh" Response.Cookies.Add(appCookie)<br /> <br /> Dengan cara tersebut, cookie hanya dapat digunakan pada folder ‘/contoh’ dan seluruh subfolder di dalam folder tersebut. 2. Membatasi ruang lingkup cookies pada satu domain. Seluruh subdomain pada domain tersebut dapat mengakses cookies. Misalkan kita mempunyai situs www.example.com, dan situs tersebut mempunyai beberapa subdomain seperti contoh.example.com dan misal.example.com, kita bisa mengasosiasikan cookies dengan subdomain tertentu dengan cara menset Domain cookie property. Misal: Response.Cookies("domain").Value = DateTime.Now.ToString Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) Response.Cookies("domain").Domain = "contoh.example.com”<br /> <br /> Ketika domain diset dengan cara ini, cookie dapat digunakan hanya untuk page (halaman-halaman) di subdomain tersebut. Kita juga dapat menggunakan Domain property untuk membuat suatu cookie yang bisa diakses oleh seluruh subdomain. Misal: Response.Cookies("domain").Value = DateTime.Now.ToString Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) Response.Cookies("domain").Domain = "example.com"<br /> <br /> Cookie akan dapat digunakan oleh seluruh subdomain didalam domain example.com, seperti contoh.example.com, misal.example.com. 3.1.2.4 Membaca Cookies Untuk membaca cookies dapat digunakan objek Request. Misal kita ingin membaca cookies dan mengisikan nilainya kedalam control label.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 39<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> If Not Request.Cookies("NamaUser") Is Nothing Then Label1.Text = Server.HtmlEncode(Request.Cookies("NamaUser").Value) End If If Not Request.Cookies("NamaUser") Is Nothing Then Dim aCookie As HttpCookie = Request.Cookies("NamaUser") Label1.Text = Server.HtmlEncode(aCookie.Value) End If<br /> <br /> Untuk membaca nilai dari subkey: If Not Request.Cookies("userInfo") Is Nothing Then Label1.Text = _ Server.HtmlEncode(Request.Cookies("userInfo")("NamaUser")) Label2.text = _ Server.HtmlEncode(Request.Cookies("userInfo")("WaktuKunjung")) End If<br /> <br /> atau: If Not Request.Cookies("userInfo") Is Nothing Then Dim UserInfoCookieCollection As _ System.Collections.Specialized.NameValueCollection UserInfoCookieCollection = Request.Cookies("userInfo").Values Label1.Text = Server.HtmlEncode(UserInfoCookieCollection("NamaUser")) Label2.Text = Server.HtmlEncode(UserInfoCookieCollection("WaktuKunjung")) End If<br /> <br /> 3.1.2.5 Membaca Cookie Collections Pada contoh diatas, kita membaca cookie dengan nama yang kita ketahui. Untuk mmbaca semua cookie yang terdapat pada suatu page, kita bisa menggunakan Request.Cookies collection. Dim Dim Dim For<br /> <br /> _<br /> <br /> i As Integer output As String = "" aCookie As HttpCookie i = 0 to Request.Cookies.Count - 1 aCookie = Request.Cookies(i) output &= "Nama Cookie = " & Server.HtmlEncode(aCookie.Name) & _ & "<br />" output &= "Nilai Cookie =" & Server.HtmlEncode(aCookie.Value) &<br /> <br /> & "<br /><br />" Next Label1.Text = output<br /> <br /> Untuk membaca cookie yang memiliki subkey, kita menggunakan property HasKey untuk mencek subkey yang ada, jika ada maka subkey akan ditampilkan dengan Values collection: Dim Dim Dim Dim Dim Dim For<br /> <br /> i As Integer j As Integer output As String = "" aCookie As HttpCookie subkeyName As String subkeyValue As String i = 0 To Request.Cookies.Count - 1<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 40<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> aCookie = Request.Cookies(i) output &= "Nama = " & aCookie.Name & "<br />" If aCookie.HasKeys Then For j = 0 To aCookie.Values.Count - 1 subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys(j)) subkeyValue = Server.HtmlEncode(aCookie.Values(j)) output &= "Nama Subkey = " & subkeyName & "<br />" output &= "Nilai Subkey = " & subkeyValue & "<br /><br />" Next Else output &= "Value = " & Server.HtmlEncode(aCookie.Value) & _ & "<br /><br />" End If Next Label1.Text = output<br /> <br /> Cara lain yaitu dengan mengekstrak subkey sebagai NameValueCollection objek. If aCookie.HasKeys Then Dim CookieValues As _ System.Collections.Specialized.NameValueCollection = aCookie.Values Dim CookieValueNames() As String = CookieValues.AllKeys For j = 0 To CookieValues.Count – 1 subkeyName = Server.HtmlEncode(CookieValueNames(j)) subkeyValue = Server.HtmlEncode(CookieValues(j)) output &= "Nama Subkey = " & subkeyName & "<br />" output &= "Nilai Subkey = " & subkeyValue & "<br /><br />" Next Else output &= "Value = " & aCookie.Value & "<br /><br />" End If<br /> <br /> 3.1.2.6 Modifikasi Nilai Cookies Contoh berikut menunjukkan cara mengganti nilai cookie yang menyimpan jumlah user yang mengunjungi suatu situs: Dim counter As Integer If Request.Cookies("counter") Is Nothing Then counter = 0 Else counter = CInt(Request.Cookies("counter").Value) End If counter += 1 Response.Cookies("counter").Value = counter.ToString Response.Cookies("counter").Expires = DateTime.Now.AddDays(1)<br /> <br /> atau: Dim ctrCookie As HttpCookie Dim counter As Integer If Request.Cookies("counter") Is Nothing Then ctrCookie = New HttpCookie("counter") Else ctrCookie = Request.Cookies("counter") End If counter = CInt(ctrCookie.Value) + 1 ctrCookie.Value = counter.ToString ctrCookie.Expires = DateTime.Now.AddDays(1) Response.Cookies.Add(ctrCookie)<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 41<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 3.1.2.7 Menghapus Cookies Untuk menghapus cookie, secara fisik tidak bisa karena cookie terletak di computer user. Tehnik untuk menghapus cookie adalah dengan membuat satu cookie dengan nama yang sama dengan cookie yang ingin dihapus, tetapi dengan men-set expire ke satu hari sebelum hari ini. Jadi ketika browser memeriksa waktu habis (expire) cookie, browser akan mengabaikannya karena sudah kadaluarsa (expire telah habis). Contoh berikut adalah untuk menghapus semua cookie: Dim Dim Dim For<br /> <br /> i As Integer cookieName As String limit As Integer = Request.Cookies.Count - 1 i = 0 To limit aCookie = Request.Cookies(i) aCookie.Expires = DateTime.Now.AddDays(-1) Response.Cookies.Add(aCookie) Next<br /> <br /> 3.1.2.8 Menghapus atau Mengubah Subkey Modifikasi atau mengubah subkey sama seperti membuat subkey pertama kali: Response.Cookies("userInfo")("WaktuKunjung") = DateTime.Now.ToString Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)<br /> <br /> Permasalahannya adalah bagaimana menghapus satu buah subkey. Kita tidak bisa secara langsung mengubah expire (batas waktu) dari cookie, karena akan menghapus semua subkey yang berada pada cookie tersebut. Jadi caranya dengan memanipulasi Values cookie collection yang menampung subkey tersebut. Pertama buat kembali cookie tersebut dengan mendapatkannya dari objek Request.Cookies, kemudian panggil metode Remove dari Values collection dengan memasukkan nama subkey yang ingin dihapus. Dan akhirnya, seperti biasa tambahkan lagi cookie yang telah dimodifikasi tersebut dengan Response.Cookies collection, jadi cookies tersebut akan dikirim kembali ke browser. Contoh menghapus subkey dengan nama ‘userName’: Dim subkeyName As String subkeyName = "NamaUser" Dim aCookie As HttpCookie = Request.Cookies("userInfo") aCookie.Values.Remove(subkeyName) aCookie.Expires = DateTime.Now.AddDays(1) Response.Cookies.Add(aCookie)<br /> <br /> 3.1.2.9 Cek Dukungan Browser Terhadap Cookies Masalah utama dalam penggunaan cookie adalah tidak disetnya browser untuk menerima cookie. User mungkin saja mematika fasilitas cookie di browsernya, mungkin karena masalah keamanan. Jadi bagaimana caranya untuk mengetahui apakah browser user tersebut menerima cookie atau tidak?, misalkan Response.Cookies tidak akan mengasilkan error bila browser tidak menerima cookie, karena server tidak bisa mendeteksi apakah browser bias menerima cookies atau tidak. Satu cara untuk memeriksa apakah browser menerima cookie atau tidak adalah dengan membuat satu cookie dan kemudian membaca cookie tersebut. Jika cookie tersebut tidak dapat dibaca, maka kita dapat menganggap browser tidak menerima cookie.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 42<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Contoh berikut menunjukkan cara mencek apakah browser menerima cookie atau tidak. Contoh ini berisi 2 page (halaman). Halaman pertama berisi kode untuk menulis cookie, kemudian browser akan dialihkan (redirect) ke halaman ke dua. Halaman kedua berisi kode untuk membaca cookie. Jika browser menerima cookie, maka browser akan dialihkan (redirect) kembali ke halaman pertama, dengan menambahkan variable query string pada URL yang berisi nilai dari cookie. Catatan: Query String adalah string yang terletak dibelakang tanda tanya (?) pada URL. Misal www.example.com/test.aspx?coba=1. maka yang disebut dengan query string adalah ‘coba=1’. Halaman pertama: <script runat=server> Sub Page_Load() If Not Page.IsPostBack Then If Request.QueryString("AcceptsCookies") Is Nothing Then Response.Cookies("TestCookie").Value = "ok" Response.Cookies("TestCookie").Expires = _ DateTime.Now.AddMinutes(1) Response.Redirect("TestCookie.aspx?redirect=" & _ Server.UrlEncode(Request.Url.ToString)) Else IF (Request.QueryString("AcceptsCookies") = 1 ) lblKeterangan.Text = "Browser mendukung cookies" Else lblKeterangan.Text = "Browser tidak mendukung cookies" End If End If End If End Sub <asp:label id="lblKeterangan" runat="server" rel="nofollow"></asp:label><br /> <br /> Pada halaman pertama ini, kita pertama sekali mencek apakah halaman tersebut telah di postback atau tidak, jika tidak maka kita akan mencek apakah query string telah ada atau tidak. Jika tidak berarti itu adalah pertama kali di buka, dan kita dapat membuat cookie, selanjutnya halaman akan kita alihkan ke halaman kedua, jika query string telah ada, berarti halaman tersebut merupakan pengalihan dari halaman kedua. Untuk berpindah halaman digunakan Response.Redirect property. Halaman kedua: <script runat=server> Sub Page_Load() Dim redirect As String = Request.QueryString("redirect") Dim acceptsCookies As String ' apakah cookie telah diterima? If Request.Cookies("TestCookie") Is Nothing Then ' tidak ada cookie, jadi ini tidak akan diterima acceptsCookies = 0 Else acceptsCookies = 1 ' hapus test cookie Response.Cookies("TestCookie").Expires = _ DateTime.Now.AddDays(-1) End If Response.Redirect(redirect & "?AcceptsCookies=" &_ & acceptsCookies, True) End Sub <br /> <br /> Pada halaman kedua ini, cookie akan dibaca jika ada, kemudian diambil nilainya untuk dikirim kembali kehalaman pertaman melalui query string. Setelah cookie selesai dibaca,<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 43<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> kemudian cookie dihapus dengan cara mengubah waktu habis (expire). Kemudian halaman akan dialihkan kembali ke halaman pertama. Pada halaman pertama jika query string yang diterima sama dengan cookie yang telah dibuat, berarti browser diset untuk menerima cookie, jika tidak maka sebaliknya. Jika kedua kode tersebut dijalankan, maka apabila browser memang mendukung cookie, maka hasilnya pada browser akan menampilkan teks “Browser mendukung cookie”, jika tidak maka browser akan menampilkan “Browser tidak mendukung cookie.<br /> <br /> Gambar 3-2. Tampilan browser apabila telah mendukung cookie<br /> <br /> 3.2. Session Pada dasarnya, session dan cookies adalah mempunyai kegunaan yang sama yaitu untuk menyimpan data. Yang membedakan antara keduanya adalah lokasi penyimpanan data. Kalau cookies data disimpan di client, sedangkan session disimpan di server. Suatu session dimulai ketika seorang user membuka suatu halaman untuk pertama kalinya dari suatu aplikasi dan berakhir ketika aplikasi tersebut secara eksplisit menutup session atau ketika session tersebut berakhir masa waktunya.<br /> <br /> 3.2.1 Session Pada PHP 3.2.1.1 Membuat Session Untuk membuat session pada PHP, pertama kali harus menggunakan fungsi session_start() pada bagian awal page, setelah itu dapat membuat session dan mengisikan nilai nya dengan menggunakan $_SESSION[“nama_session”] = “isi session”.<br /> <br /> Misal: <br /> <br /> dan setelah dibuat, session dapat dibaca dan ditampilkan pada browser dengan cara: <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 44<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> ?><br /> <br /> echo $_SESSION[“TestSession”];<br /> <br /> 3.2.1.2 Mendaftarkan dan Menyimpan Data Session Session dapat didaftarkan dengan menggunakan $session_register(“nama_variable1”, “nama_variable2”, ...). Setelah session didaftarkan, session dapat dihapus dengan menggunakan $session_unregister{“nama_variable1”, “nama_variable2”, ...). Misal: <br /> <br /> 3.2.1.3 Memeriksa dan Menghapus Session Untuk memeriksa apakah session telah terbentuk atau belum dapat menggunakan cara isset($_SESSION[“nama_session”]).<br /> <br /> Misal: <br /> <br /> Setelah<br /> <br /> session<br /> <br /> terbentuk<br /> <br /> dapat<br /> <br /> dihapus<br /> <br /> dengan<br /> <br /> menggunakan<br /> <br /> unset($_SESSION[“nama_session”]).<br /> <br /> Misal: <br /> <br /> 3.2.1.4 Mengidentifikasi Suatu Session Setiap session yang terbentuk, akan diberi nomor pengenal acak di server. Nomor ini bersifat unik dan disebut sebagai Session ID. Id dapat disimpan dalam suatu cookie pada sisi user atau disertakan pada URL. Untuk mengambil nilai Session Id ini, dapat menggunakan session_id(). Misal: <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 45<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> ?><br /> <br /> 3.2.2 Session Pada ASP.Net 3.2.2.1 Membuat dan Mengisi Data Session Untuk membuat dan mengisi data pada session dapat menggunakan objek session secara langsung. Syntax: Session(“nama_session”) = isi_session<br /> <br /> Misal: Session("NamaSession") = “Test Session” Session("WaktuSekarang") = Now<br /> <br /> Atau dengan menggunakan property contents dari objek session, ini digunakan untuk menjaga kompatibilitas dengan ASP klasik. Syntax: Session.Contents(“Nama_session”)<br /> <br /> Misal: Session.Contents("NamaSession") = “Test Session” Session.Contents("WaktuSekarang") = Now<br /> <br /> 3.2.2.2 Membaca Data dari Session Untuk membaca data dari session, ada baiknya kita cek dulu keberadaan dari session yang ingin dibaca, apakah sudah ada atau tidak dengan cara: If (Session("nama_session") = Isnull) Then ‘berarti session tidak ada Else ‘session telah ada ‘lakukan pengambilan atau pembacaan nilai disini End If<br /> <br /> Contoh: <Script runat=server> Sub TambahSession (sender As Object, e As EventArgs) Session("TestSession") = text1.Value span1.InnerHtml = "Session telah diisi! <p> Isi dari session: <font color="red">" + Session("TestSession").ToString() + "</font>" End Sub Sub CekSession(sender As Object, e As EventArgs) If (Session("TestSession") = Isnull) Then span1.InnerHtml = "yah.. isinya gak ada!" Else span1.InnerHtml = "isi session: <font color="red">" + Session("TestSession").ToString() + "</font>" End If End Sub </p><form runat="server"> <input id="text1" type="text" runat="server" /> <input type="submit" runat="server" onserverclick="TambahSession" value="Tambah Session" /> <input type="submit" runat="server" onserverclick="CekSession" value="Lihat Session" /><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 46<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> </form> <hr size="1" /> <font size="6"><span id=span1 runat=server/></font><br /> <br /> 3.2.2.3 Mengambil Jumlah Session Gets the number of items in the session-state collection. Syntax: Session.Count<br /> <br /> atau: Session.Contents.Count<br /> <br /> Misal: <%@ Page Language="vb"%> <% 'Menampilkan jumlah session yang ada Response.Write ("Jumlah session yang ada: " & Session.Count) Dim strNama, iLoop 'gunakan For Each ... Next untuk menampilkan semua collection For Each strNama in Session.Contents 'cek apakah variable session berupa array If IsArray(Session(strNama)) then 'jika berupa array, tampilkan semua element For iLoop = LBound(Session(strNama)) to UBound(Session(strNama)) Response.Write (strNama & "(" & iLoop & ") - " & _ Session(strNama)(iLoop) & "") Next Else 'tampilkan variable session yang bukan array Response.Write (strNama & " - " & Session.Contents(strNama) & " ") End If Next %><br /> <br /> 3.2.2.4 Mengubah Dan Menampilkan Masa Waktu Dari Session Untuk mengubah masa waktu (expire) dari suatu session dapat digunakan property Timeout dari objek Session, dengan catatan, waktu dalam menit. Syntax: Session.Timeout<br /> <br /> 3.2.2.5 Mengakhiri Session Untuk mengakhiri session dapat digunakan: 1. mengakhiri satu session Session.Remove(“nama_session”) Session.Contents.Remove(“nama_session”)<br /> <br /> 2. Menghapus semua session. Session.RemoveAll Session.Contents.RemoveAll Session.Abandon Session.Clear<br /> <br /> Contoh berikut menampilkan cara pembuatan, menghapus, mengambil jumlah session, dan menampilkan waktu habis (timeout) dari session. <%@ language="vb" %> <html> <script runat="server"><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 47<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 'menambah atau mengubah session sub AddClicked(Sender as Object, e as EventArgs) Session(Key.Text) = Value.Text end sub 'menghapus session sub RemoveClicked(Sender as Object, e as EventArgs) Session.Remove(Key.Text) end sub 'menghapus semua session dapat menggunakan method Abandon atau Clear sub RemoveAll(Sender as Object, e as EventArgs) Session.Abandon end sub <body> <h3>Session yang ada</h3> <form method="post" runat="server" id="Form1"> <table border="1" style="WIDTH:264px;HEIGHT:29px"> <tr> <td><b>Nama Session</b></td> <td><b>Nilai</b></td> </tr> <% 'menampilkan waktu timeout response.write ("Session timeout: " & Session.Timeout & " menit") dim strNamaSession as String dim strNilaiSession as String dim i as integer 'melakukan perulangan untuk menampilkan session dengan menggunakan 'method session.count for i=0 to Session.Count-1 strNamaSession = Session.Keys(i) strNilaiSession = cstr(Session(i)) 'menampilkan nama dan nilai session Response.Write("<tr><td>" & strNamaSession & "</td>” & _ “<td>" & strNilaiSession & "</td></tr>") next %> </table> <br /> Session <asp:textbox id="Key" runat="server" rel="nofollow"> Nilai <asp:textbox id="Value" runat="server" rel="nofollow"><br /> <asp:button text="Tambah/Ubah Session" onclick="AddClicked" runat="server" id="Button1" rel="nofollow"> <asp:button text="Hapus Session" onclick="RemoveClicked" runat="server" id="Button2" rel="nofollow"> <asp:button text="Hapus Semua Session" onclick="RemoveAll" runat="server" id="Button3" rel="nofollow"> </asp:button></asp:button></asp:button></asp:textbox></asp:textbox></form> </body> </html><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 48<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Gambar 3-3. Tampilan dari contoh menambah dan menghapus session 3.2.2.6 Mengidentifikasi Suatu Session Setiap session pada ASP.Net diidentifikasikan dengan menggunakan 120-bit SessionID string yang hanya berisi karakter ASCII yang dibolehkan dalam URL. Nilai SessionID ini dibuat melalui suatu algoritma yang rumit sehingga menjadikan nilai tersebut unik, jadi session tersebut tidak akan ada yang sama dan nilai tersebut dibuat secara acak (random). SessionID ini disimpan dalam cookie pada user atau disertakan pada URL. Untuk mengambil nilai dari SessionID dapat menggunakan property SessionID. Misal: Dim SessID as string SessID = Session.SessionID<br /> <br /> 3.2.2.7 Session Tanpa Cookie Secara default, session sebenarnya tergantung pada cookie. Semua browser pada saat ini telah mendukung cookie, hanya terkadang sebagian user mematikan fasilitas ini pada browser mereka. Pada kasus ini objek session tidak akan dapat digunakan. Salah satu fitur baru pada ASP.NET adalah kita dapat menkonfigurasikan session state menjadi cookieless session state (session tanpa cookie). Dengan kata lain dengan fitur ini client yang tidak menggunakan cookie dapat mengambil keuntungan dari ASP.Net session state. Hal ini dapat dilakukan dengan memodifikasi URL dengan menambahkan SessionID, seperti: http://localhost/(lit3py55t21z5v55vlm25s55)/Application/SessionState .aspx<br /> <br /> ASP.NET akan memodifikasi link-link relatif yang ditemukan dalam halaman tersebut dan mengandung ID ini. Jadi, selama user mengikuti path dari link-link yang disediakan situs tersebut, session dapat digunakan. Akan tetapi, jika user menulis ulang URL nya (tanpa SessionID - http://localhost/Application/SessionState.aspx), session dapat hilang.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 49<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Untuk dapat menggunakan fitur ini, nilai cookieless pada file web.config harus diset menjadi true. <configuration> <sessionstate mode="InProc" cookieless="true" timeout="20" /> </configuration><br /> <br /> 3.3 View State Pada ASP.Net Setiap control pada satu halaman web, termasuk halaman itu sendir, mempunyai property ViewState yang menginherit dari class base Control. ViewState digunakan oleh halaman ASP.NET untuk menyimpan nilai-nilai dari halaman tersebut dan setiap kontrol yang ada sebelum dirender pada halaman tersebut. Ketika halaman tersebut dikirim, tugas yang dilakukan pertama kali adalah mengembalikan viewstate. Pada ASP klasik, ketika satu form disubmit, semua nilai pada form tersebut akan dihapus. Jadi misalkan kita mensubmit satu form yang berisi informasi yang banyak ke server dan kemudian server mengembalikan pesan error, mungkin kesalahan pengisian atau masalah lain. Maka untuk memperbaikinya kita harus kembali lagi ke form yang menyebabkan error. Kita klik tombol Back, dan yang kemudian terjadi adalah semua nilai pada form tersebut telah hilang, dan kita harus kembali lagi mengisi semua informasi. Itu berarti situs tersebut tidak menjaga ViewState kita. Ketika satu form disubmit pada ASP.Net, form tersebut akan kembali menampilkan pada browser semua nilai form yang ada. Bagaimana bisa?. Ini terjadi karena ASP.Net dapat menjaga ViewState. ViewState mengindikasikan informasi daripada suatu halaman ketika disubmit keserver. Informasi tersebut didefenisikan pada satu hidden field yang ditempatkan pada tiap page dalam server form elemen <form runat="”server”">. Misalkan sebagai berikut: <form name="_ctl0" method="post" action="page.aspx" id="_ctl0"> <input type="hidden" name="__VIEWSTATE" value="dDwtNTI0ODU5MDE1Ozs+ZBCF2ryjMpeVgUrY2eTj79HNl4Q=" /> ..... kode diletak disini </form><br /> <br /> Setting default ViewState pada ASP.Net adalah akan selalu dijaga (disimpan). Jika kita tidak menginginkan untuk menyimpan ViewState, dapat dilakukan dengan menambahkan directive <%@ Page EnableViewState=”false”%> pada bagian atas dari halaman yang diinginkan atau dengan menambahkan attribut EnableViewState=”false” pada beberapa control. Berikut ini adalah contoh yang menunjukkan cara lama untuk melakukan hal tersebut diatas. Ketika tombol submit diklik, nilai pada form akan hilang. <html> <body> <form action="demo_classicasp.aspx" method="post"> Your name: <input type="text" name="fname" size="20" /> <input type="submit" value="Submit" /> </form> <% dim fname fname=Request.Form("fname")<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 50<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> If fname<>"" Then Response.Write("Hello " & fname & "!") End If %> </body> </html><br /> <br /> Contoh berikut ini adalah cara baru ASP.Net. Ketika tombol submit diklik, nilai form tidak akan hilang. <script runat="server"> Sub submit(sender As Object, e As EventArgs) lbl1.Text="Hello " & txt1.Text & "!" End Sub <html> <body> <form runat="server"> Nama: <asp:textbox id="txt1" runat="server" rel="nofollow"> <asp:button onclick="submit" text="Submit" runat="server" rel="nofollow"> <p><asp:label id="lbl1" runat="server" rel="nofollow"></asp:label></p> </asp:button></asp:textbox></form> </body> </html><br /> <br /> 3.3.1 Permasalahan dengan ViewState ViewState memiliki kelebihan dan kekurangan, jadi kita perlu memperhitungkan untuk mengambil keputusan menggunakan ini atau tidak. ViewState tidak memerlukan resources apapun dari server untuk melakukan operasi ini. ViewState dikirim oleh server kepada client ketika setiap kali postback sebagai hidden elemen. Ketika ViewState ditambahkan kesetiap halaman, ini juga menambahkan beberapa Kilobyte ke halamanhalaman tersebut. Ini mempengaruhi waktu loading halaman pada client. Masalah lain adalah, ketika viewstate ini dikirim kepada client sebagai plain text. Siapapun bisa mengambil nilai viewstate ini, karena itu jangan menggunakan ViewState untuk menyimpan informasi yang sensitif (penting). ViewState adalah salah satu feature yang penting pada ASP.Net. ViewState dapat meningkatkan kemampuan dari web form, tetapi jika tidak digunakan dengan hati-hati, maka dapat menjadi beban. Meskipun viewstate dapat dengan bebas diakses dalam satu hidden field yang disebut dengan __VIEWSTATE, informasi ViewState tidak dalam bentuk clear text. Secara default, suatu kode autentikasi machine-specific (machine-specific authentication code) di kalkulasikan pada data dan ditambahkan kepada ViewState string. Text hasilnya hanya dalam Base64 encoded, tidak di enkripsi. Untuk membuat ViewState lebih aman, ASP.Net @Page directive mendukung satu attribut yang disebut EnableViewStateMac yang berguna untuk mendeteksi kemungkinan kerusakan data asli.<br /> <br /> 3.3.2 Menyimpan Dan Mengambil Informasi dari ViewState Untuk menyimpan dan mengambil informasi dari ViewState, dapat digunakan property ViewState dari tiap-tiap kontrol. 3.3.2.1 Menyimpan Informasi Pada ViewState Untuk menyimpan informasi pada ViewState dapat langsung mengisikan informasi yang diinginkan pada property viewstate. Misal: ViewState("color") = "yellow"<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 51<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 3.3.2.2 Mengambil Nilai Dari ViewState Untuk mengambil nilai dari suatu element dengan menspesifikan namanya. Misal: Dim strColor as String strColor = CStr(ViewState("color"))<br /> <br /> Contoh berikut menunjukkan cara menyimpan satu dataset kedalam viewstate kemudian mengambil kembali nilainya. If Page.IsPostBack Then ‘mengambil nilai dari viewstate Dim sr as New System.IO.StringReader(CStr(ViewState("dsCustomers"))) DsCustomers1.ReadXml(sr) Else ‘mengisi sqldataadapter dengan dataset SqlDataAdapter1.Fill(DsCustomers1) Dim sw as New System.IO.StringWriter() DsCustomers1.WriteXml(sw) ‘menyimpan data kedalam viewstate ViewState("dsCustomers") = sw.ToString() End If<br /> <br /> 3.3.3 ViewState Pada DataGrid Jika pada satu datagrid yang memiliki ribuan record EnableViewStatenya diset menjadi true, maka ukuran ViewStatenya akan lebih dari 10 Kbytes. Tetapi jika ViewState di disablekan, beberapa event pada datagrid tidak akan dapat dijalankan. Postback dan tindakan ketika postback bergantung pada ViewState. Jadi jika datagrid tersebut readonly dan jika tidak menggunakan paging dan sorting, maka viewstate dapat didisablekan. Tetapi jika ingin menggunakan feature datagrid seperti paging atau sorting, maka viewstate tidak dapat didisablekan pada datagrid. Jadi untuk menghindari kelebihan beban sewaktu load pada mesin client karena ViewState, ViewState dapat didisablekan pada tiap-tiap item pada datagrid. Pendisablean dapat dilakukan dengan dua cara, cara pertama dengan mendisablekan tiap kolom ViewState ItemTemplate dengan mensetnya menjadi false. <asp:templatecolumn headertext="ProductID" rel="nofollow"> <itemtemplate> <asp:textbox id="ProductID" runat="server" enableviewstate="False" rel="nofollow"> </asp:textbox> </itemtemplate> </asp:templatecolumn><br /> <br /> cara lain adalah dengan mendisable ViewState untuk tiap item datagrid pada event handler Pre-Render Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender Dim dgi As DataGridItem For Each dgi In DataGrid1.Items dgi.EnableViewState = False Next End Sub<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 52<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 4. Validasi Rimbun Marpaung<br /> <br /> Dalam suatu aplikasi web, tak jarang kita menemukan form-form pengisian informasi. Misalkan untuk mendaftar email, membeli satu produk, atau registrasi (mendaftar) sebagai anggota suatu forum atau komunitas internet. Form ini sama halnya seperti formulir pengisian data pada kehidupan kita sehari-hari. Misalkan formulir pengurusan KTP, SIM, atau formulir pendaftaran apa saja. Pada formulir (form) terdapat kolomkolom untuk diisi dengan data-data yang sesuai, misalkan kolom untuk pengisian nama, alamat, dsb. Untuk menjaga keabsahan data, data yang diisi harus diperiksa kembali, itulah proses validasi, pemeriksaan kembali data yang dimasukkan harus sesuai dengan kriteria atau peraturan yang ditetapkan. Misalnya, nama harus diisi, umur harus dalam angka, dsb. Dalam kehidupan nyata, setelah selesai diisi, maka akan diperiksa oleh orang yang mengeluarkan formulir, jika ada kesalahan pengisian atau tidak diisi sama sekali, maka akan ada pemberitahuan mengenai hal tersebut. Bagaimana halnya dengan form pada suatu web?. Form pada web pun harus diperiksa juga pengisiannya. Apakah pengisiannya sudah dalam format yang benar, misalkan umur harus dalam bentuk angka dan harus berkisar antara 1-100, ataukah kolom tersebut harus diisi, misalkan kolom nama, dsb. Karena form pada web bersifat on-line atau real-time, maka pengecekannyapun dapat (harus) dilakukan pada saat itu juga. Misalkan kolom nama, jika harus diisi, ketika form tersebut dikirim, maka harus diperiksa apakah kolom nama tersebut diisi atau tidak, jika tidak diisi maka tampilkan pesan, jika diisi maka proses pendaftaran dilanjutkan. Jadi prosesnya kira-kira seperti ini: 1. form (formulir) diberikan untuk diisi 2. form diisi dengan data yang diinginkan 3. form dikirim (submit) 4. form diperiksa (divalidasi), jika ada kesalahan, tampilkan pesan, dan ulangi proses pengisian, jika benar lanjutkan proses. Untuk aplikasi web, validasi form dapat dilakukan dengan dua cara. Cara pertama dengan melakukan validasi pada sisi client. Cara ini biasanya dengan menggunakan client-side scripting, misalkan dengan menggunakan javascript. Validasi menggunakan javascript mempunyai kelebihan dan kekurangan. Kelebihaannya waktu yang dibutuhkan untuk memeriksa masukan lebih cepat karena diolah di komputer client (browser) bukan di server, tetapi kekurangannya tidak dapat digunakan jika komputer client (browser) tidak mendukung javascript atau fasilitas javascriptnya tidak dihidupkan. Selain itu kekurangannya juga source code (kode sumber)nya dapat dibaca karena dia bersifat client-side. Cara kedua adalah dengan melakukan validasi pada sisi server, yaitu dengan menggunakan server-side scripting, misalnya PHP dan ASP.Net.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 53<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 4.1 Validasi Pada PHP Pada PHP tidak terdapat fungsi-fungsi atau kontrol-kontrol khusus untuk validasi form. Jadi untuk melakukan validasi, terpaksa kita harus sedikit kreatif dengan membuat fungsi-fungsi sendiri. Sebelum kita membuat fungsi-fungsi tersebut, pertama kali kita harus membuat daftar apa yang mau divalidasi, misalkan textbox untuk nama, textbox untuk umur, dsb. Selanjutnya kriteria apa yang dibutuhkan untuk melakukan validasi, misalkan nama harus diisi, umur harus berupa angka, dsb. Dan terakhir pesan apa yang akan diberikan jika terdapat kondisi diluar dari kriteria yang diberikan. Baiklah, sebagai contoh, kita membuat satu form yang berisi textbox untuk menampung data: 1. nama 2. alamat 3. kode pos 4. alamat email 5. password 6. konfirmasi password dengan kriteria: - nama harus diisi - nama harus berupa huruf, tidak terdapat angka - kode pos harus dalam bentuk angka dan sebanyak 5 karakter - alamat email dengan format <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="acd4d4d4ecd4d4d4d4d482d4d4d4">[email protected]</a> - password harus minimal 6 huruf langkah pertama, membuat komponen pada form: <html> <head> Test Validasi ...</head> <body> <form action="result.php" method="post"> <table> <tr><td>Nama:</td><td><input type="text" name="txtNama" /></td></tr> <tr><td>Alamat:</td><td><input type="text" name="txtAlamat" /></td></tr> <tr><td>Kode Pos:</td><td><input type="text" name="txtKodePos" /></td></tr> <tr><td>Email:</td><td><input type="text" name="txtEmail" /></td></tr> <tr><td>Password:</td><td><input type="password" name="txtPass" /></td></tr> <tr><td>Konfirmasi:</td><td><input type="password" name="txtKonfirmasi" /></td></tr> </table><br /> <input type="submit" /> </form> <script data-cfasync="false"></script></body><br /> <br /> langkah kedua, buat fungsi-fungsi yang sesuai dengan kriteria. Untuk kriteria yang telah kita tentukan, maka fungsi yang akan dibuat adalah:<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 54<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 1. fungsi untuk memeriksa data diisi atau tidak. Untuk memeriksa apakah data diisi atau tidak dapat menggunakan cara memeriksa isi dari komponen yang akan diperiksa. Jika isinya kosong, maka berarti data tidak diisi. Function PeriksaIsi($element) { If ($element != “”) return true; Else return false; }<br /> <br /> fungsi akan mengembalikan nilai TRUE jika data diisi, FALSE jika kosong. 2. fungsi untuk memeriksa data berupa angka function PeriksaAngka($element) { return !preg_match ("/[^0-9]/", $element); }<br /> <br /> fungsi ini akan mengembalikan nilai TRUE apabila $element berupa angka, FALSE apabila bukan. 3. fungsi untuk memeriksa data berupa huruf function PeriksaHuruf($element) { return !preg_match ("/[^A-z]/", $element); }<br /> <br /> fungsi ini akan mengembalikan nilai TRUE apabila $element berupa huruf, FALSE jika bukan. 4. fungsi untuk memeriksa panjang karakter function PeriksaPanjang($element) { $length = strlen ($element); return $length; }<br /> <br /> fungsi ini akan mengembalikan nilai dari panjang data. 5. fungsi untuk memeriksa format email Untuk email, ada penanganan tersendiri, karena email mempunyai beberapa format, diantaranya: <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ec828d818dac828d818d">[email protected]</a>_domain.com <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0a646b676b556b7d6b6624646b676b556b616263784a646b676b">[email protected]</a>_domain.com <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="096768646856687e6865276768646856686261607b497a7c6b2767686468">[email protected]</a>_domain.id <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="abc5cac6caf4cac1caebc5cac6ca85c2c5cdc4">[email protected]</a> <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4aaa5a9a5eaa9a5b6a3a584aaa5a9a5">[email protected]</a>_domain.or.id<br /> <br /> Untuk menangani hal tersebut, kita harus memeriksanya satu persatu. Untuk mudahnya, alamat email kita bagi kedalam tiga bagian, bagian sebelum tanda @, tanda @, dan sesudah tanda @. Fungsinya dapat dibuat sebagai berikut: <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 55<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> . "@" . "[A-z0-9][A-z0-9-]*" . "(\.[A-z0-9_-]+)*" . "\.([A-z]{2,6})$/"; return preg_match ($pola, $email); } ?><br /> <br /> Setelah selesai, kita akan membuat satu halaman yang berisi semua fungsi diatas untuk melakukan validasi, halaman ini disimpan dengan nama TestValidasi.php. "; } else { if (PeriksaHuruf($nama) == FALSE) { echo "Nama harus berupa huruf<br />"; } } //cek field kode pos if (PeriksaAngka($pos) == false) { echo "Kode pos harus dalam angka<br />"; } else { if (PeriksaPanjang($pos)<5) { echo "Kode pos harus dalam 5 karakter<br />"; } } //cek field email if (PeriksaEmail($email) == FALSE) {<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 56<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> echo "Email harus dalam format yang benar<br />"; } //cek field password if (PeriksaPanjang($pass)<6) { echo "Password paling sedikit 6 karakter<br />"; } if ($pass != $konf) { echo "Password tidak sama<br />"; } } //================================================================== === ?> <html> <body> <form action="TestValidasi.php" method="post"> <table> <tr><td>Nama:</td><td><input type="text" name="txtNama" value="<?= $nama ?>" /></td></tr> <tr><td>Alamat:</td><td><input type="text" name="txtAlamat" value="<?= $alamat ?>" /></td></tr> <tr><td>Kode Pos:</td><td><input type="text" name="txtKodePos" value="<?= $pos ?>" /></td></tr> <tr><td>Email:</td><td><input type="text" name="txtEmail" value="<?= $email ?>" /></td></tr> <tr><td>Password:</td><td><input type="password" name="txtPass" value="<?= $pass ?>" /></td></tr> <tr><td>Konfirmasi:</td><td><input type="password" name="txtKonfirmasi" value="<?= $konf ?>" /></td></tr> </table><br /> <input type="hidden" name="submit" value="yes" /> <input type="submit" /> </form> <script data-cfasync="false"></script></body><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 57<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Gambar 4-1. Hasil dari validasi<br /> <br /> 4.2 Validasi Pada ASP.Net Tidak seperti pada PHP, ASP.Net mempunyai kontrol-kontrol yang sangat berguna untuk melakukan validasi input yang dimasukkan oleh user. Kontrol-kontrol itu adalah: Nama Kontrol<br /> <br /> Keterangan<br /> <br /> CompareValidator<br /> <br /> Membandingkan nilai dari satu kontrol input dengan kontrol input yang lain atau dengan satu nilai yang tetap.<br /> <br /> CustomValidator<br /> <br /> Memungkinkan kita untuk membuat satu fungsi khusus untuk melakukan validasi.<br /> <br /> RangeValidator<br /> <br /> Memeriksa nilai yang dimasukkan user dalam satu rentang nilai.<br /> <br /> RegularExpressionValidator<br /> <br /> Memastikan bahwa nilai yang dimasukkan user sesuai dengan kriteria (pola) yang ditentukan.<br /> <br /> RequiredFieldValidator<br /> <br /> Membuat satu input kontrol yang harus diisi.<br /> <br /> ValidationSummary<br /> <br /> Menampilkan satu laporan tentang semua error dalam satu web page ketika melakukan validasi.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 58<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Table 4.1 Daftar kontrol validasi pada ASP.NET<br /> <br /> Syntax untuk menggunakan kontrol validasi: <asp:control_name id="some_id" runat="server" rel="nofollow"><br /> <br /> 4.2.1 Kontrol CompareValidator CompareValidator digunakan untuk membandingkan nilai dari satu kontrol dengan nilai dari kontrol yang lain, atau membandingkan nilai satu kontrol dengan satu nilai yang tetap. Catatan: Jika kontrol input kosong, maka validasi akan sukses. Untuk mengatasi hal ini dapat digunakan RequiredFieldValidator.<br /> <br /> Kontrol CompareValidator mempunyai beberapa property, yaitu: Property<br /> <br /> Keterangan<br /> <br /> BackColor<br /> <br /> Warna latar belakang dari kontrol.<br /> <br /> ControlToCompare<br /> <br /> Nama kontrol untuk dibandingkan<br /> <br /> ControlToValidate<br /> <br /> Id kontrol yang mau divalidasi<br /> <br /> Display<br /> <br /> Tampilan untuk kontrol validasi. Nilai yang dibolehkan adalah: • None (kontrol tidak ditampilkan. Hanya digunakan untuk menampilkan pesan error pada kontrol ValidationSummary) • Static (kontrol menampilkan pesan error jika validasi gagal. Tempat pesan disediakan pada halaman walaupun input melewati validasi. • Dynamic (kontrol menampilkan satu pesan error jika validasi gagal. Tempat pesan tidak disediakan pada halaman jika input melewati validasi)<br /> <br /> EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah client-side validasi dapat dilakukan atau tidak.<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol validasi tersebut enable atau tidak<br /> <br /> ErrorMessage<br /> <br /> Text yang ditampilkan pada kontrol ValidationSummary ketika validasi gagal. catatan: text ini juga akan ditampilkan pada kontrol validasi jika property text tidak diset.<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> IsValid<br /> <br /> Satu nilai Boolean yang mengindikasikan apakah kontrol yang ditetapkan oleh ControlToValidate adalah ditetapkan<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 59<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> untuk valid Operator<br /> <br /> Type perbandingan untuk dilakukan. Operator-operatornya adalah: • Equal (=) • GreaterThan (>) • GreaterThanEqual (>=) • LessThan (<) • LessThanEqual (<=) • NotEqual (<>) • DataTypeCheck<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> Text<br /> <br /> Pesan yang ditampilkan ketika validasi gagal<br /> <br /> Type<br /> <br /> Menunjukkan type data dari nilai untuk dibandingkan. Typetypenya adalah: • Currency • Date • Double • Integer • String<br /> <br /> ValueToCompare<br /> <br /> Nilai yang ditetapkan untuk dibandingkan. Table 4.2 Property kontrol CompareValidator<br /> <br /> contoh 1: <html> <body> <form runat="server" id="Form1"> <table border="0" bgcolor="buttonface" style="WIDTH:328px;HEIGHT:100px"> <tr valign="top"> <td colspan="4"><h4>Membandingkan 2 nilai</h4></td> </tr> <tr valign="top"> <td style="WIDTH:155px"> <asp:textbox id="txt1" runat="server" rel="nofollow"> </asp:textbox></td> <td> = </td> <td><asp:textbox id="txt2" runat="server" rel="nofollow"></asp:textbox></td> <td></td> </tr> <tr> <td align="center" colspan="4"> <asp:button text="Periksa" runat="server" id="Button1" name="Button1" rel="nofollow"></asp:button></td> </tr> </table> <br /> <asp:comparevalidator id="compval" display="dynamic" rel="nofollow"> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 60<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> ControlToValidate="txt1" ControlToCompare="txt2" ForeColor="red" BackColor="yellow" Type="String" EnableClientScript="false" Text="Validation Failed!" runat="server">Oops validasi gagal ...! </asp:comparevalidator> </form> </body> </html><br /> <br /> Gambar 4-2. validasi menggunakan CompareValidator dengan operator equal ( =) contoh 2: <script runat="server"> sub check_operator(sender As Object, e As EventArgs) compval.Operator=CType(list.SelectedIndex,ValidationCompareOperator) compval.Validate() end sub <html> <body> <form runat="server"> <table border="0" bgcolor="#b0c4de"> <tr valign="top"> <td colspan="4"><h4>Membandingkan 2 nilai</h4></td> </tr> <tr valign="top"> <td><asp:textbox id="txt1" runat="server" rel="nofollow"></asp:textbox></td> <td> <asp:listbox id="list" rows="2" onselectedindexchanged="check_operator" runat="server" rel="nofollow"> <asp:listitem value="Equal" selected rel="nofollow">=</asp:listitem> <asp:listitem value="NotEqual" rel="nofollow"><></asp:listitem> </asp:listbox><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 61<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> </td> <td><asp:textbox id="txt2" runat="server" rel="nofollow"></asp:textbox></td> <td><asp:button text="Periksa" runat="server" rel="nofollow"></asp:button></td> </tr> </table> <br /> <asp:comparevalidator id="compval" display="dynamic" controltovalidate="txt1" controltocompare="txt2" forecolor="red" backcolor="yellow" type="String" enableclientscript="false" text="Oops validasi gagal…!" runat="server" rel="nofollow"> </asp:comparevalidator></form> </body> </html><br /> <br /> Gambar 4-3. validasi menggunakan CompareValidator dengan operator Equal (=) dan NotEqual (<>)<br /> <br /> 4.2.2 Kontrol CustomValidator Dengan kontrol ini kita dapat menulis satu fungsi atau method tersendiri untuk digunakan melakukan validasi terhadapa nilai yang dimasukkan. Kontrol ini mempunyai beberapa property, yaitu: Property<br /> <br /> Keterangan<br /> <br /> BackColor<br /> <br /> Warna latar belakang kontrol<br /> <br /> ClientValidationFunction Menunjukkan nama dari fungsi script validasi client-side untuk dijalankan. catatan: script harus di support oleh browser, seperti VBScript atau Jscript. Dengan VBScript, fungsi harus dalam form: Sub FunctionName (source, arguments) Dengan JScript, fungsi harus dalam form:<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 62<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Function FunctionName (source, arguments) ControlToValidate<br /> <br /> Id kontrol yang mau divalidasi<br /> <br /> Display<br /> <br /> Tampilan untuk kontrol validasi. Nilai yang dibolehkan adalah: • None (kontrol tidak ditampilkan. Hanya digunakan untuk menampilkan pesan error pada kontrol ValidationSummary) • Static (kontrol menampilkan pesan error jika validasi gagal. Tempat pesan disediakan pada halaman walaupun input melewati validasi. • Dynamic (kontrol menampilkan satu pesan error jika validasi gagal. Tempat pesan tidak disediakan pada halaman jika input melewati validasi)<br /> <br /> EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah validasi clientside enabled atau tidak<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol enabled atau tidak<br /> <br /> ErrorMessage<br /> <br /> Text yang ditampilkan pada kontrol ValidationSummary ketika validasi gagal. catatan: text ini juga akan ditampilkan pada kontrol validasi jika property text tidak diset.<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> IsValid<br /> <br /> Satu nilai Boolean yang mengindikasikan apakah kontrol yang ditetapkan oleh ControlToValidate adalah ditetapkan untuk valid<br /> <br /> OnServerValidate<br /> <br /> Menunjukkan nama dari fungsi script validasi server-side untuk dijalankan<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> Text<br /> <br /> Pesan yang ditampilkan ketika validasi gagal Table 4.3 Property kontrol CustomValidator<br /> <br /> contoh: <script runat="server"> Sub user(source As object,args As ServerValidateEventArgs) if len(args.Value)<8 or len(args.Value)>16 then args.IsValid=false else args.IsValid=true end if End Sub <html> <body> <form runat="server"> <asp:label runat="server" text="Nama: " rel="nofollow"> <asp:textbox id="txt1" runat="server" rel="nofollow"> <asp:button text="Daftar" runat="server" rel="nofollow"><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 63<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> <br /> <asp:label id="mess" runat="server" rel="nofollow"> <br /> <asp:customvalidator controltovalidate="txt1" onservervalidate="user" text="Nama harus antara 8 dan 16 karakter!" runat="server" rel="nofollow"> </asp:customvalidator></asp:label></asp:button></asp:textbox></asp:label></form> </body> </html><br /> <br /> Gambar 4-4. validasi menggunakan CustomValidator<br /> <br /> 4.2.3 Kontrol RangeValidator Kontrol ini berguna untuk memeriksa input yang dimasukkan oleh user apakah dalam rentang nilai yang ditetapkan. Rentang nilai dapat berupa nomor, tanggal atau karakter. Catatan: • Validasi tidak akan gagal jika kontrol input tidak diisi. Gunakan kontrol RequiredFieldValidator untuk mengatasi hal ini. • Validasi tidak akan gagal jika nilai yang dimasukkan tidak bisa dikonversikan ke tipe data yang ditetapkan. Gunakan kontrol CompareValidator dengan property Operator diset DataTypeCheck, untuk memeriksa tipe data dari nilai input. Kontrol RangeValidator mempunyai beberapa property, yaitu: Property<br /> <br /> Keterangan<br /> <br /> BackColor<br /> <br /> Warna latar belakang dari kontrol<br /> <br /> ControlToValidate<br /> <br /> Id kontrol yang mau divalidasi<br /> <br /> Display<br /> <br /> Tampilan untuk kontrol validasi. Nilai yang dibolehkan adalah: • None (kontrol tidak ditampilkan. Hanya digunakan untuk menampilkan pesan error pada kontrol ValidationSummary) • Static (kontrol menampilkan pesan error jika validasi gagal. Tempat pesan disediakan pada halaman walaupun input melewati validasi. • Dynamic (kontrol menampilkan satu pesan error jika validasi gagal. Tempat pesan tidak disediakan pada<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 64<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> halaman jika input melewati validasi) EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah validasi clientside enabled atau tidak<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol enabled atau tidak<br /> <br /> ErrorMessage<br /> <br /> Text yang ditampilkan pada kontrol ValidationSummary ketika validasi gagal. catatan: text ini juga akan ditampilkan pada kontrol validasi jika property text tidak diset.<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> IsValid<br /> <br /> Satu nilai Boolean yang mengindikasikan apakah kontrol yang ditetapkan oleh ControlToValidate adalah ditetapkan untuk valid<br /> <br /> MaximumValue<br /> <br /> Menunjukkan nilai maximum dari kontrol input<br /> <br /> MinimumValue<br /> <br /> Menunjukkan nilai minimum dari kontrol input<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> Type<br /> <br /> Menunjukkan type data dari nilai untuk diperiksa. Typetypenya adalah: • Currency • Date • Double • Integer • String<br /> <br /> Text<br /> <br /> Pesan yang ditampilkan ketika validasi gagal Table 4.4 Property kontrol RangeValidator<br /> <br /> contoh 1: <html> <body> <form runat="server"> Masukkan tanggal antara 1/1/2002 dan /1/2002: <br /> <asp:textbox id="tbox1" runat="server" rel="nofollow"> <br /><br /> <asp:button text="Periksa" runat="server" rel="nofollow"> <br /><br /> <asp:rangevalidator controltovalidate="tbox1" minimumvalue="1/1/2002" maximumvalue="1/1/2003" type="Date" enableclientscript="false" text="Tanggal harus antara 1/1/2002 dan 1/1/2003!" runat="server" rel="nofollow"> </asp:rangevalidator></asp:button></asp:textbox></form><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 65<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> </body> </html><br /> <br /> Gambar 4-5. validasi menggunakan RangeValidator<br /> <br /> 4.2.4 Kontrol RegularExpressionValidator Kontrol ini digunakan untuk memastikan bahwa user memasukkan input yang sesuai dengan kriteria atau pola yang telah ditetapkan. Catatan: Validasi tidak akan gagal jika kontrol input kosong. Untuk mengatasi hal ini dapat digunakan kontrol RequiredFieldValidator, agar field ini harus selalu diisi. Kontrol ini memiliki beberapa property, yaitu: Property<br /> <br /> Keterangan<br /> <br /> BackColor<br /> <br /> Warna latar belakang dari kontrol<br /> <br /> ControlToValidate<br /> <br /> Id kontrol yang ingin divalidasi<br /> <br /> Display<br /> <br /> Tampilan untuk kontrol validasi. Nilai yang dibolehkan adalah: • None (kontrol tidak ditampilkan. Hanya digunakan untuk menampilkan pesan error pada kontrol ValidationSummary) • Static (kontrol menampilkan pesan error jika validasi gagal. Tempat pesan disediakan pada halaman walaupun input melewati validasi. • Dynamic (kontrol menampilkan satu pesan error jika validasi gagal. Tempat pesan tidak disediakan pada halaman jika input melewati validasi)<br /> <br /> EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah validasi clientside enabled atau tidak<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 66<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol enabled atau tidak<br /> <br /> ErrorMessage<br /> <br /> Text yang ditampilkan pada kontrol ValidationSummary ketika validasi gagal. catatan: text ini juga akan ditampilkan pada kontrol validasi jika property text tidak diset.<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> IsValid<br /> <br /> Satu nilai Boolean yang mengindikasikan apakah kontrol yang ditetapkan oleh ControlToValidate adalah ditetapkan untuk valid<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> Text<br /> <br /> Pesan yang ditampilkan ketika validasi gagal<br /> <br /> ValidationExpression<br /> <br /> Menunjukkan ekspresi (pernyataan) yang digunakan untuk melakukan validasi terhadapa kontrol input. Syntax ekspresi validasi berbeda di client dengan di server. JScript digunakan pada client. Pada server, bahasa yang telah ditetapkan yang akan digunakan.<br /> <br /> Table 4.5 Property kontrol RegularExpressionValidator contoh: <script runat="server"> sub submit(sender As Object, e As EventArgs) if Page.IsValid then lbl.Text="halaman valid!" else lbl.Text="halaman tidak valid!" end if end sub <html> <body> <form runat="server"> Kode pos: <asp:textbox id="txtbox1" runat="server" rel="nofollow"> <br /><br /> <asp:button text="Submit" onclick="Periksa" runat="server" rel="nofollow"> <br /><br /> <asp:label id="lbl" runat="server" rel="nofollow"> <br /> <asp:regularexpressionvalidator controltovalidate="txtbox1" validationexpression="\d{5}" enableclientscript="false" errormessage="Kode pos harus dalam angka sebanyak 5 karakter!" runat="server" rel="nofollow"> </asp:regularexpressionvalidator></asp:label></asp:button></asp:textbox></form> </body> </html><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 67<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Gambar 4-6. validasi menggunakan RegularExpressionValidator<br /> <br /> 4.2.5 Kontrol RequiredFieldValidator Kontrol ini digunakan untuk membuat satu input kontrol yang harus diisi. Dengan kontrol ini maka validasi akan gagal jika nilai yang dimasukkan tidak berubah dari nilai initial. Secara default, nilai initial adalah string kosong (“”). Kontrol ini memiliki beberapa property, yaitu: Property Keterangan BackColor<br /> <br /> Warna latar belakang dari kontrol<br /> <br /> ControlToValidate<br /> <br /> Id kontrol yang ingin divalidasi<br /> <br /> Display<br /> <br /> Tampilan untuk kontrol validasi. Nilai yang dibolehkan adalah: • None (kontrol tidak ditampilkan. Hanya digunakan untuk menampilkan pesan error pada kontrol ValidationSummary) • Static (kontrol menampilkan pesan error jika validasi gagal. Tempat pesan disediakan pada halaman walaupun input melewati validasi. • Dynamic (kontrol menampilkan satu pesan error jika validasi gagal. Tempat pesan tidak disediakan pada halaman jika input melewati validasi)<br /> <br /> EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah validasi clientside enabled atau tidak<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol enabled atau tidak<br /> <br /> ErrorMessage<br /> <br /> Text yang ditampilkan pada kontrol ValidationSummary ketika validasi gagal. catatan: text ini juga akan ditampilkan pada kontrol validasi jika property text tidak diset.<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 68<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> InitialValue<br /> <br /> Menunjukkan nilai awal dari input kontrol. Nilai default adalah ""<br /> <br /> IsValid<br /> <br /> Satu nilai Boolean yang mengindikasikan apakah kontrol yang ditetapkan oleh ControlToValidate adalah ditetapkan untuk valid<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> Text<br /> <br /> Pesan yang ditampilkan ketika validasi gagal Table 4.6 Property kontrol RequiredFieldValidator<br /> <br /> contoh: <html> <body> <form runat="server"> Nama: <asp:textbox id="name" runat="server" rel="nofollow"> <br /> <asp:button runat="server" text="Periksa" rel="nofollow"> <br /><br /> <asp:requiredfieldvalidator controltovalidate="name" text="Isi dong namanya .. !" runat="server" rel="nofollow"> </asp:requiredfieldvalidator></asp:button></asp:textbox></form> </body> </html><br /> <br /> Gambar 4-7. validasi menggunakan RequiredFieldValidator<br /> <br /> 4.2.6 Kontrol ValidationSummary Kontrol ini digunakan untuk menampilkan satu report yang berisi semua error yang didapati ketika melakukan validasi pada satu halaman web (web page). Pesan error yang ditampilkan pada kontrol ini ditentukan oleh property ErrorMessage dari tiap kontrol validasi. Jika property ErrorMessage dari kontrol validasi tidak diset, tidak ada pesan error yang akan ditampilkan pada kontrol validasi tersebut. Kontrol ini memiliki beberapa property, yaitu:<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 69<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Property<br /> <br /> Keterangan<br /> <br /> DisplayMode<br /> <br /> Menunjukkan bagaimana menampilkan laporan. Nilai yang dibolehkan: • BulletList • List • SingleParagraph<br /> <br /> EnableClientScript<br /> <br /> Satu nilai Boolean yang menunjukan apakah validasi clientside enabled atau tidak<br /> <br /> Enabled<br /> <br /> Satu nilai Boolean yang menunjukkan apakah kontrol enabled atau tidak<br /> <br /> ForeColor<br /> <br /> Warna depan dari kontrol<br /> <br /> HeaderText<br /> <br /> Header pada kontrol ValidationSummary<br /> <br /> id<br /> <br /> Id unik untuk kontrol<br /> <br /> runat<br /> <br /> Menunjukkan kontrol tersebut adalah server kontrol. Harus di set menjadi "server"<br /> <br /> ShowMessageBox<br /> <br /> Suatu nilai boolean yang menunjukkan apakah laporan akan ditampilkan dalam satu message box atau tidak<br /> <br /> ShowSummary<br /> <br /> Sutau nilai boolean yang menunjukkan apakah kontrol ValidationSummary akan ditampilkan atau disembunyikan Table 4.7 Property kontrol ValidationSummary<br /> <br /> contoh 1: <html> <body> <form runat="server"> <table> <tr> <td> <table bgcolor="#b0c4de" cellspacing="10"> <tr> <td align="right">Nama:</td> <td><asp:textbox id="txt_name" runat="server" rel="nofollow"></asp:textbox></td> <td> <asp:requiredfieldvalidator controltovalidate="txt_name" errormessage="Name" text="*" runat="server" rel="nofollow"> </asp:requiredfieldvalidator></td> </tr> <tr> <td align="right">Tipe Kartu:</td> <td> <asp:radiobuttonlist id="rlist_type" repeatlayout="Flow" runat="server" rel="nofollow"> <asp:listitem rel="nofollow">Diners</asp:listitem> <asp:listitem rel="nofollow">MasterCard</asp:listitem> <asp:listitem rel="nofollow">Visa</asp:listitem> </asp:radiobuttonlist><br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 70<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> </td> <td> <asp:requiredfieldvalidator controltovalidate="rlist_type" errormessage="Tipe Kartu" initialvalue text="*" runat="server" rel="nofollow"> </asp:requiredfieldvalidator></td> </tr> <tr> <td></td> <td><asp:button id="b1" text="Periksa" runat="server" rel="nofollow"></asp:button></td> <td></td> </tr> </table> </td> </tr> </table> <br /> <asp:validationsummary headertext=" Field ini harus diisi !:" displaymode="BulletList" enableclientscript="true" runat="server" rel="nofollow"> </asp:validationsummary></form> </body> </html><br /> <br /> Gambar 4-8. validasi menggunakan ValidationSummary<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 71<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 5. Penanganan Error Basirudin Rachman<br /> <br /> Suatu yang tidak dapat dihindari ketika membangun program adalah error. Banyak hal yang dapat menimbulkan error dalam pembangunan suatu program. Menurut Schlossnagle, G. error dapat timbul dalam 2 bentuk : Error eksternal : error ini muncul karena suatu bagian dari kode program yang memang tidak didisain sebagai bagian untuk antisipasi, misalnya : error yang muncul karena koneksi ke database tidak bisa dilakukan, padahal kode program berasumsi koneksi selalu berhasil. Error logika kode : error ini biasa disebut sebagai bug, terjadi karena kode program memang tidak secara sempurna menangani permasalahan baik masalah logika maupun masalah yang sederhana seperti permasalahan tipe. Kedua error tersebut diatas dapat dibedakan dengan beberapa cara : Error eksternal , akan tetap ada sekalipun suatu program sudah dinyatakan sebagai program yang bebas dari bugs, karena error tidak muncul dari dalam program tetapi dari luar. Error eksternal , yang tidak diperhitungkan sebagai kesalahan logika dapat juga menjadi bugs. Seperti contoh koneksi database yang selalu diasumsikan berhasil bisa menjadi bugs karena aplikasi tidak selalu mendapatkan hasil yang diinginkan. Error logika kode, merupakan sesuatu yang sangat sulit untuk diperiksa karena lokasi kesalahan biasanya tidak diketahui.<br /> <br /> 5.1 Penanganan Error Penanganan terhadap error yang muncul pada kode program merupakan sesuatu yang sangat penting. Selain untuk menghasilkan program yang bebas bugs, penanganan error sangat berpengaruh pada alur program. Pada umumnya bahasa program untuk membangun suatu program telah menyediakan fasilitas untuk menangani error, baik error eksternal maupun error logika, kecuali error eksternal yang timbul disebabkan oleh hal lain dari luar program yang tidak terprediksi. Secara umum penanganan error pada bahasa program yang ada saat ini dapat dibedakan menjadi 2 jenis : Penanganan error dengan mengecek nilai kembalian dari suatu fungsi. Biasanya disediakan oleh bahasa program dengan pendekatan pemrograman yang prosedural, seperti C, PHP (versi 4 kebawah, untuk versi 5 juga masih di dukung tetapi sudah menyediakan penanganan exception dengan try catch sehingga akan dimasukkan ke jenis ke 2. Sebagai contoh penanganan error jenis ini , menggunakan PHP : <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 72<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> {<br /> <br /> echo "Hasil sqrt : $b";<br /> <br /> } else { echo "Operasi sqrt tidak dapat dilakukan"; ?><br /> <br /> }<br /> <br /> hasil dari program akan mencetak “Operasi sqrt tidak dapat dilakukan”. Operasi sqrt sendiri tidak mengijinkan variable string sebagai parameter yang dikirim sehingga terjadi error yang dilakukan penanganan dengan mencetak informasi seperti di atas. Penanganan error dengan penanganan exception. Fasilitas ini disediakan oleh banyak bahasa program yang datang setelah bahasa program C, seperti C++, Java, C#, dan PHP versi 5. Sebagai contoh untuk menangani masalah seperti masalah pada jenis 1 diatas , menggunakan C# : using System; namespace cs { public class mpnet105_5_001 { public mpnet105_5_001() { object a = "sebuah kalimat"; try { double b = Math.Sqrt(double.Parse(a.ToString())); } catch(Exception) { Console.Write("Operasi sqrt tidak dapat dilakukan"); } } [STAThread] static void Main(string[] args) { mpnet105_5_001 mpnet1055001 = new mpnet105_5_001(); } } }<br /> <br /> Penanganan exception berlaku pada kode yang berada di dalam bagian try, untuk kode diatas adalah bagian : double b = Math.Sqrt(double.Parse(a.ToString()));<br /> <br /> Sementara bagian catch mendefiniskan tipe exception yang menangani error dan variable untuk menyimpannya. Pada contoh diatas jenis exception yang digunakan adalah kelas Exception, dan di dalam bagian catch dapat dituliskan kode untuk menangani masalah yang terjadi, sekedar mengirim pesan atau informasi tentang masalah yang terjadi yang dapat dituliskan langsung sebagai output program atau dalam log file atau dikirim dalam format e-mail. Atau dapat juga langsung keluar dari program.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 73<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 5.2 Penanganan Error Pada PHP Penjelasan penangan error pada PHP akan dibagi menjadi 2 bagian yaitu penanganan yang dapat dilakukan pada versi PHP 4 kebawah dan kemampuan penangan error yang baru, disediakan oleh PHP 5 berupa penangan exception. Secara umum untuk mendapatkan pesan error pada pemrograman PHP terlebih dahulu kita harus memastikan bahwa salah satu parameter untuk menampilkan pesan error yang disebut display_errors harus diberi nilai On yang harus dilakukan pada file php.ini. Pemberian nilai On tidak direkomendasikan ketika program telah memasuki tahap production (PHP Manual, 2004). PHP mempunyain 8 tipe error untuk mengkatagorikan error yang dapat timbul ketika script dieksekusi, yaitu : E_NOTICE. Akan timbul bila dalam eksekusi script PHP menemukan sesuatu yang kemungkinan dapat menyebabkan error (seperti mencoba mengakses variable yang belum didefinisikan). E_WARNING. Peringatan yang timbul ketika runtime, tanpa menyebabkan eksekusi script berikutnya berhenti. Sebagai contoh adalah mengirim parameter yang tidak sesuai dengan yang diharapkan pada fungsi internal PHP, seperti fopen(). E_ERROR. Mengindikasikan error yang tidak dapat dipulihkan. Script akan berhenti apabila menemukan error tipe ini. E_PARSE. Timbul karena kesalahan sintaks ditemukan dalam script, Script akan berhenti karena error ini. E_CORE_ERROR. Sama dengan E_ERROR tapi diakibatkan bukan oleh fungsi di PHP tapi oleh bagian inti dari PHP. E_CORE_WARNING. Seperti E_WARNING tapi diakibatkan oleh inti dari PHP. E_COMPILE_ERROR. Ditimbulkan oleh engine Zend, diperlakukan sama seperti E_ERROR atau E_CORE_ERROR. E_COMPILE_WARNING. Ditimbulkan oleh engine Zend, diperlakukan sama sepertin E_WARNING atau E_CORE_WARNING. Selain tipe error diatas, PHP juga mempunyai 3 tipe error yang dibuat oleh user menggunakan fungsi trigger_error(), yaitu : E_USER_NOTICE. E_NOTICE yang dibuat oleh user. E_USER_WARNING. E_WARNING yang dibuat oleh user. E_USER_ERROR. E_ERROR yang dibuat oleh user. Penggunaan tipe error diatas berpengaruh pada tampilnya pesan error bila terjadi kesalahan ketika script dijalankan. Secara umum konfigurasi pesan error untuk setiap jenis error apakah ditampilkan atau tidak terdapat pada file php.ini, konfigurasi ini berlaku global. Konfigurasi pada file php.ini menggunakan directive error_reporting. Secara umum konfigurasi default error_reporting akan bernilai E_ALL, artinya akan menampilkan semua error (E_*ERROR), warning (E_*WARNING), dan notice (E_*NOTICE). Sebagai contoh untuk script berikut, menggunakan konfigurasi global : <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 74<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> if ( $nlai == 45 ) print "\$nilai adalah 45"; else print "\$nilai bukan 45"; ?><br /> <br /> Akan memberikan keluaran dari script sebagai berikut : Notice: Undefined variable: nilai in D:\otak\code\php\mpnet105_5_002.php on line 3 $nilai bukan 45 Tipe error ini termasuk tipe E_NOTICE, karena terdapat kesalahan penulisan variabale $nilai menjadi $nlai pada baris ke 3 kode. PHP juga mengijinkan user untuk mengubah level error yang diinginkan, menampilkan stau level error dan menyembunyikan level error lainnya atau menampilkan hanya 2 level error yang diinginkan. Misal untuk hanya menampilkan level error warning (E_WARNING) dan error (E_ERROR) maka error_reporting diubah nilainya dengan contoh sintaks seperti berikut ini (ditulis di php.ini) : error_reporting<br /> <br /> = E_WARNING | E_ERROR;<br /> <br /> Maka untuk script seperti diatas akan memberikan keluaran tanpa pesan notice seperti ini: $nilai bukan 45 User dapat mengubah level error pada tingkat script, menggunakan fungsi PHP error_reporting(). Misal apabila di php.ini level error yang telah didefinisikan tanpa E_NOTICE, maka untuk script contoh diatas dapat ditambahkan pada baris pertama fungsi error_reporting(), menjadi : <br /> <br /> Akan memberikan keluaran script sebagai berikut : Notice: Undefined variable: nlai in D:\otak\code\php\mpnet105_5_002.php on line 3 $nilai bukan 45<br /> <br /> 5.2.1 Penanganan Error Setelah mengetahui tipe atau level error pada PHP, selanjutnya adalah menentukan penanganan terhadap error yang muncul. PHP menyediakan 4 pilihan untuk menangani error : Menampilkan pesan error<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 75<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Pesan error sangat berguna untuk ditampilkan ketika masih dalam pembangungan program. Pesan error akan ditampilkan pada standar output, seperti console atau halaman web. Seperti telah dibahas sebelumnya, untuk menampilkan pesan error directive display_errors di php.ini harus di beri nilai On. Ketika production pesan error lebih baik tidak ditampilkan dalam bentuk default seperti ketika program sedang dibangun, tetapi ada penangan error sendiri yang akan mentrigger pesan yang lebih dimengerti oleh end user. Untuk penanganan error seperti ini dapat dengan menggunakan fungsi trigger_error() yang akan dibahas pada bagian selanjutnya. Selain itu teknik yang sering dilakukan adalah dengan mengembalikan kode error 500 pada halaman web dengan mengirimkan script berikut : header(“HTTP/1.0 500 Internal Server Error”);<br /> <br /> Lalu konfigurasi di IIS Server untuk error 500 pada folder yang bersangkutan harus diubah misalnya di redirect ke halaman custom_error.php, seperti pada contoh gambar di bawah :<br /> <br /> Gambar 5-1. Konfigurasi Internal Server Error 500 diubah ke URL : /otak/php/custom_error.php<br /> <br /> Menggunakan fungsi error_log() Fungsi error_log() pada PHP dapat mengirimkan pesan error ke tujuan yang telah ditentukan di php.ini untk directive error_log , misal error_log = C:\php\log\log.txt akan menuliskan pesan error pada file log.txt atau error_log = syslog akan menuliskan pesan error pada event log pada Windows. Contoh script sederhana penggunaan error_log yang menggunakan error_log default yang ditulis di php.ini adalah sebagai berikut : <br /> <br /> Menurut Schlossnagle menulis log ke syslog tidak dianjurkan untuk server log yang sama dengan web server, karena proses log akan sangat lambat.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 76<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Developer juga dapat menentukan target pengiriman log selain yang telah ditentukan pada php.ini, target lain dapat berupa email, server debugger, dan file. Masing-masing dengan parameter message_type berbeda untuk sintaks : int error_log ( string message [, int message_type [, string destination [, string extra_headers]]])<br /> <br /> Yaitu 1 untuk email, 2 untuk server debugger, dan 3 untuk file. Untuk server debugger hanya dapat dilakukan bila pilihan remote debugging di enable, untuk lebih jelas dapat melihat PHP Manual. Contoh penggunaan script pada PHP adalah sebagai berikut : <br /> <br /> Pada contoh diatas dilakukan pengiriman pesan error ke error_log yang telah didefinisikan di php.ini, yang kedua ke email <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd9f8f9c9e95909c93bd94899ecdc9d3989e959c8f8f948ed39e9290">[email protected]</a> lalu yang terakhir ditulis ke file C:/php/log/log,txt. Untuk pengiriman email terlebih dahulu harus dilakukan konfigurasi SMTP server di php.ini. Mengabaikan pesan error PHP menyediakan operator untuk mengabaikan pesan error, yaitu @. Apabila terdapat kesalahan atau error setelah operator ini maka tidak akan ditampilkan pesan error nya. Apabila directive track_errors pada php.ini diberi nilai On maka pesan error terakhir tersimpan pada variable $php_errormsg. Contoh penggunaan operator @ adalah sebagai berikut : <br /> <br /> Script diatas tidak akan menampilkan error. Apabila variabale $php_errormsg dicetak, hasilnya adalah : Undefined variabale: cache<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 77<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Menangani error dengan trigger_error Seperti telah disinggung diatas, developer dapat membuat pesan error sendiri dan menentukan tipe error tersebut termasuk dalam error (E_USER_ERROR), warning (E_USER_WARNING), atau notice (E_USER_NOTICE). Pesan error ini dibuat menggunakan fungsi trigger_error(). Berikut ini contoh penggunaan fungsi trigger_error() untuk melakukan validasi password : <br /> tidak<br /> <br /> boleh<br /> <br /> hanya<br /> <br /> echo "\r\n-- validasi 12345 -- \r\n"; validatePassword(12345); echo "\r\n-- validasi password kosong -- \r\n"; validatePassword("<br /> <br /> ");<br /> <br /> echo "\r\n-- validasi Gh3 --\r\n"; validatePassword("Gh3"); ?><br /> <br /> Maka output dari script adalah sebagai berikut : -- validasi 12345 -Warning: Password tidak boleh hanya angka in d:\kerjaan\otak\code\php\mpnet105_5_008.php<br /> <br /> on<br /> <br /> line<br /> <br /> 20<br /> <br /> -- validasi password kosong -Fatal error: Password kosong in d:\kerjaan\otak\code\php\mpnet105_5_008.php<br /> <br /> on<br /> <br /> line<br /> <br /> 8<br /> <br /> Script diatas tidak pernah mengeksekusi validasi Gh3.<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 78<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Membuat fungsi penangan error sendiri User juga dapat membuat fungsi untuk menangani error yang berfungsi seperti penanganan error PHP. Misalkan untuk menangani error pada contoh error di point 4 diatas dibuat fungsi penanganan error “PenangananError”. Format fungsi penanganan error ini adalah : handler (int errno, string errstr errline [, array errcontext ]]])<br /> <br /> [,<br /> <br /> string<br /> <br /> errfile<br /> <br /> [,<br /> <br /> int<br /> <br /> Contoh script pada point ke 4 menjadi : FATAL [$errno] $errstr<br />\n"; echo " Fatal error di baris $errline file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Dibatalkan...<br />\n"; exit(1); break; case ERROR: echo "<b>ERROR</b> [$errno] $errstr<br />\n"; break; case WARNING: echo "<b>WARNING</b> [$errno] $errstr<br />\n"; break; default: echo "Tipe error tidak diketahui: [$errno] $errstr<br />\n"; break; } } // fungsi untuk memeriksa integritas password function validatePassword($pass) { // jika password kosong maka akan terjadi fatal error if(trim($pass) == "") { trigger_error("Password kosong", E_USER_ERROR); } // terlalu pendek if(strlen($pass) < 5) { trigger_error("Password terlalu pendek", E_USER_WARNING); } // password berisi angka semua if(is_numeric($pass)) {<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 79<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> trigger_error("Password angka",E_USER_WARNING); } }<br /> <br /> tidak<br /> <br /> boleh<br /> <br /> hanya<br /> <br /> // set penangan error ke PenanganError $old_error_handler = set_error_handler("PenangananError"); echo "\r\n-- validasi 12345 -- \r\n"; validatePassword(12345); echo "\r\n-- validasi password kosong -- \r\n"; validatePassword("<br /> <br /> ");<br /> <br /> echo "\r\n-- validasi Gh3 --\r\n"; validatePassword("Gh3"); ?><br /> <br /> Pada script diatas terlebih dahulu didefinisikan konstanta untuk setiap tipe error yang akan dimasukkan ke dalam fungsi penanganan error yang baru (PenangananError), lalu tuliskan fungsi PenangananError, dan sebelum menjalankan script yang akan melakukan validasi definiskan terlebih dahulu bahwa penanganan error akan dilakukan oleh fungsi yang baru dibuat dengan perintah script : $old_error_handler = set_error_handler("PenangananError");<br /> <br /> .<br /> <br /> Sehingga output dari script ini adalah : -- validasi 12345 -<b>ERROR</b> [512] Password tidak boleh hanya angka<br /> -- validasi password kosong -<b>FATAL</b> [256] Password kosong<br /> Fatal error di baris 40 file d:\kerjaan\otak\code\php\mpnet105_5_009.php, PHP 5.0.0 (WINNT)<br /> Dibatalkan...<br /><br /> <br /> 5.2.2 Penanganan Error Pada PHP 5 Seperti telah disinggung diawal bahwa PHP 5 juga menyediakan penanganan error menggunakan penanganan exception selain menggunakan penanganan error yang telah dibahas sebelumnya. Penanganan error ini memungkinkan penanganan yang bersih dan menyeluruh tanpa harus menggunakan nested if. Tidak seperti bahasa program lainnya, PHP hanya dapat menggunakan penanganan exception pada object, tidak bisa membangkitkan exception dari fungsi prosedural. Lebih jauh walaupun penanganan exception dapat dilakukan pada object tetapi dibatasi untuk error pada konstruktor dan masalah logika yang serius pada beberapa ekstensi. Tingkat keseriusan berbeda untuk setiap ekstensi. Ada ekstensi yang hanya<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 80<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> membangkitkan exception pada konstruktor saja, tetapi ada juga yang tidak hanya pada konstruktor, seperti halnya DOM akan membangkitkan error untuk setiap keadaan yang dapat terjadi error, misalnya keadaan yang tidak mungkin untuk dilakukan suatu operasi disebabkan masalah logika, data yang hilang atau karena implementasi tidak stabil. Contoh terjadinya exception pada konstruktor seperti terjadi di script berikut : <br /> <br /> Akan memberikan output, atau akan membangkitkan pesan error berikut ini : exception 'SQLiteException' with message 'SQLiteDatabase::__construct() expects at least 1 parameter, 0 given' in D:\otak\code\php\mpnet105_5_010.php:5 Stack trace: #0 D:\otak\code\php\mpnet105_5_010.php(5): SQLiteDatabase->__construct() #1 {main} Terjadi karena konstruktor object SQLiteDatabase mengharapkan parameter nama database yang harus dikirimkan. PHP memiliki kelas untuk menangani exception yaitu kelas Exception. Berikut ini adalah definisi dari kelas built-in PHP untuk exception : class Exception { protected $message = 'Unknown exception'; //exception message protected $code = 0; // user defined exception code protected $file; // source filename of exception protected $line; // source line of exception function __construct($message = null, $code = 0); final function getMessage(); // message of exception final function getCode(); // code of exception final function getFile(); // source filename final function getTrace(); // an array of the backtrace() final function getTraceAsString(); // formated string of trace /* Overrideable */ function __toString(); // formated string for display }<br /> <br /> Contoh penggunaan method yang ada di dalam kelas built-in diatas, bisa dilihat pada kode program berikut : <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 81<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> try { $dom = new DOMDocument($version); $ab = new DOMElement($element); $ab = $dom->appendChild($ab); } catch (Exception $e) { error_log('Error pada file ' . $e->getFile( ) . ' baris ' . $e->getLine( ) . ".\n" . 'Pesan error: "' . $e>getMessage( ) . '" dengan kode : ' . $e->getCode( ) . '.'); } ?><br /> <br /> Maka dapat dilihat pesan kesalahan yang detail yang dibangkitkan oleh kelas Exception : Error pada file D:\otak\code\php\mpnet105_5_011.php baris 8. Pesan error: "Invalid Character Error" dengan kode : 5. Selain menggunakan exception yang sudah disediakan oleh object, user juga dapat membangkitkan exception dengan membuat instance dari kelas Exception. Secara umum ada 3 hal kapan user harus membangkitkan exception : Error Pemrograman. Misalnya mengirimkan argumen tidak sesuai dengan jumlah argumen yang diharapkan oleh method. Error untuk Pengguna (Client). Misalnya ketika client melakukan registrasi dengan mendaftarkan username dan password, ternyata username telah digunakan oleh client lain. Masalah Resource. Misalnya putusnya komunikasi karena sesaknya traffic pada jaringan. Secara umum untuk membangkitkan exception oleh user secara manual menggunakan perintah throw(). Contoh berikut memperlihatkan penggunaan throw untuk membangkitkan exception pada kelas yang dibuat oleh user : <br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 82<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Contoh script diatas adalah menangani error yang dapat terjadi untuk proses matematika pembagian. Ada 3 kondisi pada method pembagian di kelas Math akan membangkitkan exception dengan membuat instance baru dari kelas Exception. Output dari script dengan mengirimkan paramater 1 dan 0 pada method pembagian adalah : exception 'Exception' with message 'Pembagian dengan D:\otak\code\php\mpnet105_5_012.php:7 Stack trace: #0 D:\otak\code\php\mpnet105_5_012.php(7): Math::pembagian() #1 D:\otak\code\php\mpnet105_5_012.php(13): Math::pembagian(1, 0) #2 {main}<br /> <br /> nol'<br /> <br /> in<br /> <br /> User juga dapat membuat kelas baru yang diturunkan dari kelas Exception untuk menangani exception yang terjadi. Tujuannya adalah untuk membuat kelas yang lebih spesifik sesuai dengan exception yang terjadi. Contoh script diatas setelah ditambahkan kelas baru yang diturunkan dari kelas Exception akan menjadi : <br /> throw(new throw(new throw(new<br /> <br /> try { print Math::pembagian(1, 0); } catch(WrongParameterTypeException $e) { print $e; } catch(DivisionByZeroException $e) { print $e; } ?><br /> <br /> Pada contoh script diatas , terlihat juga penanganan error dengan menangkap beberapa exception (multiple exception), dapat dilihat pada perintah catch masing-masing untuk kelas WrongParameterException dan kelas DivisionByZeroException. Output dari script diatas adalah : exception 'DivisionByZeroException' with message 'Pembagian dengan nol' in D:\otak\code\php\mpnet105_5_013.php:10 Stack trace: #0 D:\otak\code\php\mpnet105_5_013.php(10): Math::pembagian()<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 83<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> #1 D:\otak\code\php\mpnet105_5_013.php(16): Math::pembagian(1, 0) #2 {main} Selain cara diatas, user dapat melakukan kendali atas error yang terjadi dengan membuat fungsi untuk menangani exception dan mendaftarkan fungsi tersebut menggunakan set_exception_handler(). Misal script diatas akan dibuat fungsi PenangananException, sehingga script menjadi seperti berikut ini : <br /> throw(new throw(new throw(new<br /> <br /> function PenangananException($e) { error_log('Error pada file ' . $e->getFile( ) . ' di baris ' . $e->getLine( >getMessage( ) .<br /> <br /> )<br /> <br /> .<br /> <br /> ".\n"<br /> <br /> .<br /> <br /> 'Pesan<br /> <br /> error:<br /> <br /> "'<br /> <br /> .<br /> <br /> $e-<br /> <br /> '" dan kode error: ' . $e->getCode( ) . '.'); } set_exception_handler('PenangananException'); print Math::pembagian(1, 0); ?><br /> <br /> Output yang dihasilkan : Error pada file D:\otak\code\php\mpnet105_5_014.php di baris 10. Pesan error: "Pembagian dengan nol" dan kode error: 0.<br /> <br /> 5.3 Penanganan Error Pada C# Seperti telah disinggung diawal, C# menangani error dan kondisi yang tidak normal menggunakan exception (object yang membungkus informasi tentang suatu kejadian yang tidak normal pada program). Penanganan exception dilakukan dengan membungkus kode program yang dapat menimbulkan kesalahan pada blok try lalu<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 84<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> menangkap kesalahan yang timbul dengan catch dan di dalam blok catch ini bisa dituliskan apa yang harus dilakukan program bila timbul error. Bentuk umum penanganan exception pada C# adalah sebagai berikut : try { // statements } catch (Exception e) { // apa yang dilakukan bila terjadi error } finally { // terakhir lakukan ini }<br /> <br /> Kode program yang mungkin akan menimbulkan kesalahan dibungkus di dalam blok try, lalu bila terjadi kesalahan maka akan masuk ke blok catch dan melakukan apa yang ada di dalam blok ini, untuk selanjutnya masuk ke blok finally. Apabila tidak terjadi errror maka setelah mengeksekusi kode terakhir di dalam blok try akan langsung masuk ke blok finally. Exception sendiri pada C# berasal dari class Exception, yang merupakan bagian dari Common Language Runtime (CLR). Pada level yang paling atas Exception memiliki dua turunan yaitu SystemException dan ApplicationException. Masing-masing dihasilkan oleh CLR dan .NET Framework untuk SystemException , dan untuk ApplicationException didefinisikan pada aplikasi. (Aryaputra, P. 2004).<br /> <br /> 5.3.1 Try Statement Tujuan dari try statement adalah untuk mempermudah eksekusi program pada keadaan error. Try statement akan melakukan dua hal : Membiarkan bagian catch menangkap exception yang dilempar dari blok try Memastikan eksekusi tidak akan keluar dari blok try tanpa mengeksekusi blok finally Blok try harus diikuti blok catch atau blok finally atau keduanya. Bentuk dari blok try akan terlihat seperti ini : try { ... // exception } catch (ExceptionA ex) { ... // reaksi dari } catch (ExceptionB ex) { ... // reaksi dari } finally { ... // bagian yang ... // error }<br /> <br /> dapat timbul di blok ini tipe exception ExceptionA tipe exception ExceptionB selalu di eksekusi ada atau tidak ada<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 85<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 5.3.2 Melempar Exception Kemungkinan keadaan yang dapat menimbulkan kesalahan apabila suatu kode dieksekusi dapat ditangani dengan membangkitkan exception. Untuk membangkitkan dan melempar exception ini developer dapat menggunakan perintah throw. Apabila perintah throw berada di dalam blok try dan terdapat blok catch sesudahnya, maka exception akan ditangani oleh blok catch. Tetapi apabila tidak ada blok catch maka akan terjadi error pada program yang menyebabkan program berhenti. Contoh berikut memperlihatkan pembangkitan exception tidak di dalam blok try dan tidak ditangkap oleh catch : namespace cs { public class mpnet105_5_002 { public mpnet105_5_002() { } public void ValidatePassword(string pass) { // jika password kosong maka akan membangkitkan exception<br /> <br /> if(pass.Trim() == "") { throw new System.Exception("Password<br /> <br /> kosong");<br /> <br /> } // terlalu pendek if(pass.Length < 5) { throw new<br /> <br /> System.Exception("Password<br /> <br /> terlalu pendek"); } } [STAThread] static void Main(string[] args) { mpnet105_5_002 mpnet1055002 = new mpnet105_5_002(); Console.WriteLine("-- validasi password kosong -- "); mpnet1055002.ValidatePassword(" "); Console.WriteLine("-- validasi Gh3 -- "); mpnet1055002.ValidatePassword("Gh3"); } } }<br /> <br /> Program diatas akan melakukan validasi pertama yaitu memeriksa apakah password kosong, apabila kosong maka akan melempar exception dengan menginstantiasi object Exception, karena tidak berada di dalam blok try, maka program akan berhenti. Berikut adalah output dari program : -- validasi password kosong --<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 86<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Unhandled Exception: System.Exception: Password kosong at cs.mpnet105_5_002.ValidatePassword(String pass) in d:\otak\code\cs\cs\mpne t105_5_002.cs:line 16 at cs.mpnet105_5_002.Main(String[] args) in d:\otak\code\cs\cs\mpnet105_5_002 .cs:line 32<br /> <br /> 5.3.3 Pernyataan Catch Penanganan error pada C# dilakukan pada blok ini (catch). Exception yang dibangkitkan atau dikirimkan oleh perintah throw pada blok try akan ditangkap oleh catch untuk selanjutnya di dalam blok catch ini dilakukan penanganan error. Contoh berikut adalah penggunaan catch untuk script program sebelumnya (mpnet105_5_002) : namespace cs { public class mpnet105_5_003 { public mpnet105_5_003() { } public void ValidatePassword(string pass) { … … } [STAThread] static void Main(string[] args) { mpnet105_5_003 mpnet1055003 = new mpnet105_5_003(); try { Console.WriteLine("-- validasi password kosong -- "); mpnet1055003.ValidatePassword(" "); Console.WriteLine("-- validasi Gh3 -- "); mpnet1055003.ValidatePassword("Gh3"); } catch { Console.WriteLine("Penanganan error disini"); } } } }<br /> <br /> Bedanya dengan script sebelumnya adalah pemanggilan validasi password dilakukan dalam blok try dan menangkap exception yang dibangkitkan dengan catch. Output dari program ini adalah : -- validasi password kosong --<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 87<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Penanganan error disini Pada contoh diatas statemen catch yang digunakan tidak spesifikasi untuk jenis exception tertentu, sehingga catch akan menangkap setiap exception yang terjadi. Pada blok catch ini developer dapat melakukan suatu proses untuk menangani error atau melemparkan lagi error yang terjadi. Untuk melemparkan error yang terjadi biasanya dilakukan pada object yang diinstantiasi di dalam object lainnya.<br /> <br /> 5.3.3.1 Menentukan Catch Untuk Menangkap Exception Tertentu Ketika menggunakan perintah catch, seorang developer seharusnya mengetahui kemungkinan error yang akan terjadi sehingga dapat dengan tepat melakukan proses penanganan. Kemungkinan error yang terjadi berimplikasi pada penggunaan object exception yang akan ditangkap secara lebih tepat oleh developer. Misalnya kejadian pembagian dengan penyebut nol maka developer dapat menggunakan object DivideByZeroException. Berikut adalah contoh script yang menggunakan object DivideByZeroException : namespace cs { public class mpnet105_5_004 { public mpnet105_5_004() { } public float pembagian(int divisor,int dividend) { try { return (divisor / dividend); } catch(DivideByZeroException dbze) { throw dbze; } } [STAThread] static void Main(string[] args) { mpnet105_5_004 mpnet1055004 = new mpnet105_5_004(); try { float hasil = mpnet1055004.pembagian(1, 0); Console.WriteLine(hasil.ToString()); } catch(Exception e) { Console.WriteLine(e.Message); } } } }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 88<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Pada script diatas sudah digunakan juga cara bagaimana melempar exception ke object pemanggil, script throw dbze; melempar kembali exception yang terjadi pada fungsi pembagian, lalu ditangkap oleh script catch(Exception e) untuk selanjutnya dicetak pesan dari exception dengan Console.WriteLine(e.Message);. Output dari script diatas adalah : Attempted to divide by zero. Untuk menggunakan object exception yang sesuai, developer harus mengetahui nama dari object exception tersebut. Berikut ini adalah beberapa object exception yang umum dipakai :<br /> <br /> Table 5-1. Tabel Exception yang Umum Dipakai AccessException<br /> <br /> Error ketika mengakses field atau method dari suatu class<br /> <br /> ArgumentException<br /> <br /> Argumen untuk method tidak valid<br /> <br /> ArgumentNullException<br /> <br /> Argumen null<br /> <br /> ArithmeticException<br /> <br /> Overflow atau underflow<br /> <br /> DivideByZeroException<br /> <br /> Pembagian dengan nol<br /> <br /> IndexOutOfRangeException<br /> <br /> Indeks array melebihi batas maksimum<br /> <br /> FileNotFoundException<br /> <br /> Tidak menemukan file<br /> <br /> EndOfStreamException<br /> <br /> Akses melampaui akhir dari stream (contohnya file)<br /> <br /> DirectoryNotFoundException<br /> <br /> Direktori tidak ditemukan<br /> <br /> NullReferenceException<br /> <br /> Object belum diinisialisasi<br /> <br /> 5.3.3.2 Penggunaan Beberapa Blok Catch Beberapa exception berbeda yang mungkin terjadi dalam blok try juga dapat di tangkap dengan beberapa blok catch sesuai dengan jenis exception yang cocok. Ketika telah masuk ke dalam salah satu blok catch yang sesuai maka tidak akan masuk ke blok catch lainnya. Contoh berikut adalah pemakaian beberapa blok catch : namespace cs { public class mpnet105_5_005 { public mpnet105_5_005() { } [STAThread] static void Main(string[] args) {<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 89<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> mpnet105_5_005();<br /> <br /> mpnet105_5_005 try {<br /> <br /> mpnet1055005<br /> <br /> =<br /> <br /> new<br /> <br /> int divisor = int.Parse(args[0]); int dividend = int.Parse(args[1]); float hasil = divisor / dividend; Console.WriteLine(hasil.ToString());<br /> <br /> } catch(IndexOutOfRangeException) { Console.WriteLine("Program harus ada argumen 1 dan 2"); } catch(DivideByZeroException) { Console.WriteLine("Pembagian dengan 0"); } catch(Exception e) { Console.WriteLine(e.Message); } } } }<br /> <br /> Script diatas menerima argumen yang dikirimkan user ketika menjalankan program yaitu argumen 1 dan 2. Misal setelah dicompile program memiliki nama cs.exe dan ingin dilakukan pembagian antara argumen 1 dengan argumen 2, masing-masing dengan nilai integer. Apabila kita tidak mengirimkan argumen 1 dan argumen 2 maka akan ditangkap exception IndexOutOfRangeException di blok catch, untuk selanjutnya melakukan eksekusi kode di dalam blok tersebut. Hasilnya dengan menjalankan program tanpa argumen atau dengan hanya satu argumen adalah sebagai berikut : D:\otak\code\cs\cs\bin\Debug>cs 1 Program harus ada argumen 1 dan 2 Penjelasan untuk hasil diatas adalah menjalankan program hanya dengan mengirimkan argumen pertama saja yang bernilai integer 1. Apabila dikirimkan parameter dengan argumen 1 bernilai 5 dan argumen 2 bernilai 0, maka akan menghasilkan sebagai berikut : D:\otak\code\cs\cs\bin\Debug>cs 5 0 Pembagian dengan 0 Artinya terjadi exception DivideByZeroException. Apabila bukan kedua exception diatas maka akan ditangkap oleh Exception.<br /> <br /> 5.3.4 Pernyataan Finally Apabila terjadi exception pada blok try, sementara masih ada beberapa yang harus dilakukan baik setelah penanganan exception pada blok catch, ataupun langsung<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 90<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> setelah exception terjadi tanpa melalui blok catch, seperti halnya menutup file yang sedang dibuka. Maka untuk menutup file dapat dilakukan pada blok finally. Blok finally akan selalu dieksekusi setelah keluar dari blok try. Dieksekusi dalam 3 periode : Langsung setelah eksekusi pada blok try telah selesai Langsung setelah ada perintah keluar dari blok try yang tidak normal, misalnya : goto, return. Langsung setelah keluar dari blok catch Kode pada blok finally akan selalu dieksekusi sebelum keluar dari fungsi : Apabila exception ditangani, makan akan masuk ke blok catch, lalu akan masuk ke blok finally sebelum keluar dari program. Apabila exception tidak ditangani, maka akan masuk ke finally, dan kode berikutnya setelah keluar dari finally tidak akan dieksekusi. Apabila tidak terjadi exception maka, finally akan dieksekusi setelah pernyataan nonreturn terakhir dari fungsi. Kegunaan utama dari finally adalah untuk mengurangi duplikasi kode karena perbedaan akhir kode program yang akan dieksekusi setelah keadaan dengan exception atau tanpa exception yang mengeksekusi kode yang sama. Contoh berikut memperlihatkan penggunaan finally pada kode program yang membaca file text yang berisi argumen untuk proses pembagian. Misalnya file text adalah args.txt dengan isi adalah sebagai berikut : 5 0 Lalu kode program adalah sebagai berikut : namespace cs { public class mpnet105_5_006 { public mpnet105_5_006() { } [STAThread] static void Main(string[] args) { mpnet105_5_006 mpnet1055006 = new mpnet105_5_006(); StreamReader freader = new StreamReader("args.txt"); try { string textline; string[] values = new string[2]; int i=0; while (( textline = freader.ReadLine() ) != null ) { values[i++] = textline; }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 91<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> int divisor = int.Parse(values[0]); int dividend = int.Parse(values[1]); float hasil = divisor / dividend; Console.WriteLine(hasil.ToString());<br /> <br /> } catch(IndexOutOfRangeException) { Console.WriteLine("Program harus ada argumen 1 dan 2"); } catch(DivideByZeroException) { Console.WriteLine("Pembagian dengan 0"); } catch(Exception e) { Console.WriteLine(e.Message); } finally { freader.Close(); Console.WriteLine("File argumen ditutup"); } } } }<br /> <br /> Terlihat dari kode diatas, setelah terjadinya exception yang ditangani oleh blok catch, maka selanjutnya file yang telah dibuka akan ditutup pada blok finally. Output dari contoh kode diatas adalah : Pembagian dengan 0 File argumen ditutup<br /> <br /> 5.3.5 Lebih Jauh Tentang Class Exception Seperti disinggung diawal, exception pada aplikasi C# di bangkitkan dari class Exception yang merupakan bagian dari CLR. Tetapi kita belum mengetahui lebih jauh tentang class Exception ini. System.Exception menyediakan beberapa method dan properti yang sangat berguna. Properti Message menyediakan informasi tentang exception yang terjadi, seperti mengapa terjadi exception. Properti ini memiliki tipe read-only, tetapi kita bisa memberikan nilai untuk Message ini dengan mengirimkan sebagai parameter pada constructor class exception. Selain Message ada beberapa properti yang berguna , dapat dilihat pada tabel 5-2 :<br /> <br /> Table 5-2. Properti Yang Ada di Class Exception HelpLink<br /> <br /> Link ke file help yang menyediakan informasi tentang exception yang terjadi<br /> <br /> Source<br /> <br /> Nama aplikasi atau object yang menyebabkan exception<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 92<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> StackTrace<br /> <br /> Daftar method yang dipanggil pada stack<br /> <br /> TargetSite<br /> <br /> Nama method yang melempar exception<br /> <br /> Berikut contoh penggunaan properti dari class exception : namespace cs { public class mpnet105_5_007 { public mpnet105_5_007() { } public void ValidatePassword(string pass) { // jika password kosong maka akan membangkitkan exception<br /> <br /> if(pass.Trim() == "") { ArgumentException ArgumentException("Password kosong"); ae.HelpLink "http://blog.netindonesia.net/basir"; throw ae; } // terlalu pendek if(pass.Length < 5) { throw new<br /> <br /> ae<br /> <br /> =<br /> <br /> new =<br /> <br /> ArgumentException("Password<br /> <br /> terlalu pendek"); } } [STAThread] static void Main(string[] args) { mpnet105_5_007 mpnet1055007 = new mpnet105_5_007(); try { Console.WriteLine("-- validasi password kosong -- "); mpnet1055007.ValidatePassword(" "); Console.WriteLine("-- validasi Gh3 -- "); mpnet1055007.ValidatePassword("Gh3"); } catch(ArgumentException ae) { Console.WriteLine( "\nArgumentException! Msg: {0}", ae.Message); Console.WriteLine( "\nHelpLink: {0}", ae.HelpLink); Console.WriteLine( "\nIni stack trace: {0}\n", ae.StackTrace); } } }<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 93<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> }<br /> <br /> Pada script diatas , apabila password kosong maka akan membangkitkan exception dari class ArgumentException, outputnya adalah sebagai berikut : -- validasi password kosong -ArgumentException! Msg: Password kosong HelpLink: http://blog.netindonesia.net/basir Ini stack trace: at cs.mpnet105_5_007.ValidatePassword(String pass) in d:\ota k\code\cs\cs\mpnet105_5_007.cs:line 18 at cs.mpnet105_5_007.Main(String[] args) in d:\otak\code\cs\cs\mpnet105_5_007 .cs:line 36<br /> <br /> 5.3.6 Custom Exception Selain menggunakan class exception yang telah disediakan oleh CLR, developer juga dapat membuat exception sesuai dengan kebutuhan tertentu. Class exception ini akan diturunkan dari class System.ApplicationException yang merupakan turunan dari System.Exception. Penggunaan custom exception seperti kode berikut ini : namespace cs { public class PasswordKosongException : System.ApplicationException { public PasswordKosongException(string message): base(message) { } public PasswordKosongException(string message, Exception inner) : base(message, inner) { } } public class mpnet105_5_008 { public mpnet105_5_008() { }<br /> <br /> exception<br /> <br /> public void ValidatePassword(string pass) { // jika password kosong maka akan membangkitkan<br /> <br /> if(pass.Trim() == "") { PasswordKosongException PasswordKosongException("Password kosong"); pke.HelpLink "http://blog.netindonesia.net/basir";<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> pke<br /> <br /> =<br /> <br /> new =<br /> <br /> 94<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> throw pke;<br /> <br /> } }<br /> <br /> [STAThread] static void Main(string[] args) { mpnet105_5_008 mpnet1055008 = new mpnet105_5_008(); try { Console.WriteLine("-- validasi password kosong -- "); mpnet1055008.ValidatePassword(" "); Console.WriteLine("-- validasi Gh3 -- "); mpnet1055008.ValidatePassword("Gh3"); } catch(PasswordKosongException pke) { Console.WriteLine( "\nPasswordKosongException! Msg: {0}", pke.Message); Console.WriteLine( "\nHelpLink: {0}", pke.HelpLink); Console.WriteLine( "\nIni stack trace: {0}\n", pke.StackTrace); } } } }<br /> <br /> Ketika<br /> <br /> password<br /> <br /> kosong<br /> <br /> maka<br /> <br /> akan<br /> <br /> dibangkitkan<br /> <br /> custom<br /> <br /> exception<br /> <br /> yaitu<br /> <br /> PasswordKosongException. Output dari kode diatas adalah :<br /> <br /> -- validasi password kosong -PasswordKosongException! Msg: Password kosong HelpLink: http://blog.netindonesia.net/basir Ini stack trace: at cs.mpnet105_5_008.ValidatePassword(String pass) in d:\ota k\code\cs\cs\mpnet105_5_008.cs:line 31 at cs.mpnet105_5_008.Main(String[] args) in d:\otak\code\cs\cs\mpnet105_5_008 .cs:line 43<br /> <br /> Reference : •<br /> <br /> PHP Error Handling , George Schlossnagle<br /> <br /> •<br /> <br /> PHP Basics: Writing Simple PHP Applications, Ewald Geschwinde and HansJuergen Schoenig<br /> <br /> •<br /> <br /> Upgrading to PHP 5 , Adam Trachtenberg, O’ Reilly, July 2004<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 95<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> •<br /> <br /> PHP Manual , http://www.php.net<br /> <br /> •<br /> <br /> Error Handling in PHP, John Coggeshall, http://www.zend.com/zend/spotlight/error.php<br /> <br /> •<br /> <br /> SAMS Teach Yourself PHP4 in 24 Hours, Matt Zandstra 2000.<br /> <br /> •<br /> <br /> Error Handling in PHP , (part 2), icarus , Melonfire 2002.<br /> <br /> •<br /> <br /> The Standard PHP Library, Part 1, David Fells, 07-12-2004<br /> <br /> •<br /> <br /> Introduction to Design Patterns in C#, James W. Cooper, IBM T J Watson Research Center , Feb 1 2002<br /> <br /> •<br /> <br /> A Programmer’s Introduction to C#, Eric Gunnerson, Apress, 2000<br /> <br /> •<br /> <br /> C# Bible, Jeff Ferguson dll, Wiley Publishing 2002<br /> <br /> •<br /> <br /> Programming C#, Jesse Liberty, O’Reilly, July 2001<br /> <br /> •<br /> <br /> C# Primer : A Practical Approach, Stanley B. Lippman<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 96<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> 6. Koneksi Data Willy<br /> <br /> 6.1 Koneksi ke Database pada PHP Pada pembahasan koneksi database dengan PHP berikut ini, database yang akan digunakan adalah database MySQL. MySQL adalah perangkat lunak pengolah database yang sangat populer di kalangan pengguna sistem operasi berbasis Unix. Sesuai dengan namanya, bahasa standar yang digunakan oleh MySQL adalah SQL. SQL singkatan dari Structured Query Language, merupakan bahasa standar untuk pengolahan database. Karena pembahasan MySQL akan meluas diluar topik, maka pada bagian ini hanya akan dibahas mengenai koneksi PHP ke MySQL. Untuk melakukan koneksi dengan MySQL, PHP telah menyediakan berbagai macam fungsi untuk keperluan tersebut yang akan dibahas secara mendetail di bawah ini. Mysql_connect() Fungsi ini digunakan untuk membuka koneksi ke MySQL. Sintaksnya sebagai berikut: $conn = mysql_connect(host,user,password) Mysql_select_db() Fungsi ini digunakan untuk memilih database yang akan digunakan. Sintaksnya sebagai berikut: mysql_select_db(namadatabase[,koneksi]) Parameter koneksi boleh tidak dituliskan. Jika tidak dituliskan, maka koneksi yang terakhir akan dianggap sebagai koneksi aktif. Mysql_query() Fungsi ini digunakan untuk mengambil sebuah query dari sebuah database. Sintaksnya sebagai berikut: $qry = mysql_query(perintah_sql[,koneksi])<br /> <br /> Mysql_fetch_array() Fungsi ini digunakan untuk mengambil record dari database dan memasukkannya ke dalam array. Sintaksnya sebagai berikut: $row = mysql_fetch_array($qry)<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 97<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Array yang dihasilkan dapat diakses secara asosiatif, misalnya $row[“negara”], maupun secara numeris, misalnya $row[2]. Jika menggunakan array numeris, indeks array dimulai dari nol. Mysql_fetch_assoc() Fugsi ini hampir sama dengan fungsi mysql_fetch_array(), hanya saja array yang dihasilkan hanya dapat diakses secara asosiatif. Sintaksnya sebagai berikut: $row = mysql_fetch_assoc($qry) Mysql_fetch_row() Fugsi ini hampir sama dengan fungsi mysql_fetch_array(), hanya saja array yang dihasilkan hanya dapat diakses secara numeris. Sintaksnya sebagai berikut: $row = mysql_fetch_row($qry) Mysql_num_fields() Fungsi ini digunakan untuk menghitung jumlah field yang ada pada database. Sintaksnya sebagai berikut: $jml = mysql_num_fields($qry) Variabel $jml akan memiliki nilai sesuai dengan jumlah field yang ada. Mysql_num_rows() Fungsi ini digunakan untuk menghitung jumlah record yang ada pada database. Sintaksnya adalah sebagai berikut: $jml = mysql_num_rows($qry) Variabel $jml akan memiliki nilai sesuai dengan jumlah record yang ada. Mysql_close() Fungsi ini digunakan untuk menutup koneksi yang telah dilakukan. Sintaksnya sebagai berikut: mysql_close([koneksi]) Fungsi ini tidak selalu dibutuhkan, karena biasanya koneksi akan ditutup secara otomatis jika skrip PHP selesai dieksekusi. Fungsi ini juga tidak dapat digunakan untuk menutup koneksi yang persisten. Mysql_pconnect() Fungsi ini memiliki kegunaan yang sama dengan mysql_connect(), hanya saja koneksi yang dibuka bersifat persisten. Sintaksnya adalah sebagai berikut: $pconn = mysql_pconnect(host,user,password) Perbedaan koneksi biasa dengan koneksi persisten terletak pada dua hal yang mendasar, yaitu:<br /> <br /> Project Otak – http://otak.csharpindonesia.net<br /> <br /> 98<br /> <br /> NET105 – Migrasi PHP ke ASP.NET<br /> <br /> Pada saat koneksi, fungsi mysql_pconnect mula-mula akan mencari koneksi persisten yang lain pada host dan user yang sama. Jika ada, maka koneksi akan menggunakan koneksi yang telah ada tersebut daripada menggunakan yang baru. Koneksi tidak akan putus sekalipun skrip PHP telah selesai dieksekusi, bahkan tidak dapat ditutup dengan fungsi mysql_close(). Mysql_create_db() Untuk kasus tertentu dimana Anda tidak dapat mengakses MySQL secara langsung (misalnya pada saat proses web hosting) maka Anda memerlukan fungsi mysql_create_db(). Fungsi ini digunakan untuk membuat database dari skrip PHP. Sintaksnya sebagai berikut: mysql_create_db(namadatabase)<br /> <br /> Pada contoh berikut ini Anda perlu membuat sebuah database MySQL dengan nama “ProjectOtak”, dan membuat sebuah tabel dengan nama “ebook”, struktur tabel “ebook” sebagai berikut: Kolom/Field ebookID Name Version Download<br /> <br /> Tipe Data Varchar (6) Varchar (50) Varchar (3) Int (11)<br /> <br /> Keterangan Kode Buku Judul Buku Versi Jumlah download<br /> <br /> Berikut adalah contoh kode untuk mengambil, menambahkan, menghapus, dan merubah record dalam database menggunakan PHP: <html> <head> <title>Bab 6 - Koneksi ke database dengan PHP </head> <body> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 99<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> mysql_select_db($databaseName,$link); return $link; } //buka koneksi database $link=koneksi(); //Jika ada penambahan record baru if($btnAdd!=""){ $sqlstr = "insert into (ebookID,Name,Version,Download) ('$txtEbookID','$txtName','$txtVersion',$txtDownload)"; if(mysql_query($sqlStr)) { echo("Data eBook baru telah disimpan!"); }else{ echo("Ada kesalahan pada perintah SQL!"); } }<br> <br> ebook values<br> <br> //Jika ada perubahan record if($btnEdit!=""){ $sqlstr = "update ebook set ebookID='$txtEbookID', Name='$txtName', Version='$txtVersion', Download=$txtDownload where ebookID='$id'"; if(mysql_query($sqlStr)) { echo("Data eBook '$txtEbookID' telah disimpan!"); }else{ echo("Ada kesalahan pada perintah SQL!"); } } //Hapus record if($action=="delete"){ $sqlstr = "delete from ebook where ebookID = '$id'"; if(mysql_query($sqlStr)) { echo("Data eBook '$id' telah dihapus!"); }else{ echo("Ada kesalahan pada perintah SQL!"); } } //perintah SQL untuk mengambil data dari table 'eBook' $sqlstr = "select * from eBook"; //eksekusi perintah SQL $hasil = mysql_query($sqlstr) or die ("Ada kesalahan pada perintah SQL!"); ?> <table width="100%" border="1"> <tr bgcolor="#CCCCCC"> <td>Kode eBook</td> <td>Judul</td> <td>Versi</td> <td>Download</td> <td>Edit</td> <td>Delete</td> </tr><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 100<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> ebookID; $name=$row->Name; $version=$row->Version; $download=$row->Download; //tampilkan pada browser echo(" <tr bgcolor="#FFFFFF">"); echo(" <td>$eBookID</td>"); echo(" <td>$name</td>"); echo(" <td>$version</td>"); echo(" <td>$download</td>"); echo(" <td><a target="_blank" href="https://adoc.pub/Bab6.php?action=edit&id=$eBookID" rel="nofollow">Edit</a></td>"); echo(" <td><a target="_blank" href="https://adoc.pub/Bab6.php?action=delete&id=$eBookID" rel="nofollow">Delete</a></td>"); echo(" </tr>"); } ?> </table> <br> ebookID; $name=$row->Name; $version=$row->Version; $download=$row->Download; //Tampilkan record yang akan dirubah dalam form ?> <form name="frmEdit" method="POST" action="Bab6.php"> Kode eBook<br> <input type="text" name="txtEbookID" maxlength="6" value="<? echo($eBookID); ?>"><br><br> Judul<br> <input type="text" name="txtName" maxlength="50" value="<? echo($name); ?>"><br><br> Versi<br> <input type="text" name="txtVersion" maxlength="3" value="<? echo($version); ?>"><br><br> Download<br> <input type="text" name="txtDownload" maxlength="4" value="<? echo($download); ?>"><br><br> <input type="hidden" name="id" value="<? echo($eBookID); ?>"> <input type="submit" name="btnEdit" value="Save"> </form> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 101<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> ?><br> <br> //Tampilkan form kosong untuk penambahan record baru<br> <br> <form name="frmInput" method="POST" action="Bab6.php"> Kode eBook<br> <input type="text" name="txtEbookID" maxlength="6"><br><br> Judul<br> <input type="text" name="txtName" maxlength="50"><br><br> Versi<br> <input type="text" name="txtVersion" maxlength="3"><br><br> Download<br> <input type="text" name="txtDownload" maxlength="4"><br><br> <input type="submit" name="btnAdd" value="Add"> </form> <script data-cfasync="false"></script></body> </html><br> <br> 6.2 Koneksi ke Database pada ASP.NET Visual Studio .NET menyediakan sekumpulan obyek-obyek dan namespace untuk ASP.NET agar dapat melakukan akses terhadap database yang disebut Microsoft ADO.NET. Berikut ini kita akan mempelajari bagaimana melakukan koneksi database, membaca, memodifikasi, dan menghapus record dengan menggunakan ADO.NET. Pada ADO.NET terdapat 4 layer utama untuk pengaksesan data. Keempat layer tersebut adalah: • Data Fisik Data fisik ini dapat berupa database SQL, OLE, Oracle atau sebuah file Extended Markup Language (XML). • Data Provider Terdiri dari object connection dan object yang berisi perintah untuk membuat representasi data dalam memori (adapter). • Data Set Merupakan representasi tabel yang disimpan dalam memori klien untuk digunakan dalam aplikasi. • Data View Melalui Data View Anda dapat melakukan Filter atau Sorting untuk mengatur tampilan data ke user. Arsitektur pada ADO.NET bersifat koneksi terputus, dimana pada saat Anda menbuat data set berarti Anda telah membuat representasi data di dalam memori dan tidak lagi mempengaruhi data asal. Oleh karena itu setelah selesai bekerja dengan data set Anda perlu menyimpan kembali setiap perubahan ke data asal.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 102<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> ADO.NET menyediakan obyek-obyek, properti dan method melalui tiga namespaces yang dijabarkan dalam tabel berikut: Namespace Keterangan Class untuk membuat dan mengakses data set serta obyek-obyek yang termasuk System.Data didalamnya Class untuk mengakses database System.Data.SqlClient Microsoft SQL Server Class untuk mengakses database Oracle (Microsoft .NET Framework version 1.1 System.Data.OracleClient keatas) System.Data.OleDb Class untuk mengakses database lainnya Oleh karena itu, jika dalam aplikasi Anda melakukan koneksi ke database Anda perlu untuk mendeklarasikan namespace tersebut menggunakan perintah using pada bagian paling atas dari kode Anda: using System.Data; // Untuk koneksi dengan database Microsoft SQL Server using System.Data.SqlClient; // Untuk Koneksi dengan database Oracle using System.Data.OracleClient; // Untuk koneksi dengan database lainnya using System.Data.OleDb;<br> <br> Karena berbagai keterbatasan, maka dalam buku ini hanya akan dibahas koneksi dengan database Microsoft SQL Server.<br> <br> 6.2.1 Melakukan Koneksi ke Database ASP.NET memiliki beberapa cara untuk melakukan koneksi ke database. Jika Anda menggunakan Visual Studio .NET, maka Anda dapat menggunakan Server Explorer untuk mendeklarasikan koneksi database, yaitu dengan langkah-langkah sebagai berikut: 1. Pada menu View, pilihlah Server Explorer. Maka jendela Server Explorer akan muncul. 2. Klik kanan pada jendela Server Explorer, klik tombol Connect to Database pada toolbar, maka akan muncul tampilan seperti ini:<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 103<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 3. Pilih jenis koneksi yang ingin Anda gunakan. Pada contoh ini, kita akan menggunakan Microsoft OLE DB Provider for SQL Server untuk membuat koneksi dengan database SQL Server. Jika Anda ingin membuat koneksi dengan database lain, Anda dapat memilih provider yang sesuai dengan database tersebut. Klik tombol Next setelah Anda memilih salah satu provider, maka akan muncul tampilan seperti berikut:<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 104<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 4. Berikutnya pada tab Connection, Anda dapat melakukan seting koneksi dengan memilih nama server, nama database, dan informasi yang diperlukan untuk mengakses database. Isi pada tab connection ini tidak sama untuk setiap provider. Setelah selesai dengan seting koneksi tersebut, klik pada tombol Test Connection untuk memastikan seting yang Anda lakukan telah benar. Klik OK setelah selesai.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 105<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 5. Jika Anda melihat kembali pada jendela Server Explorer, maka seharusnya koneksi yang baru saja Anda buat telah muncul. Klik pada tanda (+) atau (-) untuk melakukan eksplorasi pada koneksi database Anda. 6. Untuk menggunakan koneksi tesebut dalam aplikasi Anda, drag item yang ingin digunakan dari Server Explorer ke dalam project Anda. Sebagai contoh, untuk menggunakan table TchWriter, klik dan drag TechWriter seperti yang terlihat pada gambar di atas ke dalam Web Form Anda. Setelah Anda meletakkan table dalam Web Form, Visual Studio secara otomatis akan membuat object connection dan object adapter dengan seting yang telah dibuat sebelumnya. Untuk jelasnya lihat gambar di bawah ini.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 106<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 6.2.2 Membuat Data Set 1. Klik kanan pada object Adapter, lalu pilih Generate DataSet untuk menampilkan kotak dialog seperti dibawah ini:<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 107<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 2. Pilih New untuk membuat Data Set baru, lalu beri nama untuk Data Set baru Anda, setelah itu klik OK. Visual Studio secara otomatis membuat Data Set baru dan menambahkannya dalam Web Form.<br> <br> 6.2.3 Menampilkan Isi Data Set 1. Tambahkan control yang dapat digunakan untuk menampilkan data, sebagai contoh Anda dapat menggunakan DataGrid. Klik dua kali pada contol DataGrid atau dengan klik dan drag control tersebut dan pindahkan ke dalam Web Form. 2. Klik dua kali pada Web Form lalu tambahkan kode berikut ini: private void Page_Load(object sender, System.EventArgs e) { //Isi DataSet //(anggap nama DataSet adalah dsTechWriter1) sqlDataAdapter1.Fill(dsTechWriter1); //Set Data Source dari DataGrid //ke DataSet dsTechWriter1 DataGrid1.DataSource = dsTechWriter1; //Update DataGrid DataGrid1.DataBind(); }<br> <br> 3. Pilih menu Debug lalu pilih Start untuk menjalankan aplikasi. Gambar di bawah ini adalah contoh data yang ditampilkan dari tabel TechWriter.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 108<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 6.2.4 Menampilkan Data dengan Data View Pada langkah sebelumnya Anda telah mencoba untuk menampilkan isi dari Data Set melalui Data Grid. Langkah-langkah tersebut merupakan cara tercepat untuk menampilkan data. Tetapi, seringkali Anda ingin mengolah data terlebih dahulu sebelum ditampilkan pada Web Form, seperti filter data atau mengurutkan data. Untuk hal tersebut Anda perlu menggunakan control Data View. 1. Tambahkan control DataView ke dalam Web Form. 2. Set properti Table dari DataView pada salah satu nama table dari object DataSet. 3. Tambahkan control DataGrid ke dalam Web Form dan set properti DataSourcenya mengarah pada DataView yang telah dibuat pada langkah pertama. Setelah DataView dibuat pada mode Design, Anda dapat menggunakan DataView untuk melakukan filter dan sort pada data sebelum ditampilkan dalam DataGrid. Sebagai contoh, tambahkan kode berikut ini pada Code Behind untuk melakukan filter dan sort: private void Page_Load(object sender, System.EventArgs e) { //Isi DataSet //(anggap nama DataSet adalah dsTechWriter21) sqlDataAdapter1.Fill(dsTechWriter21); //Tampilkan record dimana field Name = 'Willy'<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 109<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> dataView1.RowFilter = "WriterID > 1"; //Urutkan berdasarkan field 'Name' dataView1.Sort = "Name"; //Update DataGrid DataGrid1.DataBind(); }<br> <br> 6.2.5 Manipulasi Data dengan Data Set DataSet merupakan object paling penting dalam ADO.NET. Segala perubahan, penambahan, dan penghapusan data dalam database umumnya dilakukan melalui DataSet. Karena DataSet merupakan representasi data dalam memori dan memiliki koneksi terputus dengan database, maka Anda perlu menyimpan kembali segala perubahan yang terjadi dalam DataSet ke dalam database. Hal ini dapat dilakukan dengan menggunakan method Update pada object Data Adapter. Untuk mengakses object-object yang terdapat dalam DataSet, Anda dapat menggunakan 2 cara, yaitu typed DataSet dan untyped DataSet. Hal ini merupakan perubahan besar dari ADO, dimana ADO hanya dapat diakses menggunakan cara untyped. Jika Anda membuat DataSet dalam mode Design, maka DataSet tersebut dapat dapat diakses menggunakan typed DataSet. Berikut merupakan contoh kode yang menunjukkan perbedaan antara typed dan untyped DataSet: //Typed DataSet untuk mengakses kolom Name di tabel techWriter dataSet1.TechWriter.Name.Caption = "Tono"; //Untyped DataSet untuk mengakses kolom Name di tabel techWriter dataSet1.Tables["TechWriter"].Columns["Name"].Caption = "Tono";<br> <br> Menggunakan typed data set bukan saja lebih cepat dan lebih mudah dibaca, sekaligus akan mencegah terjadinya kesalahan dalam penyebutan nama object karena Visual Studio akan mengecek tipe data, object, dan referensi yang tidak dikenal.<br> <br> 6.3 Menambah, Merubah, dan Menghapus Data Anda dapat menggunakan object Rows untuk menambah, merubah, atau menghapus data didalam object DataTable yang terdapat dalam DataSet. Berikut adalah contoh kode untuk menambahkan record baru ke dalam DataSet: private void Button1_Click(object sender, System.EventArgs e) { //Mendeklarasikan object row baru untuk tabel TechWriter dsTechWriter2.TechWriterRow newRow = dsTechWriter21.TechWriter.NewTechWriterRow(); //Memasukkan data record baru newRow.Name = "Pauline"; newRow.Birth = "2/13/1980"; newRow.Phone = "5301236"; newRow.Mobile = "0856321654"; newRow.Email = "<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="037362766f6a6d66437a626b6c6c2d606c6e">[email protected]</a>"; //Menambahkan record baru ke dalam data set dsTechWriter21.TechWriter.AddTechWriterRow(newRow); }<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 110<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Untuk merubah sebuah record dalam DataSet, Anda dapat memilih record yang akan diubah dengan method FindBy, kemudian melakukan perubahan yang diperlukan pada record tersebut. Berikut adalah contoh kode untuk merubah record: private void Button2_Click(object sender, System.EventArgs e) { //Mendeklarasikan object row untuk DataSet TechWriter dsTechWriter2.TechWriterRow rowUbah; //Cari record yang ingin diubah rowUbah = dsTechWriter21.TechWriter.FindByWriterID(4); //Ubah record jika ditemukan if(rowUbah!=null)rowUbah.Name = "Paula"; //Update DataGrid DataGrid1.DataBind(); }<br> <br> Untuk menghapus sebuah record dalam DataSet, Anda dapat memilih record yang akan dihapus dengan method FindBy, kemudian menghapus record tersebut dengan method Delete yang terdapat dalam object Row. Berikut adalah contoh untuk menghapus record: private void Button3_Click(object sender, System.EventArgs e) { //Mendeklarasikan object row untuk DataSet TechWriter dsTechWriter2.TechWriterRow rowHapus; //Cari record terakhir rowHapus = dsTechWriter21.TechWriter.FindByWriterID(4); //Hapus record jika ditemukan if(rowHapus!=null)rowHapus.Delete(); //Update DataGrid DataGrid1.DataBind(); }<br> <br> Untuk menyimpan segala perubahan DataSet ke dalam database, maka Anda perlu menggunakan method Update pada object DataAdapter. Perubahan data pada contoh di atas harus disimpan setiap kali event control diproses, oleh karenanya perintah update kita letakkan pada event prosedur Page_PreRender, seperti pada contoh kode berikut ini: private void Page_PreRender(object sender, EventArgs e) { //Update database untuk semua perubahan pada dataset sqlDataAdapter1.Update(dsTechWriter21); //Update DataGrid DataGrid1.DataBind(); }<br> <br> Saat melakukan update pada database dari DataSet, sebenarny ADO.NET melakukan langkah-langkah berikut ini: - Memeriksa perubahan yang terjadi pada DataSet dengan melihat properti RowState pada object DataRow. Isi dari properti RowState adalah Added (Record Baru), Deleted (Telah Dihapus), Modified (Telah Diubah), Unchanged (Belum Berubah), atau Detached. - Memanggil perintah InsertCommand, DeleteCommand, dan UpdateCommand untuk melakukan perubahan yang diperlukan pada<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 111<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> -<br> <br> database. Pada tahap ini ADO.NET secara otomatis membuka koneksi dengan database dan menutupnya kembali setelah selesai. Merubah kembali properti RowState dari object DataRow menjadi Unchanged (Belum Berubah).<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 112<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 7. Caching dan Send Email Willy<br> <br> 7.1 Caching pada ASP.NET Caching adalah suatu teknik penyimpanan sementara obyek-obyek yang sering digunakan ke dalam memori. Pada aplikasi web, obyek-obyek ini dapat berupa web form, control, atau data aplikasi. Dengan menggunakan caching maka suatu hasil respon yang diberikan oleh server dapat ditampung sementara dalam memori. Hal ini dapat mempercepat kinerja aplikasi, karena bila ada request yang sama oleh client maka request tersebut tidak perlu diolah kembali oleh server. Mungkin teknik caching ini menjadi isu baru bagi pengembang aplikasi web yang biasa menggunakan PHP, karena memang sampai sekarang ini PHP belum mendukung penggunaan caching. Oleh karena itu, kita hanya akan mempelajari bagaimana menggunakan caching pada ASP.NET. Pada ASP.NET caching dapat dilakukan terhadap web form, control, dan data aplikasi.<br> <br> 7.1.1 Caching Web Form Jika Anda memiliki web form yang sering digunakan dan tidak memiliki data yang sering berubah-ubah, maka Anda dapat menggunakan cache agar user memiliki akses yang lebih cepat terhadap web form tersebut. Cache pada web form dapat dilakukan dengan menggunakan menambahkan perintah @OutputCache pada halaman web yang berisi web form. Berikut adalah contoh penggunaannya: <%@ Page language="c#" Codebehind=" Bab7_1.aspx.cs" AutoEventWireup="false" Inherits="Bab7.Bab7_1" %> <%@ OutputCache Duration="120" VaryByParam="None" %> <html> <head> <title>WebForm1 </head> <body ms_positioning="GridLayout"> <form id="Form1" method="post" runat="server"> <h2>Caching Web Form</h2> <hr> <p>Klik Refresh untuk melihat bagaimana informasi dari sisi server dicache.</p> <p>Halaman ini akan diproses kembali oleh server setiap 2 menit (120 detik).</p> <p>Waktu saat halaman ini dicache: <% Response.Write(System.DateTime.Now.ToString()); %> </p><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 113<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> <p>Waktu saat ini: <script>document.write(Date()); </p> </form> <script data-cfasync="false"></script></body> </html><br> <br> Kode di atas merupakan kode yang terletak pada halaman web ASP.NET (.aspx), bukan code-behind (.aspx.cs). Jika kode di atas dijalankan maka kita dapat melihat bagaimana informasi dari server disimpan pada sisi client untuk digunakan dalam durasi waktu tertentu. Hal tersebut dapat mempercepat akses terhadap halaman web dan cocok untuk digunakan pada halaman yang tidak memiliki data yang sering berubah. Perintah OutputCache memiliki beberapa atribut, diantaranya adalah Duration, Location, VaryByParam, VaryByCustom, dan VaryByHeader. Dengan atribut Duration kita dapat menentukan berapa lama sebuah Web Form akan disimpan dalam cache. Atribut Location digunakan untuk menentukan lokasi cache. Atribut VaryByParam untuk menyimpan beberapa respon dari sebuah Web Form berdasarkan pada parameter HTTP POST atau query string. Memberi nilai None pada atribut VaryByParam menyebabkan cache hanya akan dilakukan sekali, tanpa mempedulikan parameter yang dikirim. Atribut VaryByCustom membuat anda dapat mencache respon yang berbeda berdasarkan pada string tertentu (custom string). Untuk menggunakan VerybyCustom, override method GetVaryByCustomString yang terdapat dalam file Global.asax. Sedangkan atribut VaryByHeader mencache respon yang berbeda berdasar header HTTP request yang dikirim dari client. Berikut adalah contoh pemakaiannya: <%@ OutputCache Duration="60" VaryByParam="drpTimeZone" %> <%@ Page language="c#" Codebehind=" Bab7_2.aspx.cs" AutoEventWireup="false" Inherits="Bab7.Bab7_2" %> <html> <body> <form id="Form1" method="post" runat="server"> <h2>Mencache Respon yang Berbeda dari Sebuah Web Form</h2> <hr> <p>Pilih Time Zone dan klik Submit untuk melihat bagaimana informasi dari sisi server dicache.</p> <asp:dropdownlist id="drpTimeZone" runat="server" rel="nofollow"> <asp:listitem value="1" rel="nofollow">GMT+1</asp:listitem> <asp:listitem value="2" rel="nofollow">GMT+2</asp:listitem> <asp:listitem value="0" selected="True" rel="nofollow"> GMT</asp:listitem> <asp:listitem value="-1" rel="nofollow">GMT-1</asp:listitem> <asp:listitem value="-2" rel="nofollow">GMT-2</asp:listitem> </asp:dropdownlist><input type="submit" value="Submit"> <p>Waktu saat halaman ini dicache: <% Response.Write(System.DateTime.Now.AddHours( Convert.ToDouble(drpTimeZone.SelectedItem.Value)));%> </p> <p>Waktu saat ini: <script>document.write(Date()); </p> </form> </body> </html><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 114<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Selain menggunakan perintah OutputCache Anda juga dapat melakukan cache dalam script pemrograman, yaitu dengan menggunakan properti Cache yang terdapat dalam obyek Response. Sebagai contoh, perhatikan script berikut ini: private void Page_Load(object sender, System.EventArgs e) { // Tampilkan waktu saat halaman ini dicache lblTime.Text = System.DateTime.Now.ToString(); // Set Durasi dari OutputCache Response.Cache.SetExpires(System.DateTime.Now.AddSeconds(120)); // Set VaryByParams dari OutputCache Response.Cache.VaryByParams["None"] = true; // Set Lokasi dari OutputCache Response.Cache.SetCacheability(HttpCacheability.Public);<br> <br> } Script di atas akan memberi hasil yang sama dengan perintah OutputCache berikut ini: <%@ OutputCache Duration="120" VaryByParam="None" Location="Any" %><br> <br> Secara default cache akan diletakkan pada setiap tempat yang tersedia - client, proxy server atau server dimana aplikasi web diletakkan (server host). Selain itu, Anda juga dapat menentukan sendiri lokasi dimana cache akan diletakkan, yaitu dengan menggunakan atribut Location pada perintah OutputCache atau properti SetCacheability dari obyek HttpCachePolicy. OutputCache Location dan Seting HttpCachePolicy SetCacheability Location<br> <br> SetCacheability<br> <br> Lokasi cache<br> <br> Any<br> <br> HttpCacheability.Server<br> <br> Pada lokasi yang tersedia: client, proxy server, atau host server.<br> <br> Client<br> <br> HttpCacheability.Private<br> <br> Client yang mengirimkan request<br> <br> Downstream<br> <br> HttpCacheability.Public<br> <br> Client atau proxy server.<br> <br> None<br> <br> HttpCacheability.NoCache<br> <br> Tidak ada lokasi. Seting meniadakan caching<br> <br> Server<br> <br> HttpCacheability.ServerAndNoCache<br> <br> Pada host server dimana request diproses.<br> <br> ServerAndClient HttpCacheability.ServerAndPrivate<br> <br> Pada host server dimana request diproses atau pada Client yang mengirimkan request.<br> <br> 7.1.2 Fragment Caching Misalkan Anda memiliki webform yang memiliki banyak informasi yang variatif dan ditambah sebuah tabel berukuran besar dengan data yang jarang berubah, maka Anda dapat menempatkan tabel besar tersebut ke dalam sebuah web user control dan<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> ini<br> <br> 115<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> mencache control tersebut. Teknik inilah yang disebut Fragment Caching, yaitu teknik untuk mencache sebagian dari web form. Berikut adalah langkah untuk melakukan Fragment Caching: Gabungkan control dan isi dari control tersebut yang ingin dicache dalam sebuah web user control. Set atribut untuk cache pada control tersebut. Letakkan instance dari user control tersebut ke dalam form. Sebagai contoh, user control berikut ini akan dicache selama 30 detik: <%@ Control Language="c#" AutoEventWireup="false" Codebehind="CachedControl1.ascx.cs" %> <%@ OutputCache Duration="30" VaryByParam="None" %> <asp:panel borderwidth="1" backcolor="LemonChiffon" runat="server" id="pnlControl" width="50%" rel="nofollow"> <p><% Response.Write(this.ID) %></p> <p>Time this control was cached: <% Response.Write(System.DateTime.Now.ToString()) %> </p> </asp:panel><br> <br> Pada kode HTML di atas digunakan perintah OutputCache untuk melakukan cache pada user control tersebut. Sebagai alternatif lain, Anda juga dapat menyertakan atribut PartialCaching saat deklarasi class control. Sebagai contoh, kode berikut ini memiliki hasil yang sama dengan perintah OutputCache yang digunakan pada kode sebelumnya: using System.Web.UI; [PartialCaching(30)] public class CachedControl1 : System.Web.UI. UserControl<br> <br> Perintah OutputCache memiliki beberapa atribut tambahan yang berlaku hanya pada user control, atribut tersebut adalah Shared dan VaryByControl. Atribut OutputCache Khusus untuk User Control Atribut<br> <br> Deskripsi<br> <br> Shared<br> <br> Cache sebuah respon dari user control untuk digunakan pada beberapa Web Form. Secara default, ASP.NET mencache respon secara terpisah untuk masing-masing Web Form yang menggunakan user control tersebut. Atribut ini hanya tersedia dalam .NET Framework versi 1.1 ke atas.<br> <br> VaryByControl<br> <br> Cache beberapa respon untuk sebuah user control berdasar nilai dari satu atau lebih control yang terdapat pada user control tersebut.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 116<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 7.1.3 Caching Data Aplikasi Selain Web Form dan Fragment Caching, Anda juga dapat mencache data pada aplikasi. ASP.NET menyediakan obyek Cache yang dapat digunakan untuk menyimpan dan menggunakan kembali data aplikasi. Obyek Cache bersifat global, dimana berarti Cache dapat digunakan dimana saja dalam lingkup aplikasi. Anda dapat menggunakan beberapa cara untuk menyimpan data dalam Cache: Menggunakan Assignment Cache("NewItem") = "Some string data";<br> <br> Menggunakan method Insert Cache.Insert("NewItem", "Some string data");<br> <br> Menggunakan method Add Method Add sama dengan method Insert, namun method ini mengharuskan penggunaan seluruh parameter. Cache.Add("NewItem", "Some string data", Null, _ Cache.NoAbsoluteExpiration, System.TimeSpan.FromMinutes(1), _ Caching.CacheItemPriority.Default, Null);<br> <br> Parameter yang digunakan pada method Insert dan Add Parameter<br> <br> Deskripsi<br> <br> Key<br> <br> Identifier yang digunakan untuk menyimpan atau memanggil data dalam cache.<br> <br> Value<br> <br> Data yang dicache<br> <br> Dependencies<br> <br> A CacheDependency object that references a file used to track changes to data outside of the cache. Use dependencies to synchronize data in the cache with data stored elsewhere.<br> <br> A DateTime object that identifies when the data should be absoluteExpiration removed from the cache. If you’re using sliding expiration, specify Cache.NoAbsoluteExpiration for this parameter. slidingExpiration<br> <br> A TimeSpan object that identifies how long the data should remain in the cache after the data was last accessed. If you’re using absolute expiration, specify Cache.NoSlidingExpiration for this parameter.<br> <br> Priority<br> <br> A CacheItemPriority enumeration value identifying the relative priority of the cached data.<br> <br> A delegate to call when the data is removed from the cache. onRemoveCallback Use onRemoveCallback to notify the application when items are removed from the cache. Karena cache dapat sewaktu-waktu dihapus dari memori, maka kita perlu mengecek setiap cache akan digunakan, seperti pada contoh script berikut ini:<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 117<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> private void DataCache1_PreRender(object sender, EventArgs e) { // Tampilkan hasil: if (Cache["NewItem"] == null) lblNewItem.Text = "NewItem tidak ditemukan."; else lblNewItem.Text = Cache["NewItem"].ToString(); }<br> <br> Sedangkan untuk menghapus cache dari dalam memori, kita dapat menggunakan method Remove, seperti pada contoh script berikut ini: Cache.Remove("NewItem");<br> <br> Anda juga dapat mengatur berapa lama sebuah item akan disimpan dalam memori server, melalui salah satu parameter pada method Insert dan Add, yaitu parameter priority. Seting pada parameter ini sebenarnya hanya menyediakan kontrol tidak langsung. Jika server mulai kehabisan ruang pada memori, maka server secara otomatis akan menghapus cache yang kadaluwarsa. Jika langkah tersebut masih tidak cukup, maka server akan menghapus cache yang belum melampui batas waktu berdasarkan prioritas dan kapan cache tersebut diakses terakhir kali.<br> <br> Cache Priority Seting<br> <br> Keterangan<br> <br> CacheItemPriority.NotRemoveable<br> <br> Prioritas Tertinggi<br> <br> CacheItemPriority.High CacheItemPriority.AboveNormal CacheItemPriority.Normal, CacheItemPriority.Default<br> <br> Normal dan default memiliki prioritas yang sama<br> <br> CacheItemPriority.BelowNormal CacheItemPriority.Low<br> <br> Prioritas terendah; item ini cenderung akan segera dihapus.<br> <br> 7.2 Send Email Fungsi untuk mengirim email sangat sering digunakan dalam aplikasi web. Salah satu contoh penggunaannya yang umum adalah pada website-website yang menyediakan transaksi jual beli online, misalnya ketika server hendak mengirim invoice kepada pelanggan yang telah menyelesaikan order pembelian. Fungsi untuk mengirim email ini tersedia baik dengan PHP maupun dengan ASP.NET, tetapi tentu saja dengan fungsi dan cara penggunaan yang berbeda. Berikut akan kita pelajari cara penggunaan dari keduanya.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 118<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 7.2.1 Send Email dengan PHP Di dalam sintaks PHP, Anda dapat mengirim email dengan menggunakan fungsi mail(). Fungsi ini memiliki sintaks sebagai berikut: mail(string tujuan, string judul, string isi[, string heaader])<br> <br> Keterangan: tujuan alamat email yang dituju judul judul (subject) email isi isi email header header email Berikut adalah contoh pemakaian fungsi mail() dalam sintaks PHP: $pengirim = “From: <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0d796263624d68606c6461236e6260">[email protected]</a>”; $tujuan = “<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f4839d98988db4839d98988dc5c3c4c2da979b99">[email protected]</a>”; $subject = “Subyek dari email.”; $isi = “Ini adalah isi email.”; mail($tujuan,$subject,$isi,$pengirim);<br> <br> 7.2.2 Send Email dengan ASP.NET Untuk mengirim email dengan menggunakan script ASP.NET anda dapat menggunakan 2 cara, yaitu: Menggunakan SmtpMail untuk mengirim email yang berisi teks sederhana saja, atau Menggunakan MailMessage untuk membuat email yang lebih kompleks dan mengirimnya dengan SmtpMail. Kedua class tersebut, class SmtpMail dan class MailMessage merupakan bagian dari namespace System.Web.Mail yang terdapat dalam .NET Framework. Oleh karena itu, untuk dapat menggunakannya Anda harus mendeklarasikan referensi ke namespace tersebut pada bagian awal modul: using System.Web.Mail<br> <br> Berikut adalah contoh pemakaian class SmtpMail untuk mengirim email teks sederhana: SmtpMail.Send("<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c283332331c39313d3530723f3331">[email protected]</a>","<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3a4d535656437a4d535656430b0d0a0c14595557">[email protected]</a>", "Subyek dari email.", "Ini adalah isi email.");<br> <br> Contoh kode di atas akan mengirim sebuah pesan atau email dari <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2e5a4140416e4b434f4742004d4143">[email protected]</a> kepada <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="86f1efeaeaffc6f1efeaeaffb7b1b6b0a8e5e9eba8">[email protected]</a> Kedua parameter alamat pengirim dan penerima harus diisi walaupun tidak ada validasi tertentu untuk alamat tersebut. Object SmtpMail secara default akan mengirim pesan tersebut melalui SMTP pada server lokal Anda. Menggunakan SmtpMail secara langsung terbatas hanya untuk mengirim email teks yang memiliki format tertentu atau berisi menggunakan class MailMessage terlebih<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> memang sangat mudah digunakan, tetapi sederhana. Jika Anda ingin mengirim email attachment didalamnya, maka Anda harus dahulu untuk membuat email tersebut lalu<br> <br> 119<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> mengriimnya dengan class SmtpMail. Berikut adalah contoh pemakaian class MailMessage untuk mengirim email yang lebih kompleks: private void butSendMail_Click(object sender, System.EventArgs e) { // Buat pesan baru. MailMessage mailBaru = new MailMessage(); // Isi dari pesan mailBaru.From = "<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f0b1011103f1a121e1613511c1012">[email protected]</a>"; mailBaru.To = "<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bfc8d6d3d3c6ffc8d6d3d3c68e888f8991dcd0d2">[email protected]</a>"; mailBaru.Subject = "Subyek dari email."; mailBaru.Body = "Ini adalah isi email. Anda dapat menulis pesan Anda di sini"; // Sertakan attachment (lampiran) MailAttachment atcItem = new MailAttachment (Server.MapPath(".") + "\\test.doc"); // Tambahkan attachment ke dalam pesan mailBaru.Attachments.Add(atcItem); // Kirim pesan SmtpMail.Send(mailBaru); }<br> <br> Script di atas memberi contoh pembuatan object message baru, melampirkan sebuah file ke dalam message, dan mengirimnya dengan menggunakan class SmtpMail. Perhatikan bahwa Anda perlu membuat instance object dalam penggunaan class MailMessage.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 120<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 8. Debug Willy<br> <br> Error dan bug merupakan hal yang wajar pada tahap pembuatan aplikasi, karena itu diperlukan suatu tahapan tes dan uji coba sebelum aplikasi tersebut dipakai oleh end user. Tujuan dari tes tersebut adalah untuk menemukan kesalahan atau error dari aplikasi. Debug meliputi perbaikan dari masalah-masalah yang ditemukan dan menambahkan script untuk mendiagnosa masalah tersebut.<br> <br> 8.1 Debug pada PHP PHP 4 tidak memiliki fasilitas debug secara internal. Tetapi jika Anda tetap ingin melakukan debug pada aplikasi PHP Anda, terdapat banyak debugger eksternal yang tersedia di internet. Beberapa debugger yang dapat Anda download secara gratis adalah DBG (http://dd.cron.ru/dbg/), APD Advanced PHP Debugger (http://apd.communityconnect.com/), atau Xdebug (http://www.xdebug.org/). Oleh karena debugger-debugger eksternal tersebut dikembangkan oleh komunitas yang berbeda dan tentunya memiliki standar penggunaan yang berbeda, maka akan sangat sulit untuk dibahas satu persatu pada bab ini. Bagi Anda yang tertarik dipersilakan untuk mengakses situs dari masing-masing debugger dan mempelajari manual yang tersedia di situs tersebut.<br> <br> 8.2 Debug pada ASP.NET dengan VS.NET .NET Framework memiliki 2 class dalam namespace System.Diagnostics, yaitu Debug dan Trace. Kedua class ini dapat digunakan untuk melacak error atau kesalahan pada aplikasi, yaitu dengan menampilkan pesan atau hasil-hasil dari proses berjalannya aplikasi. Karena Debug dan Trace merupakan bagian dari suatu namespace, maka sebelum menggunakannya Anda harus mendeklarasikan namespace yang akan digunakan dengan menggunakan kode seperti berikut: using System.Diagnostics;<br> <br> Perbedaan dari kedua class ini adalah pada saat compile aplikasi. Semua method dan property dari class Debug akan dibuang dari kode pada saat aplikasi dicompile dengan versi Release. Sedangkan method dan property dari class Trace akan tetap dipertahankan. Debug dan Trace memiliki method Assert untuk menguji suatu nilai dan menampilkan peringatan jika bernilai salah (False). Anda dapat menggunakan Assert untuk menghentikan aplikasi jika terjadi hasil yang tidak sesuai. Pada aplikasi berbasis web, pesan peringatan akan muncul pada server.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 121<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Sebagai contoh penggunaan Debug dalam aplikasi, buatlah project Web Application baru menggunakan Visual Studio .NET. Tambahkan control Button dan TextBox ke dalam Web Page. Klik dua kali pada button dan ketikkan kode berikut ini: private void Button1_Click(object sender, System.EventArgs e) { Debug.Assert(TextBox1.Text=="ASP.NET","Anda harus mengetikkan 'ASP.NET' dalam TextBox1"); }<br> <br> Kode debug diatas akan melakukan pengecekan terhadap isi TextBox1, jika TextBox1 tidak berisi tulisan “ASP.NET” maka pesan peringatan "Anda harus mengetikkan 'ASP.NET' dalam TextBox1" akan dimunculkan. Coba jalankan aplikasi Anda dan klik pada button. Maka akan tampil pesan peringatan sebagai berikut:<br> <br> Anda dapat memilih Abort untuk membatalkan jalannya aplikasi, Retry untuk mencoba debug kembali, atau Ignore untuk mengabaikan debug dan melanjutkan aplikasi. Jika Anda ingin menampilkan pesan peringatan tanpa menghentikan jalannya aplikasi, maka Anda dapat menggunakan method Write atau WriteLine. Pesan ini akan ditampilkan pada Visual Studio .NET Output Window. Pesan-pesan yang dihasilkan oleh class debug dan Trace dapat disimpan dalam log. Untuk menyimpannya ke dalam log, Anda perlu membuat suatu class TextWriterTraceListener dan menambahkanya ke dalam collection Listener dari class Debug atau Trace. Sebagai contoh, kode berikut ini akan membuat log pesan pada console server: Debug.Listeners.Add(New TextWriterTraceListener(Console.Out)) Debug.WriteLine("Mulai Debug.")<br> <br> Untuk menyimpan log tersebut ke dalam file, tentukan nama file dan gunakan method Flush untuk menghasilkan output. Sebagai contoh, kode berikut ini akan menyimpan log ke dalam file “Hasil.log”. Debug.Listeners.Add(New TextWriterTraceListener("Results.log")) Debug.WriteLine("Mulai Debug.") Debug.Flush();<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 122<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 9. Tool “PHP to ASP.Net Migration Assistant” Ali Ahmad Heryana<br> <br> 9.1 Apakah Itu Tool “PHP to ASP.Net Migration Assistant” ? Tool “PHP to ASP.Net Migration Assistant” adalah tool yang membantu dalam mempercepat proses kerja dalam mengkonversikan aplikasi basis web PHP menjadi aplikasi basis web ASP.Net dengan hanya dalam beberapa langkah saja.<br> <br> Tool “PHP to ASP.Net Migration Assistant” ini bisa didownload di : http://www.asp.net/DownloadWizard.aspx?WizardTarget=PhpToAspNetMigrationAssista nt Sebelum menginstall Tool ini, pastikan anda memenuhi requirement di bawah ini: Operating System Windows XP, Windows 2000 Microsoft .NET Framework v1.1 Secara default, Microsoft .Net Framework sudah terinstall pada saat instalasi Visual Studio .NET. Jika anda tidak menginstall Visual Studio .NET, maka anda perlu menginstall .Net Framework terlebih dahulu. .NET Framework bisa didownload di : http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157034d1e7cf3a3&displaylang=en<br> <br> 9.2 Menggunakan Tool “PHP to ASP.Net Migration Assistant” Untuk menggunakan Tool “PHP to ASP.Net Migration”, bisa dilakukan melalui Visual Studio.Net atau melalui Command Window. Berikut ini, akan dijelaskan cara penggunaaannya. Sebelumnya, kita siapkan 2 contoh file PHP sederhana yang akan dikonversikan. Dalam Contoh ini, kedua contoh tersebut diletakkan di Folder C:\PHP2ASPNet. contoh2.php <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 123<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Variable ?> <html> <body> <form action="contoh2.php" method="post"> Nama: <input type="text" name="name" size="20"> <br> <input type="hidden" name="user" value="<?=$user?>"> <br> <input type="submit" name="submit"> </form> <script data-cfasync="false"></script></body> </html><br> <br> $user<br> <br> contoh2.php <html> <body> Name (Input Text) : <br> User (Input Hidden) : </body> </html><br> <br> 9.2.1 Visual Studio .Net Buka Visual Studio .NET dan Pilih “Convert...” : File - Open - Convert. Perhatikan gambar dibawah ini:<br> <br> Gambar 9-1. Langkah Pertama 1. Pilihlah “PHP to ASP.Net Migration Assistant Wizard”<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 124<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Gambar 9-2. Langkah Kedua 2. Kemudian akan tampil Layar “PHP to ASP.Net Migration Assistant” – Page 1<br> <br> Gambar 9-3. Langkah Ketiga – Page 1<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 125<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 3. Kemudian Pilihlah Direktori dimana File-File PHP yang akan dikonversi diletakkan.<br> <br> Gambar 9-4. Langkah Ketiga – Page 2 4. Kemudian berilah nama Aplikasi/Project ASP.Net.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 126<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Gambar 9-5. Langkah Ketiga – Page 3<br> <br> 5. Kemudian Pilihlah Direktori dimana File-File PHP yang akan dikonversi diletakkan, defaultnya direktori ini diberi nama OutDir.<br> <br> Gambar 9-6. Langkah Ketiga – Page 4<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 127<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> 6. Klik Next untuk melakukan konversi.<br> <br> Gambar 9-7. Langkah Ketiga – Page 5 Setelah anda selesai melakukan konversi, maka secara otomatis akan dihasilkan Project ASP.Net yang sesuai dengan nama Project yang anda berikan pada gambar 95.<br> <br> 9.2.2 Command Window Untuk contoh diatas, maka jika dituliskan commandnya akan seperti di bawah ini: PHPConvert.exe C:\PHP2ASPNet /out C:\PHP2ASPNet\OutDir /NoLog /ProjectName PHP2ASPNet Pada contoh ini, PHPConvert.exe terinstall di C:\Program Files\Microsoft Corporation\PHP to ASP.NET Migration Assistant\<br> <br> :<br> <br> Berikut adalah penjelasan syntax PHPConvert.exe : PHPConvert[.exe] { <namadirektoriphp> [/Out <namadirektoriasp.net>] [/NoLog | /LogFile <namafile>] [/NoLogo] [/Verbose] [/ProjectName <namaproject>] [/ForceOverwrite] } Keterangan: /? Menampilkan<br> <br> or semua<br> <br> baris<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> perintah<br> <br> yg<br> <br> bisa<br> <br> /Help: digunakan.<br> <br> 128<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> NamaDirektori: Nama Direktori yg berisi File-file PHP yang akan dikonversikan. (Harus diisi) /Out NamaDirektori: Lokasi Direktori ASP.Net, dimana hasil konversi File-file PHP akan diletakkan di direktori ini. Apabila tidak diisikan, maka secara default akan diberi nama “OutDir” /NoLog: Apabila baris<br> <br> perintah<br> <br> ini<br> <br> digunakan,<br> <br> maka<br> <br> Log<br> <br> File<br> <br> tidak<br> <br> akan<br> <br> dibuat.<br> <br> /LogFile NamaFile: Nama Log File yang akan mencatat semua log proses konversi. Jika lokasi LogFile tidak dituliskan, maka secara default akan diberi nama <namaproject>.xml, dimana <projectname> adalah nama Project ASP.Net. /Verbose: Baris perintah ini akan menampilkan semua output proses konversi ke DOS Window. /ProjectName: Name Project ASP.Net yang akan dihasilkan dari hasil konversi file-file PHP. /ForceOverwrite: Baris perintah ini akan menggantikan (overwrite) hasil konversi direktori sebelumnya tanpa mengkonfimasikan terlebih dahulu. Catatan: Lokasi File atau Nama File yg mengandung spasi harus ditulis dalam tanda kutip “.<br> <br> Berikut adalah hasil konversinya dari contoh-contoh di atas: contoh2.aspx <%@ Page language="c#" %> <script runat="server" language="c#"> public string cookieName; public object user; <% cookieName = "user1"; //Nama Cookie PHP.HttpSupport.SetCookie("user", cookieName, PHP.DateTimeSupport.Time() + 86400, "/", ""); //Set Cookie user = (Request.Cookies["user"] != null)?Request.Cookies["user"].Value:null; //Passing Nilai Cookie("User") Ke Variable $user %> <html> <body> <form action="contoh2.aspx" method="post"><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 129<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Nama: <input type="text" name="name" size="20"> <input type="hidden" name="user" value="<%=user%>"> <br> <input type="submit" name="submit"> </form> </body> </html><br> <br> contoh2.aspx <%@ Page language="c#" %> <script runat="server" language="c#"> public object name; public object user; <% name = Request.Form["name"];//retrieve nilai dari Input Text user = Request.Form["user"];//retrieve nilai dari Input Hidden %> <html> <body> Name (Input Text) : <%=user%> <br> User (Input Hidden) : <%=name%> </body> </html><br> <br> 9.3 Keuntungan dan Kelemahan Tool “PHP to ASP.Net Migration Assistant” 9.3.1 Keuntungan Tool “PHP to ASP.Net Migration Assistant” Seperti yang dikatakan sebelumnya bahwa tool “PHP to ASP.Net Migration Assistant” ini berfungsi untuk mempercepat proses konversi dari aplikasi yang berbasis bahasa PHP ke dalam format ASP.Net (C#). Beberapa keuntungan tool ini, antara lain : a. Konversi / Migrasi Bahasa : Berikut adalah komponen-komponen bahasa PHP yang mampu dikonversikan oleh tool ini : •<br> <br> • • •<br> <br> Classes and Objects: Feature ini disupport sepenuhnya; class declaration, inheritance, object initialization, dan lain-lain dikonversikan ke class dan object C#. Constants: Definisi Constant (menggunakan keyword 'define') dikonversikan ke deklarasi constant C#. Control Structures: Hampir semua Control Structures di PHP bisa dikonversikan (kecuali statement 'declare’). Functions: Hampir semua feature-feature penting function bisa dikonversikan, seperti: conditional functions, declaring functions, default arguments, functions within functions, invoking functions and class functions. “Migration Assistant” tidak mensupport “variable functions” ataupun “invoking functions” tanpa parameter.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 130<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> • • • •<br> <br> •<br> <br> Operators: Semua operator-operator penting dipport oleh “Migration Assistant”. References: “Migration Assistant” hanya support “passing by reference”, pemakaian reference yg lain tidak dikonversikan. Syntax: Elemen-elemen sintaks, seperti comments, html escaping and instruction separation juga dikonversikan oleh “Migration Assistant”. Types: Semua type disupport oleh “Migration Assistant”, termasuk Arrays (dikonersikan ke dalam sebuah helper class). Feature type yang lain seperti konversi type, special types (i.e. null, resources) juga disupport. Variables: “Migration Assistant” menkonversikan variable termasuk “predefined variables”.<br> <br> b. Mengubah nama File PHP dan file reference ke asp.net. PHP to ASP.NET Migration Assistant akan mengenerate file-file asp.net ke dalam project baru dengan extensions yg digunakan oleh ASP.NET (*.aspx) dan secara otomatis akan dikonversikan ke dalam format dan reference yang sesuai dengan file aslinya. Ada beberapa bagian di dalam file php, dimana reference ke file yang lain bisa ditemukan : Function “Include” “Included file” dengan Script tag href tag Form action attribute c. Built-in Function yang disupport : Apache Array Calendar Classes & Objects COM Constants Language Constructs Date & Time Directory Error Handling File System Function Handling Http Mail Mathematics Miscellaneous MS-SQL MySQL ODBC Oracle PHP Options Predefined Variables Program Execution Perl Regular Expressions POSIX Regular Expressions<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 131<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Session String URL Variable Xml Parser<br> <br> 9.3.2 Kelemahan Tool “PHP to ASP.Net Migration Assistant” Tool “PHP to ASP.Net Migration Assistant” membantu dalam mempercepat proses kerja konversi dari PHP ke ASP.Net, tetapi tidak seluruh scripting yg ditulis dalam bahasa PHP dapat dikonversikan sehingga masih diperlukan koreksi manual. Selain itu aplikasi asp.net yg dihasilkan tidak memanfaatkan feature-feature advanced yang terdapat di ASP.Net seperti Web controls (Kontrol web), Validation Controls (Kontrol Validasi), ataupun ViewState Asp.Net. Berikut adalah kelemahan-kelemahan tool “PHP to ASP.Net Migration Assistant” : Includes yang bersifat Dinamis : ” PHP to ASP.Net Migration Assistant” tidak akan mengkonversikan “includes” yg bersifat dinamis dengan baik. Perbaikan manual dibutuhkan untuk menghasilkan konversi includes dinamis yg benar. Contoh : pemakaian variable yg menampung nama file. Statement Declare : Statement “declare” tidak disupport oleh “PHP to ASP.Net Migration Assistant”. Script-script PHP yang tidak lengkap Script PHP yang terbagi menjadi beberapa bagian akan menimbulkan kesalahan konversi. Variable Functions / Variable variables Variable Functions / Variable variables di PHP tidak disupport oleh “PHP to ASP.Net Migration Assistant”. References ”Migration Assistant” hanya mensupport Passing Argument by Reference, sedangkan reference-reference yang lain tidak disupport. Feature Lain yang tidak disupport COM Objects User functions dengan parameter panjang variable. Kategori Functions yang tidak terdaftar dalam bagian built-in functions yg disupport Script-script lain yang ditulis dalam bahasa lain juga tidak dikonversikan.<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 132<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Lampiran MSDN Connection MSDN Connection adalah komunitas developer .NET di Indonesia. Komunitas ini bertujuan meningkatkan pemahaman dan pengalaman anda tentang .NET Dengan bergabung bersama kami, anda otomatis mendapatkan update secara berkala mengenai perkembangan teknologi .NET langsung dari Microsoft Indonesia. Jika anda ingin bergabung dengan kami, caranya mudah. Hanya dengan mengklik url http://www.msdnconnection.com/indonesia dan masukkan data-data anda.<br> <br> Komunitas C# Indonesia Komunitas C# Indonesia merupakan bagian dari komunitas .NET Indonesia (INDC) yang berfokus kebidang teknologi .NET dengan menggunakan bahasa C# Komunitas C# Indonesia dapat dijumpai di url www.csharpindonesia.net dan anda dapat bergabung di site ini. Jika ada yang masih ada dipertanyakan mengenai C# ini, anda dapat bergabung dalam mailing list C# indonesia. Di mailing list ini, anda dapat bertukar pikiran mengenai C# maupun .NET. Untuk bergabung cukup mengirim email kosong ke <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="debdadb6bfacae81b7b0bab1f3adabbcadbdacb7bcbb9ea7bfb6b1b1b9acb1abaeadf0bdb1b3">[email protected]</a> dengan subject Subscribe atau kunjungi situs http://groups.yahoo.com/group/csharp_indo<br> <br> Komunitas .NET Indonesia (INDC) Komunitas .NET Indonesia merupakan official dari komunitas-komunitas di Indonesia yang berbasis .NET. Anda bisa bertemu dengan beberapa aktivis komunitas .NET diseluruh wilayah Indonesia. Anda dapat bergabung kedalam komunitas ini dengan masuk ke url www.netindonesia.net dan dapat juga bergabung ke milis DOTNET dengan cara mengirim email kosong ke <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="15717a617b7061386660776676677c7770557b70617c7b717a7b70667c743b7b7061">[email protected]</a><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 133<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Strukutur Organisasi Project Otak 2005-2006<br> <br> Secara umum: Semua team adalah Technical Writer Semau Technical Writer harus mentaati semua aturan yang dibuat oleh Technical Writer Leader pada setiap project yang diikuti Semua wajib menyukseskan semua project yang ada di project otak<br> <br> Project Manager Manajemen semua departemen dan kegiatannya Interface antara team project otak dengan publik Memastikan semua kegiatan berjalan sesuai dengan scenario dan fungsinya.<br> <br> Secretary Mengatur semua administrasi project otak Manajemen keanggotaan team project otak Resource, Information, and Technology Department Diketuai oleh seorang Kepala Department ( Department Head) Tugas o Manajemen resource technical writer termasuk alokasi timing o Mengontrol semua project yang sedang berjalan agar berjalan sesuai dengan schedule Didalam departemen ini terdiri dari semua technical writer Setiap project e-book akan dikepalai oleh Technical Writer Leader yang bertanggung jawab ke Department Head<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 134<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> QA Department Diketuai oleh seorang Kepala Department ( Department Head) Tugas o Manajemen resource Technical Editor o Menguji semua materi yang ada sesuai dengan standard dan template<br> <br> Planning, Strategic, and Finance Department Diketuai oleh seorang Kepala Department ( Department Head) Tugas o Membuat planning dan strategi dalam hal pengembangan dan peningkatan project otak baik materi, resource maupun member o Mencari sumber dana baik dari bentuk kerja sama maupun sponsorship<br> <br> Publication and Marketing Department Diketuai oleh seorang Kepala Department ( Department Head) Tugas o Membuat publikasi dan marketing ke publik tentang project otak<br> <br> Berikut ini susunan pengurus project otak yang baru dan berlaku sejak tanggal 3 Desember 2004 Project Manager<br> <br> :<br> <br> Agus Kurniawan (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5a3b3d2f293b29333b1a233b32353574393537">[email protected]</a>)<br> <br> Secretary<br> <br> :<br> <br> Clementine Katarina Dewi Maya (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5632333b372f3735162f373e39397835393b">[email protected]</a>)<br> <br> Resource, Information, and Technology Department Head<br> <br> :<br> <br> M Fathur Rahman (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="543235202126143d3a323b26272d277a373b7a3d30">[email protected]</a> )<br> <br> QA Department Head<br> <br> :<br> <br> Panji Aryaputra (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b7c7d6c7c2c3c5d6f7d0dad6dedb99d4d8da">[email protected]</a> )<br> <br> Planning, Strategic, and Finance Department Head<br> <br> :<br> <br> Risman Adnan (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8cfee5ffe1ede2edcce1e5effee3ffe3eaf8a2efe3e1">[email protected]</a> )<br> <br> Publication and Marketing Department Head<br> <br> :<br> <br> Kunarto (<a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c8aba0f8fba688b1a9a0a7a7e6aba7a5">[email protected]</a> )<br> <br> Untuk pengurus diatas, program kerja nya bisa dimulai pada tanggal 3 Desember 2004<br> <br> Agus Kurniawan Project Manager of Project Otak<br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 135<br> <br> NET105 – Migrasi PHP ke ASP.NET<br> <br> Program Donatur Project Otak<br> <br> Untuk kemajuan dan kelangsungan project otak, kami dari team project otak mengundang para participant yang peduli atas kemajuan project ini dan resource teknologi .NET untuk menyumbang dana ke project ini. Program donatur ini terbagi menjadi 2 jenis yaitu Program donatur untuk kategori personal. Program ini dapat diikuti oleh masingmasing individu yang peduli pada project ini. Program donatur untuk kategori perusahan/institusi/lembaga. Program ini dapat diikuti oleh perusahan/institusi/lembaga Jika anda atau perusahan/institusi/lembaga anda tertarik untuk menyumbangkan dana ke project otak ini maka bisa menghubungi project manager, Agus Kurniawan, via email yaitu: <a target="_blank" href="https://adoc.pub/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aecfc9dbddcfddc7cfeed7cfc6c1c180cdc1c3">[email protected]</a><br> <br> Project Otak – http://otak.csharpindonesia.net<br> <br> 136<br> <br> <div class="modal fade" id="report" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <form role="form" method="post" action="https://adoc.pub/report/project-otak-migrasi-php-ke-aspnet-net105-willy-ali-ahmad-he" style="border:none"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">Report "Project Otak Migrasi PHP ke ASP.NET (NET105) Willy Ali Ahmad Heryana Rimbun Marpaung Basirudin Rachman. NET105 Migrasi PHP ke ASP"</h4> </div> <div class="modal-body"> <div class="form-group"> <label>Your name</label> <input type="text" name="name" required="required" class="form-control"> </div> <div class="form-group"> <label>Email</label> <input type="email" name="email" required="required" class="form-control"> </div> <div class="form-group"> <label>Reason</label> <select name="reason" required="required" class="form-control"> <option value="">-Select Reason-</option> <option value="pornographic" selected="selected">Pornographic</option> <option value="defamatory">Defamatory</option> <option value="illegal">Illegal/Unlawful</option> <option value="spam">Spam</option> <option value="others">Other Terms Of Service Violation</option> <option value="copyright">File a copyright complaint</option> </select> </div> <div class="form-group"> <label>Description</label> <textarea name="description" required="required" rows="3" class="form-control" style="border:1px solid #cccccc"></textarea> </div> <div class="form-group"> <div style="display:inline-block"> <div class="g-recaptcha" data-sitekey="6LcEnMcZAAAAAFHzKKgaE-Qh57XzUTzpfRElD4dP"></div> </div> </div> <script data-cfasync="false"></script><script src="https://www.google.com/recaptcha/api.js"></script> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="submit" class="btn btn-primary">Send</button> </div> </form> </div> </div> </div> <script> $(document).ready(function () { var inner_height = $(window).innerHeight() - 250; $('#pdfviewer').css({"height": inner_height + "px"}); }); </script> <footer class="footer" style="margin-top:60px"> <div class="container-fluid"> Copyright © 2022 ADOC.PUB. All rights reserved. <div class="pull-right"> <span><a target="_blank" href="https://adoc.pub/about">About Us</a></span> | <span><a target="_blank" href="https://adoc.pub/privacy">Privacy Policy</a></span> | <span><a target="_blank" href="https://adoc.pub/term">Terms of Service</a></span> | <span><a target="_blank" href="https://adoc.pub/copyright">Copyright</a></span> | <span><a target="_blank" href="https://adoc.pub/contact">Contact Us</a></span> | <span><a target="_blank" href="https://adoc.pub/cookie_policy">Cookie Policy</a></span> </div> </div> </footer> <div class="modal fade" id="login" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close" on="tap:login.close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="add-note-label">Sign In</h4> </div> <div class="modal-body"> <form action="https://adoc.pub/login" method="post"> <div class="form-group"> <label class="sr-only" for="email">Email</label> <input class="form-input form-control" type="text" name="email" id="email" value="" placeholder="Email"> </div> <div class="form-group"> <label class="sr-only" for="password">Password</label> <input class="form-input form-control" type="password" name="password" id="password" value="" placeholder="Password"> </div> <div class="form-group"> <div class="checkbox"> <label class="form-checkbox"> <input type="checkbox" name="remember" value="1"> <i class="form-icon"></i> Remember me </label> <label class="pull-right"><a target="_blank" href="https://adoc.pub/forgot">Forgot password?</a></label> </div> </div> <button class="btn btn-primary btn-block" type="submit">Sign In</button> </form> </div> </div> </div> </div> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-177279549-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-177279549-1'); </script> <script src="https://adoc.pub/assets/js/jquery-ui.min.js"></script> <link rel="stylesheet" href="https://adoc.pub/assets/css/jquery-ui.css"> <script> $(function () { $("#document_search").autocomplete({ source: function (request, response) { $.ajax({ url: "https://adoc.pub/suggest", dataType: "json", data: { term: request.term }, success: function (data) { response(data); } }); }, autoFill: true, select: function( event, ui ) { $(this).val(ui.item.value); $(this).parents("form").submit(); } }); }); </script> <div id="ADOCPUB_cookie_box" style="z-index:99999;border-top:1px solid #fefefe;background:#FFC107;width:100%;position:fixed;padding:5px 15px;text-align:center;left:0;bottom:0"> Our partners will collect data and use cookies for ad personalization and measurement. <a href="https://adoc.pub/cookie_policy" target="_blank">Learn how we and our ad partner Google, collect and use data</a>. <a target="_blank" href="https://adoc.pub/project-otak-migrasi-php-ke-aspnet-net105-willy-ali-ahmad-he.html#" class="btn btn-success" onclick="accept_ADOCPUB_cookie_box();return false;">Agree & close</a> </div> <script> function accept_ADOCPUB_cookie_box() { document.cookie = "ADOCPUB_cookie_box_viewed=1;max-age=15768000;path=/"; hide_ADOCPUB_cookie_box(); } function hide_ADOCPUB_cookie_box() { var cb = document.getElementById('ADOCPUB_cookie_box'); if (cb) { cb.parentElement.removeChild(cb); } } (function () { var ADOCPUB_cookie_box_viewed = (function (name) { var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)")); return matches ? decodeURIComponent(matches[1]) : undefined; })('ADOCPUB_cookie_box_viewed'); if (ADOCPUB_cookie_box_viewed) { hide_ADOCPUB_cookie_box(); } })(); </script> </projectname></namaproject></namaproject></namafile></namadirektoriasp.net></namadirektoriphp></div></div></div></div></div></div></div></div></body></html></head></html></div></div></div></div></div></div></div></div></head></html></div></DIV></head></html></div></div>