Artikel ini menjelaskan MySQL, alat yang efektif untuk mengembangkan e-commerce dan situs web dinamis dan kompleks lainnya menggunakan database pihak ketiga. MySQL adalah server SQL yang cepat, multi-thread, dan berfitur lengkap. Selain menjelaskan arsitektur dasar sistem MySQL, artikel ini juga memberikan contoh sederhana yang ditulis dalam Tcl dan C++ untuk membantu Anda mengembangkan aplikasi Web yang didukung database. Artikel ini menjelaskan MySQL, alat yang efektif untuk mengembangkan e-commerce dan situs web dinamis dan kompleks lainnya menggunakan database pihak ketiga. MySQL adalah server SQL yang cepat, multi-thread, dan berfitur lengkap. Selain menjelaskan arsitektur dasar sistem MySQL, artikel ini juga memberikan contoh sederhana yang ditulis dalam Tcl dan C++ untuk membantu Anda mengembangkan aplikasi Web yang didukung database.
Aplikasi yang harus menyimpan atau mengakses informasi dalam jumlah besar bisa mendapatkan keuntungan besar dari penggunaan produk database pihak ketiga. Hal ini terutama berlaku ketika akses terhadap informasi harus terjadi pada beberapa contoh program. Aplikasi berbasis web (termasuk perdagangan elektronik) adalah contoh yang baik.
Mengapa menggunakan database mandiri?
Server web harus memiliki cara agar skrip pemrosesannya dapat menyimpan informasi tentang statusnya untuk diakses nanti. Meskipun dimungkinkan untuk menggunakan metode yang lebih primitif - seperti membuang ke file teks atau mengembangkan database mini buatan sendiri - hanya aplikasi database lengkap yang dapat menyediakan semua layanan yang dibutuhkan oleh aplikasi Web yang lebih kompleks. Tidak banyak manfaat dalam menulis mesin database khusus aplikasi khusus karena ada beberapa paket perangkat lunak yang tersedia secara gratis untuk tujuan ini. Selain itu, penggunaan database pihak ketiga juga menghilangkan kebutuhan pengembang web untuk mengabdikan diri pada tugas mengembangkan dan memelihara database.
basis data MySQL
Mengintegrasikan database ke dalam aplikasi Linux dapat dilakukan dengan cukup mudah melalui penggunaan bahasa skrip dan bahasa sistem yang dikompilasi seperti C. Basis data MySQL yang tersedia secara gratis (didistribusikan di bawah Lisensi Publik GNU) menyediakan serangkaian fungsi SQL yang canggih dan mudah diintegrasikan ke dalam aplikasi. MySQL cepat, multi-thread, dan mendukung standar ANSI dan ODBC SQL. Bersama dengan perangkat lunak pihak ketiga, MySQL mendukung tabel transaksi aman untuk aplikasi pemrosesan transaksi.
Catatan: Apa itu pemrosesan transaksi?
Transaksi adalah serangkaian perubahan pada database yang perlu dilakukan secara atom. Entah semuanya harus dijalankan, atau tidak satupun yang harus dijalankan. Misalnya, semua perubahan database yang diperlukan saat menjual produk di Web membentuk satu transaksi.
Basis data perlu mengurangi saldo akun pelanggan dan inventaris produk, jika tidak maka akan gagal dan tidak ada operasi yang dilakukan.
Kerusakan server karena alasan apa pun seharusnya tidak menyebabkan transaksi dieksekusi sebagian. Misalnya, penagihan berlebih, produk tidak terkirim, atau inventaris yang tidak akurat mungkin disebabkan oleh transaksi yang diselesaikan sebagian.
Basis data yang mendukung pemrosesan transaksi dapat merangkum sekumpulan kode basis data dalam suatu transaksi. Setiap kegagalan selama eksekusi transaksi akan menyebabkan basis data kembali ke keadaan sebelum transaksi dimulai.
Hal ini dicapai dengan menyimpan log semua operasi database, serta salinan tabel status aslinya, memungkinkan operasi rollback saat server di-restart lagi setelah terjadi kegagalan. Overhead waktu dan ruang ini merupakan trade-off yang diperlukan untuk sistem database transaksi yang aman.
Sebuah server MySQL tunggal mengontrol serangkaian database, yang semuanya diakses dengan cara yang sama melalui server. Setiap database sebenarnya adalah kumpulan sejumlah tabel, serupa konsepnya dengan pengguna database SQL lainnya. Setiap tabel terdiri dari kolom data yang diketik. Datanya bisa berupa bilangan bulat, nilai riil, string, atau tipe lainnya, termasuk aliran biner mentah. Setiap baris dalam tabel adalah catatan yang disimpan dalam database.
MySQL dirancang dan terstruktur sebagai klien/server. Server mysqld dapat dijalankan pada mesin apa pun yang dapat diakses dari Internet (sebaiknya pada mesin yang sama dengan server Web atau sedekat mungkin untuk memastikan waktu respons yang wajar). Klien MySQL menggunakan permintaan untuk menghubungi server MySQL untuk mengubah atau menanyakan database yang dimiliki oleh server. Dalam aplikasi Web yang mendukung database, klien database adalah server Web atau skrip CGI yang dihasilkan oleh server Web. Klien ini dapat ditulis dalam bahasa skrip tingkat tinggi atau bahasa sistem tingkat rendah, selama ada API database untuk bahasa tersebut. Di Linux, sebagian besar bahasa skrip diimplementasikan dalam C, dan karena MySQL C API ada, akan mudah untuk menambahkan dukungan MySQL ke bahasa atau alat skrip apa pun yang ada. Sebagian besar bahasa skrip telah menyelesaikan langkah ini.
API MySQL
MySQL API tersedia dalam berbagai bahasa, termasuk hampir semua bahasa yang sebenarnya digunakan untuk menulis backend situs web. Dengan menggunakan API ini kita dapat membangun klien MySQL yang dikendalikan oleh server web.
API (untuk akses database) bekerja dalam mode berbasis koneksi. Hal pertama yang harus dilakukan klien adalah membuka koneksi ke server MySQL. Hal ini termasuk mengautentikasi koneksi dengan tepat menggunakan nama pengguna dan kata sandi yang diketahui server. Setelah koneksi dibuat, server memilih database tertentu untuk digunakan. Setelah inisialisasi ditentukan, aplikasi klien (dalam kasus kami, skrip CGI sisi server) bebas berinteraksi dengan database melalui salah satu dari dua cara berikut: dapat menjalankan perintah SQL biasa, termasuk menambah dan menghapus tabel, dan Menambahkan catatan ke mereka; Anda juga dapat menjalankan kueri terhadap database yang mengembalikan hasil. Kueri menghasilkan sekumpulan rekaman yang cocok dengan kueri, dan klien kemudian dapat mengakses rekaman satu per satu hingga semua rekaman telah dilihat, atau klien membatalkan pengambilan rekaman yang tertunda. Setelah skrip selesai bekerja dengan database, koneksi ke server ditutup.
Untuk membangun situs web yang mengintegrasikan akses database, Anda perlu menulis skrip CGI untuk menghasilkan hasil dinamis berdasarkan status database. Server web meluncurkan skrip CGI dan kemudian mengeluarkan HTML yang diformat dengan tepat ke aliran keluaran standarnya. Server web menangkap HTML dan mengirimkannya kembali ke klien seolah-olah permintaannya adalah halaman HTML statis. Dalam proses menghasilkan HTML, skrip dapat memodifikasi database, atau skrip dapat melakukan kueri dan memasukkan hasilnya ke dalam outputnya.
Sebagai contoh untuk menjelaskan secara singkat proses di atas, kode berikut (ditulis dalam C dan Tcl) menanyakan database yang berisi daftar produk yang dijual oleh suatu perusahaan. Ini tidak berarti menggunakan semua fitur API MySQL dalam kedua bahasa, namun memberikan contoh yang cepat dan mudah diperluas yang dapat menjalankan perintah SQL apa pun pada konten database. Dalam contoh ini, skrip menampilkan semua produk di bawah harga tertentu. Dalam praktiknya, pengguna mungkin memasukkan harga ke dalam browser Web dan kemudian mengirimkannya ke server. Kami mengabaikan detail pembacaan dari variabel lingkungan untuk menentukan nilai formulir HTML karena tidak ada bedanya dengan mengeksekusi dalam skrip CGI yang tidak mendukung database. Demi kejelasan, kami berasumsi bahwa parameter tertentu (seperti harga yang akan ditanyakan) telah ditetapkan sebelumnya.
Kode berikut diimplementasikan di Tcl menggunakan Antarmuka Database Generik Tcl yang tersedia secara gratis. Keuntungan dari antarmuka seperti itu adalah Tcl dapat diinterpretasikan dan dapat dengan cepat mengembangkan serta memodifikasi kode.
Contohnya saja
#Kode ini mencetak semua produk di database
# yang berada di bawah harga yang ditentukan (diasumsikan telah ditentukan
# sebelumnya, dan disimpan dalam variabel targetPrice)
# Outputnya dalam format tabel HTML, sesuai untuk output CGI
#memuat pustaka objek bersama SQL. penerjemah Tcl juga bisa
#telah dikompilasi dengan perpustakaan, membuat baris ini tidak diperlukan
memuat /home/aroetter/tcl-sql/sql.so
#ini sudah didefinisikan dengan baik sebelumnya, atau bisa saja
#dimasukkan ke dalam skrip
atur DBNAME "klienSitus Web";
setel TBLNAME "produk";
atur DBHOST "backend.company.com"
setDBUSER "pengguna mysql"
atur DBPASSWD "rahasia besar"
tetapkan targetHarga 200;
#koneksi ke database
atur pegangan [sql terhubung $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# dapatkan database pengujian
#jalankan kueri menggunakan kode sql yang ditentukan
sql query $handle "pilih * dari $TBLNAME di mana harga <= $targetPrice"
#cetak header tabel html
menempatkan "<batas tabel=4>"
menempatkan "<th>Id Produk <th lebar=200>Deskripsi <th>Harga ($)"
#baris tabel keluaran - setiap baris pengambilan mengambil satu hasil
#dari kueri sql
while {[atur baris [sql ambil baris $handle]] != ""} {
setel produk [lindex $baris 0]
atur deskripsi [lindex $baris 1]
tetapkan harga [lindex $baris 2]
menempatkan "<tr><td>$prodid <td align=center>$deskrip <td>$harga"
}
menempatkan "</tabel>"
#empty buffer hasil kueri - dalam hal ini seharusnya sudah kosong
sql endquery $pegangan
#tutup koneksi db - dalam praktiknya koneksi yang sama
#digunakan untuk beberapa pertanyaan
sql putuskan sambungan $handle
Kode di bawah ini adalah skrip setara yang ditulis dalam C++ menggunakan MySQL C++ API MySQL++ resmi. Keuntungan versi ini adalah versi ini dikompilasi sehingga lebih cepat dibandingkan bahasa yang ditafsirkan. Kode database yang sering digunakan di situs tertentu harus ditulis dalam C atau C++ dan kemudian diakses melalui skrip atau langsung dari server web untuk meningkatkan runtime secara keseluruhan.
Contoh C++
#termasuk
#termasuk
#termasuk
const char *DBNAME = "klienSitus Web";
const char *DBTABLE = "produk";
const char *DBHOST = "backend.perusahaan.com";
const char *DBUSER = "pengguna mysql";
const char *DBPASSWD = "rahasia besar":
ke dalam utama() {
mencoba {
//buka koneksi database dan query
Koneksi koneksi (DBNAME, DBHOST, DBUSER, DBPASSWD);
Kueri kueri = con.query();
//tulis kode sql yang valid ke objek kueri
kueri << "pilih * dari " << DBTABLE;
//jalankan query dan simpan hasilnya
Hasil res = query.store();
//tulis header tabel html
cout<<"<batas tabel=4>n";
cout << "<th>Id Produk <th width=200>Deskripsi"
<< "<th>Harga ($)" << endl;
Hasil::iterator curResult;
Baris baris;
// ulangi setiap hasil dan masukkan ke dalam tabel html
untuk (curResult = res.begin(); curResult != res.end(); curResult++) {
baris = *hasil saat ini;
cout << "<tr><td align=center>" << baris[0]
<< "<td>" << baris[1]
<< "<td>" << baris[2] << endl;
}
cout<<"</tabel>"<<endl;
} catch (BadQuery eh) {
// menangani query yang buruk (biasanya disebabkan oleh kesalahan sintaksis sql)
cerr << "Kesalahan: " << er.error << endl;
kembali -1;
} tangkapan (Pengonversi Buruk) {
//menangani kesalahan konversi dari database juga
cerr << "Kesalahan: Tidak dapat mengonversi "" << er.data << "" menjadi ""
<< er.type_name << ""." << endl;
kembali -1;
}
kembali 0;
}
keamanan
Membuat aplikasi yang didukung Web di Web memiliki beberapa masalah yang perlu dipertimbangkan oleh pengembang. Semua masalah yang terkait dengan program CGI di server Web, seperti izin pemrosesan server Web dan pemeriksaan input di sisi skrip, masih perlu dipertimbangkan.
Selain itu, keamanan sistem database juga perlu dijaga. Hal ini melibatkan pengamanan sistem izin server database dan membuat koneksi dari klien database ke server aman.
MySQL menyediakan sistem keamanan mendalam yang oleh sebagian orang digambarkan sebagai "canggih tetapi tidak standar". MySQL memungkinkan akses klien berdasarkan nama pengguna, host klien, dan database yang akan diakses. Untuk menciptakan sistem yang aman, mintalah semua pengguna menggunakan kata sandi yang kuat dan jangan beri mereka akses apa pun yang sebenarnya tidak mereka perlukan. Hal ini mencakup hak istimewa yang tampaknya tidak berbahaya seperti hak istimewa penanganan yang memungkinkan pengguna melihat semua proses yang berjalan, termasuk proses yang mengubah kata sandi pengguna lain. Pendekatan terbaik adalah dengan menjalankan proses server itu sendiri sebagai pengguna Unix yang tidak memiliki hak istimewa sehingga jika satu database disusupi, hal itu tidak akan melumpuhkan seluruh sistem. Ini mirip dengan menjalankan httpd sebagai pengguna bukan siapa-siapa, bukan root. Tabel yang menjelaskan akses sistem disimpan sebagai database MySQL terpisah dan dapat diperbarui oleh pengguna root MySQL. Perhatikan bahwa server MySQL memberikan hak istimewa berdasarkan nama pengguna MySQL, yang berbeda dari nama pengguna Unix. Namun, ada nama pengguna root MySQL, yang memiliki izin penuh pada database. Setelah server menentukan siapa klien yang terhubung dan apa yang mereka coba sambungkan, akses dikontrol berdasarkan serangkaian izin yang diberikan. Untuk mencegah nama host di tabel akses dipalsukan oleh DNS, Anda dapat memasukkan alamat IP semua host, atau meminta server untuk menyelesaikan alamat IP kembali ke nama host asli untuk mempersulit orang lain mencegat permintaan dan jawaban DNS .
Selain tabel akses server, komunikasi dengan server juga harus aman. Saat masuk ke server dari klien, kata sandi tidak dikirim dalam teks biasa; namun, semua perintah SQL berikutnya akan dikirim dalam teks biasa. Untuk keamanan yang lebih baik, gunakan ssh untuk mengatur penerusan porta. Ini mengenkripsi semua komunikasi antara server dan klien, mencegah siapa pun mengamatinya saat transit. Data dari klien dikirim ke port pada mesin lokal klien tempat server ssh lokal mendengarkan. Ini digunakan oleh server ssh lokal, dienkripsi dan dikirim ke server ssh jarak jauh, yang mendekripsi dan meneruskannya ke port server MySQL.
Dalam praktiknya, pendekatan paling aman adalah dengan menjalankan server database pada mesin yang sama dengan server web dan membiarkan skrip CGI yang dihasilkan oleh server web berkomunikasi dengan server MySQL melalui soket UNIX (asli). Pengaturan ini memungkinkan administrator database untuk menonaktifkan semua koneksi jarak jauh ke server MySQL. Jika server web dan database harus berada di mesin yang berbeda, enkripsikan semua komunikasi di antara keduanya, atau sambungkan kedua mesin melalui jaringan khusus dan terisolasi secara fisik. Buat hanya satu akun pengguna (selain pengguna root) yang digunakan oleh server web untuk masuk ke server database.
Situs web berbasis basis data adalah alat canggih yang memungkinkan pengembang membuat situs dinamis yang memberikan informasi terkini dan memungkinkan perubahan yang dimulai oleh klien bertahan di beberapa sesi. Penggunaan database back-end sangat penting untuk mengelola pengguna e-commerce dan aplikasi lainnya. Dengan menggunakan perangkat lunak yang tersedia secara bebas, dimungkinkan untuk membangun situs berbasis basis data yang secara aman mengintegrasikan konektivitas basis data ke dalam arsitektur CGI situs yang ada.