Cubaan Membina Aplikasi Web Dengan MySQL & PHP - BAHAGIAN 1

BERJAYA!


geeky stuff
#MySQL | #PHP
بِسۡمِ ٱللهِ ٱلرَّحۡمَـٰنِ ٱلرَّحِيمِ
Taip padam taip padam, begitulah berulang-ulang demi memulakan penulisan ini.

Banyak perkara yang mahu dikemaskini, dan sebenarnya memang berniat nak merapu panjang di mukaddimah penulisan kali ini.
Kisahnya. Sebelum ini dah banyak kali juga cuba bina aplikasi web dengan dua benda ini; MySQL dan PHP, tapi tak pernah betul-betul serius. Entah kenapa sejak PKP ini, lain macam pula semangat nak belajar.
Jadi Alhamdulillah. Banyak betul benda yang dipelajari. Semuanya pembelajaran secara sendiri. Tidak menghadiri mana-mana kelas formal atau berbayar. Pembelajaran hanya melalui hasil Google dan maklumat secara percuma yang diberikan oleh mereka yang begitu budiman berkongsi ilmu di alam maya.
Oh ya, sebagai seorang yang sedang berkuli mengendalikan akaun set penuh (full sets of accounts) di tempat kerja dan juga ditugaskan oleh ahli keluarga untuk menguruskan akaun keluarga, faktor ini juga mendorong untuk kubelajar dua subjek ini.
Nak mudah, boleh guna Excel atau Calc Spreadsheet (LibreOffice) sahaja. Tapi kita mahukan sesuatu yang mencabar diri. Boleh gilap kemahiran diri sendiri juga, bukan?
Selepas membuat konfigurasi LAMP di komputer peribadi ini tempoh hari, sedikit-sedikit kita belajar. Di peringkat permulaan, kucuba sahaja belajar melalui keputusan carian di Google. Maklumat masih relevan, terkini dan selamat daripada sebarang serangan siber atau tidak belakang kira. Janji mula sahaja.
Apabila sudah selesa dan faham asas MySQL serta PHP serba sedikit, tahu bagaimana dua subjek ini berfungsi, barulah kita teliti bahagian informasi terkini supaya pengetahuan itu kekal relevan.
Idea untuk membangunkan aplikasi web ini datang daripada tanggungjawab untuk merekodkan transaksi ansuran bulanan Penapis Air Cuckoo yang kami adik-beradik usahakan biayai untuk ibunda tercinta kami.
Maka terhasillah aplikasi web dengan fungsi lejar yang ringkas sahaja.
Proses memasukkan maklumat hanya terdiri daripada dua komponen:-
  1. Akaun: Melibatkan nama sahaja. Yalah, akaun hanya melibatkan adik-beradik. Tidaklah perlu beria tambah perincian lain seperti alamat semasa dan nombor untuk dihubungi.
  2. Transaksi: Perincian transaksi yang maklumat untuk pengisian bahagian Debit / Kredit -nya memerlukan pengetahuan Prinsip Akaun jugalah ya.

Pangkalan data untuk simpanan maklumat-maklumat ini ialah MySQL.

Perkara pertama yang dibuat setelah merangka komponen aplikasi web ini adalah mencipta pangkalan data (Database).

CREATE DATABASE nama_database;
Oh ya, janganlah lupa log masuk mysql pula ya sebelum itu. Hubungan (connection) kepada mysql jika log masuk menggunakan phpMyAdmin atau terminal di server lokal memerlukan maklumat pengguna (username) & kata laluan (password).
Setelah itu, gunakan nama_database untuk cipta table pula. Entahlah apa panggilannya di dalam Bahasa Melayu ya. Kita guna bahasa 'standard' IT sahajalah.
Berdasarkan dua maklumat yang kuterangkan di atas, daku ciptakan dua table; akaun dan transaksi.
table akaun:
CREATE TABLE akaun (
    id INT AUTO_INCREMENT NOT NULL,
    nama VARCHAR(30) NOT NULL,
    setem_masa TIMESTAMP,
    PRIMARY KEY (id, nama),
    UNIQUE KEY (nama)
    ) ENGINE=INNODB DEFAULT CHARSET=latin1;
table transaksi:
CREATE TABLE transaksi (
    id INT AUTO_INCREMENT NOT NULL,
    no VARCHAR(10) NOT NULL,
    tarikh DATE NOT NULL,
    nama_akaun VARCHAR(30) NOT NULL,
    keterangan TEXT(300) NOT NULL,
    debit DECIMAL(6,2),
    kredit DECIMAL(6,2),
    setem_masa TIMESTAMP,
    PRIMARY KEY (id, no, nama_akaun),
    INDEX (nama_akaun),
    FOREIGN KEY (nama_akaun)
    REFERENCES akaun(nama)
    ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY (no)
    ) ENGINE=INNODB DEFAULT CHARSET=latin1;
Hui, nak sampai kepada tahap berpuas hati terhadap hasil terakhir penciptaan pangkalan data dengan MySQL seperti di atas ni, pelbagai 'cubaan dan ralat' yang perlu dihadapi, tahu? Sehingga sudah ke tahap produksi, melalui pembelian domain dan juga hos web pun masih menemui bermacam-macam masalah.
Sebelum berani beli domain dan langgan hos web (berbayar), cubaan sentiasa dibuat melalui:-
  1. Pelayan tempatan (local server); dan
  2. Hos web percuma.

Sila lihat imej-imej sebagai contoh pada ‘TAB’ di bawah dengan penerangan lanjut untuk pemahaman lebih.

table akaun (3 kolum):
  • Kutetapkan nombor ID yang menjadi kunci utama table dengan jenis data ialah integer dan nombornya menaik secara automatik, tidak boleh kosong.
  • nama akaun dengan jenis data varchar (pelbagai karakter) terhad kepada 30 aksara yang juga ditetapkan sebagai kunci utama dan unik. Ia kutetapkan sebagai kunci utama dan unik kerana akan daku hubungkan ia dengan satu kolum yang dikenalpasti sebagai kunci asing 'foreign key' di table transaksi. Kunci UNIQUE ini amatlah penting sekiranya kita mahu menghubungkan ia kepada kolum di table lain.
  • Kolum setem_masa itu kutambah sebagai maklumat asas waktu dan tarikh nama dicipta apabila nilainya dimasukkan ke dalam pangkalan data.

table transaksi (8 kolum):

  • Ciri-ciri nombor ID sama seperti nombor ID di table akaun.
  • no yakni nombor transaksi dengan jenis data varchar terhad kepada 10 aksara.
  • tarikh dengan jenis data tarikh-lah selayaknya.
  • nama_akaun yang dihubungkan dengan kolum nama di table akaun. Perhatikan bahawa ciri-ciri nama_akaun ini mesti sama seperti yang ditetapkan di kolum nama table akaun.
  • keterangan iaitu maklumat transaksi dengan jenis data text terhad kepada 300 aksara dan tidak boleh kosong.
  • Bahagian debit dan kredit dengan jenis data berdigit 6 secara maksimanya serta mempunyai 2 titik perpuluhan. Dua kolum ini tidak daku tetapkan sebagai 'tidak boleh kosong' kerana salah satu kolum pasti akan kosong apabila maklumat transaksi mahu dimasukkan. Kosong bukan bermaksud tidak ada kontra dengan bahagian lawannya ya?
    Sepatutnya apabila mengisi lejar (terma yang betul sebenarnya adalah jurnal, ada perbezaan antara jurnal dan lejar. Harap maklum), kedua-dua bahagian debit dan kredit mesti diisi sama. Sebagai contoh, jika membeli barang dari XYZ dengan harga RM 30.00, akan ada dua jurnal yang terlibat;
    1. Pesanan Pembelian (Purchase Order):
      Dr  Perbelanjaan    30.00
          Kr  XYZ             30.00
    2. Dan apabila bayaran telah dibuat;
      Dr  XYZ     30.00
          Kr  Bank/Tunai  30.00

    Akan tetapi, pengisian transaksi ini khusus untuk akaun yang dimaksudkan sahaja. Ia tidak sekali-kali kelihatan sama seperti entri sebuah jurnal. Disebabkan itulah boleh berlakunya satu bahagian yang berisi amaun dan satu lagi bahagian kosong (gambarannya hanya akan dapat disaksikan setelah semua penerangan berkenaan PHP selesai).
    Yalah, ianya bukanlah akaun sebuah syarikat yang memerlukan laporan kewangan seperti Aliran Wang Tunai (Cash Flow), Penyata Pendapatan (Income Statement) dan Kunci Kira-kira (Balance Sheet) apabila tahun berakhir sampai kena masukkan maklumat perbelanjaan, pendapatan, akaun bank, buku tunai etc itu semua.
    Memadai sekadar laporan ringkas melibatkan ahli keluarga sahaja. Mahukan laporan lengkap kewangan sebagaimana untuk sebuah perniagaan kenalah langgan perisian istimewa seperti Sage UBS atau SQL Accounting Software. Tidaklah perlu sebuah sistem cikai seperti ini. (SENYUM).
    Seperti yang pernah kusebutkan sebelum ini, nak mengisi bahagian ini memerlukan pengetahuan asas akaun ya?
  • Akhir sekali kolum setem_masa dengan tujuan yang sama seperti table akaun di atas.
Kunci utama daku tetapkan bagi kolum id, no dan juga nama_akaun.
Baik, perhatikan bahawa terdapat penetapan tambahan bagi kolum nama_akaun di mana daku jadikan ia sebagai 'foreign key' dengan rujukan kepada kolum nama di table akaun. Bahagian ini sekiranya nama di table akaun disunting (update), nama_akaun di table transaksi juga akan berubah sama seperti suntingan yang telah dijalankan ke atas kolum nama table akaun (fungsi ON UPDATE CASCADE). Dan sekiranya nama di table akaun mahu dipadam (delete), ia tidak akan berjaya kerana terdapat rekod di table transaksi dengan nama akaun berkenaan (fungsi ON DELETE RESTRICT).
Kunci Unik kutetapkan jua bagi nombor transaksi kerana mahukan ia istimewa tanpa boleh ditindan.
Sebelum ini, gara-gara mahukan nama akaun tidak boleh ditindan juga, daku tetapkan dua kolum ini sebagai unik. Tetapi timbul masalah kerana sekiranya kita menambah transaksi dengan nombor transaksi yang sama tetapi ditugaskan kepada nama akaun berbeza, simpanan tetap boleh berlaku.
Jadi hanya nombor transaksi yang perlu ditetapkan sebagai unik untuk mengelakkan masalah ini. Lagi pula, nama di table akaun itu sendiri sudah ditetapkan sebagai unik atas keperluan menghubungkan ia dengan kolum nama_akaun di table transaksi sebagai kunci asing. Jadi, tidak perlu dibuat penetapan sebagai unik sekali lagi bagi nama_akaun di table transaksi ini.


Ahah! Jika perasan, nama_akaun juga dibuat INDEX semasa mahu cipta table transaksi ini. Sebenarnya, jika sudah menetapkan kolum ini sebagai kunci utama (Primary key), tidak perlu lagi tetapkan ia sebagai INDEX untuk jadikan ia kunci asing kepada kolum di table lain. Kolum ini wajib dijadikan sebagai INDEX sekiranya kita mahukan kolum ini berfungsi sebagai kunci asing tanpa menetapkan ia sebagai kunci utama terlebih dahulu. Sengaja daku tambahkan juga INDEX bagi nama_akaun ini walaupun sememangnya kolum berkenaan sudah dijadikan sebagai kunci utama. Tujuannya adalah khusus untuk penerangan tambahan ini.

Di bahagian ini, dengan baris perintah DESCRIBE 'namatable', kita boleh lihat penerangan kepada table yang telah kita ciptakan. Boleh nampak kolum apa, jenis data, boleh kosong atau tidak, jenis kunci, serta ciri-ciri tambahan seperti menaik secara automatik atau tidak.

BERSAMBUNG DI BAHAGIAN KE-2 NANTI. Sila rujuk bahagian 'rujukan' dan 'lihat juga' di bawah untuk pautan.



Kali terakhir halaman ini dikemaskini/disemak semula adalah pada .
Top