Source code forum diskusi dengan php

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

A forum, or message board, is a discussion where people can hold conversations in the form of posted messages. They differ from chat rooms in that messages are often longer than one line of text, and are at least temporarily archived. Also, depending on the access level of a user or the forum set-up, a posted message might need to be approved by the admin before it becomes visible.

A discussion forum is hierarchical or tree-like in structure: a forum can contain a number of subforums, each of which may have several topics. Within a forum’s topic, each new discussion started is called a thread and can be replied to by as many people as so wish.

Depending on the forum’s settings, users can be anonymous or have to register with the forum and then subsequently log in in order to post messages. On most forums, users do not have to log in to read existing messages.

A forum consists of a tree-like directory structure. The top end is “Categories”. A forum can be divided into categories for relevant discussions. Under the categories are sub-forums. The topics (commonly called threads) come under the lowest level of sub-forums and these are the places under which members can start their discussions or posts.

This is a simple program that will teach you how to create a simple forum site using web programming tools like PHP, MySql, and many others.

Dalam tutorial ini, kita akan membangun sebuah forum didukung PHP/MySQL dari awal. Tutorial ini sempurna untuk mendapatkan penggunaan PHP dan database yang digunakan untuk dasar. Mari kita langsung menyelaminya!

Langkah 1: Membuat Tabel Database

Adalah selalu ide yang bagus untuk memulai dengan membuat model data yang bagus saat membuat aplikasi. Mari kita jelaskan aplikasi kita dalam satu kalimat: Kita akan membuat forum yang memiliki users yang membuat topics di berbagai categories. Pengguna lain dapat post balasan. Seperti yang Anda lihat, saya menyoroti beberapa kata benda yang mewakili nama tabel kita.

Users

  • Categories
  • Topics
  • Posts

Ketiga objek ini saling terkait satu sama lain, jadi kita akan mengolahnya dalam desain tabel kita. Lihatlah skema di bawah ini.

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Terlihat cukup rapi ya? Setiap kotak adalah tabel database. Semua kolom yang tercantum di dalamnya dan garis di antara keduanya mewakili relasi. Saya akan menjelaskannya lebih jauh, jadi tidak apa-apa jika itu tidak masuk akal bagi Anda saat ini.

Saya akan membahas setiap tabel dengan menjelaskan SQL, yang saya buat dengan menggunakan skema di atas. Untuk skrip Anda sendiri Anda bisa membuat skema serupa dan SQL juga. Beberapa editor seperti MySQL Workbench (yang saya gunakan) dapat menghasilkan file .sql juga, tapi saya akan merekomendasikan belajar SQL karena lebih menyenangkan melakukannya sendiri. Pengenalan SQL dapat ditemukan di W3Schools.

Tabel Users

CREATE TABLE users (
user_id   INT(8) NOT NULL AUTO_INCREMENT,
user_name	VARCHAR(30) NOT NULL,
user_pass  	VARCHAR(255) NOT NULL,
user_email	VARCHAR(255) NOT NULL,
user_date	DATETIME NOT NULL,
user_level	INT(8) NOT NULL,
UNIQUE INDEX user_name_unique (user_name),
PRIMARY KEY (user_id)
) TYPE=INNODB;

Pernyataan CREATE TABLE digunakan untuk menunjukkan bahwa kita ingin membuat tabel baru, tentu saja. Pernyataannya diikuti dengan nama tabel dan semua kolom yang dicantumkan di antara tanda kurung. Nama semua field sudah cukup jelas, jadi kita hanya akan membahas tipe data di bawah ini.

user_id

"Primary key digunakan untuk mengidentifikasi setiap baris dalam sebuah tabel secara unik."

Jenis field ini adalah INT, yang berarti field ini memegang integer. Field tidak boleh kosong (NOT NULL) dan penambahan disetiap record yang dimasukkan. Di bagian bawah tabel, Anda dapat melihat field user_id dideklarasikan sebagai primary key. Primary key digunakan untuk mengidentifikasi setiap baris dalam sebuah tabel secara unik. Tidak ada dua baris yang berbeda dalam tabel yang memiliki nilai (atau kombinasi nilai) yang sama di semua kolom. Itu mungkin sedikit tidak jelas, jadi inilah sedikit contohnya.

Ada seorang pengguna bernama John Doe. Jika pengguna lain mendaftar dengan nama yang sama, ada masalah, karena: pengguna mana adalah yang mana? Anda tidak bisa mengatakannya dan database juga tidak bisa membedakan keduanya. Dengan menggunakan primary key masalah ini diselesaikan, karena kedua topik itu unik.

Semua tabel lainnya juga mempunyai primary key juga dan mereka bekerja dengan cara yang sama.

user_name

Ini adalah field teks, yang disebut field VARCHAR di MySQL. Jumlah antara tanda kurung adalah panjang maksimum. Pengguna dapat memilih nama pengguna hingga 30 karakter. Field ini tidak boleh NULL. Di bagian bawah tabel, Anda bisa melihat field ini dinyatakan UNIQUE, yang berarti nama pengguna yang sama tidak dapat didaftarkan dua kali. Bagian UNIQUE INDEX menunjukkan database yang ingin kita tambahkan kunci unik. Kemudian kita mendefinisikan nama kunci unik, user_name_unique dalam kasus ini. Antara tanda kurung adalah field kunci unik yang berlaku, yaitu user_name.

user_pass

Field ini sama dengan field user_name, kecuali panjang maksimumnya. Karena password pengguna, tidak peduli berapa panjangnya, digabung dengan sha1(), password akan selalu 40 karakter panjangnya.

user_email

Field ini sama dengan field user_pass.

user_date

Ini adalah field dimana kita akan menyimpan tanggal pendaftaran pengguna. Jenisnya adalah DATETIME dan field-nya tidak boleh NULL.

user_level

Field ini berisi tingkat pengguna, misalnya: '0' untuk pengguna biasa dan '1' untuk admin. Lebih lanjut tentang ini nanti.

Tabel Categories

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;

Tipe data ini pada dasarnya bekerja dengan cara yang sama dengan tabel users. Tabel ini juga memiliki primary key dan nama kategori haruslah unik.

Tabel Topics

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;

Tabel ini hampir sama dengan tabel lainnya, kecuali field topic_by. Field itu mengacu pada pengguna yang menciptakan topik. Topic_cat mengacu pada kategori topik miliknya. Kita tidak bisa memaksa relasi ini hanya dengan menyatakan field-nya. Kita harus membiarkan database mengetahui bidang ini harus berisi user_id yang ada dari tabel pengguna, atau tabel cat_id yang valid dari tabel kategori. Kita akan menambahkan beberapa relasi setelah saya membahas tabel posting.

Tabel Posts

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;

Ini sama dengan tabel lainnya; ada juga field yang mengacu pada user_id di sini: field post_by. Field post_topic mengacu pada topik pos miliknya.

"Foreign key adalah batasan referensi antara dua tabel. Foreign key mengidentifikasi kolom atau kumpulan kolom dalam satu tabel (referensi) yang mengacu pada kolom atau kumpulan kolom di tabel lain (yang direferensikan)."

Setelah kita mengeksekusi query ini, kita memiliki model data yang cujup bagus, namun relasinya masih hilang. Mari kita mulai dengan definisi sebuah relasi. Kita akan menggunakan sesuatu yang disebut foreign key. Foreign key adalah batasan referensi antara dua tabel. Foreign key mengidentifikasi kolom atau kumpulan kolom dalam satu tabel (referensi) yang mengacu pada kolom atau kumpulan kolom di tabel lain (yang direferensikan). Beberapa kondisi:

  • Kolom di tabel referensi yang foreign key mengacu harus menjadi primary key
  • Nilai yang harus dirujuk harus ada dalam tabel yang direferensikan

Dengan menambahkan foreign key, informasi dihubungkan bersamaan yang sangat penting untuk normalisasi database. Sekarang Anda tahu apa itu foreign key dan mengapa kita menggunakannya. Saatnya untuk menambahkannya ke tabel yang telah kita buat dengan menggunakan pernyataan ALTER, yang bisa digunakan untuk mengubah tabel yang sudah ada.

Kita akan menghubungkan topik ke kategori terlebih dulu:

ALTER TABLE topics ADD FOREIGN KEY(topic_cat) REFERENCES categories(cat_id) ON DELETE CASCADE ON UPDATE CASCADE;

Bagian terakhir dari query sudah mengatakan apa yang terjadi. Saat kategori dihapus dari database, semua topik akan dihapus juga. Jika cat_id dari kategori berubah, setiap topik akan diperbarui juga. Itulah kegunaan dari bagian ON UPDATE CASCADE. Tentu saja, Anda dapat membalikkan ini untuk melindungi data Anda, sehingga Anda tidak dapat menghapus kategori selama masih memiliki topik yang terkait dengannya. Jika Anda ingin melakukannya, Anda bisa mengganti bagian 'ON DELETE CASCADE' dengan 'ON DELETE RESTRICT'. Ada juga SET NULL dan NO ACTION, yang berbicara untuk mereka sendiri.

Sekarang, setiap topik terkait dengan kategori. Mari tautkan topik ke pengguna yang membuatnya.

ALTER TABLE topics ADD FOREIGN KEY(topic_by) REFERENCES users(user_id) ON DELETE RESTRICT ON UPDATE CASCADE;

Foreign key ini sama dengan yang sebelumnya, tapi ada satu perbedaan: pengguna tidak bisa dihapus asalkan masih ada topik dengan user id dari pengguna. Kita tidak menggunakan CASCADE di sini karena mungkin ada informasi berharga dalam topik kita. Kita tidak ingin informasi tersebut dihapus jika seseorang memutuskan untuk menghapus akun mereka. Untuk tetap memberi pengguna kesempatan untuk menghapus akun mereka, Anda dapat membuat beberapa fitur yang menganonimkan semua topik mereka dan kemudian menghapus akun mereka. Sayangnya, itu diluar lingkup tutorial ini.

Tautkan posting ke topik:

ALTER TABLE posts ADD FOREIGN KEY(post_topic) REFERENCES topics(topic_id) ON DELETE CASCADE ON UPDATE CASCADE;

Dan akhirnya, tautkan setiap posting ke pengguna yang membuatnya:

ALTER TABLE posts ADD FOREIGN KEY(post_by) REFERENCES users(user_id) ON DELETE RESTRICT ON UPDATE CASCADE;

Itulah bagian database! Cukup banyak pekerjaan, tapi hasilnya, model data yang hebat, yang pasti layak dilakukan.

Setiap halaman forum kita membutuhkan beberapa hal mendasar, seperti DOCTYPE dan beberapa markup. Itu sebabnya kita akan menyertakan file header.php di bagian atas setiap halaman, dan footer.php di bagian bawah. Header.php berisi DOCTYPE, link ke stylesheet dan beberapa informasi penting tentang forum, seperti tag title dan metatag.

header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="description" content="A short description." />
	<meta name="keywords" content="put, keywords, here" />
	<title>PHP-MySQL forum</title>
	<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<h1>My forum</h1>
	<div id="wrapper">
	<div id="menu">
		<a class="item" href="/forum/index.php">Home</a> -
		<a class="item" href="/forum/create_topic.php">Create a topic</a> -
		<a class="item" href="/forum/create_cat.php">Create a category</a>
		
		<div id="userbar">
		<div id="userbar">Hello Example. Not you? Log out.</div>
	</div>
		<div id="content">

Div pembungkus akan digunakan untuk memudahkan menata keseluruhan halaman. Menu div jelas berisi menu dengan link ke halaman yang masih harus kita buat, tapi ini membantu untuk melihat sedikit kemana kita pergi. Div userbar akan digunakan untuk bar atas kecil yang berisi beberapa informasi seperti nama pengguna dan link ke halaman logout. Halaman konten menyimpan konten yang sebenarnya dari halaman, jelas.

Pembaca yang penuh perhatian mungkin telah memperhatikan bahwa kita kehilangan beberapa hal. Tidak ada tag

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
9 atau
ALTER TABLE topics ADD FOREIGN KEY(topic_cat) REFERENCES categories(cat_id) ON DELETE CASCADE ON UPDATE CASCADE;
0. Mereka ada di halaman footer.php, seperti yang bisa Anda lihat di bawah ini.

</div><!-- content -->
</div><!-- wrapper -->
<div id="footer">Created for Nettuts+</div>
</body>
</html>

Ketika kami menyertakan header dan footer pada setiap halaman sisa halaman mendapatkan tertanam antara header dan footer. Metode ini telah mendapat beberapa keuntungan. Pertama dan terutama, semuanya akan bergaya dengan benar. Contoh singkat:

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
0

Seperti yang Anda lihat, sebuah halaman tanpa kesalahan akan menghasilkan halaman yang bagus dengan kontennya. Tapi jika ada kesalahan, semuanya terlihat sangat jelek; jadi itu sebabnya lebih baik memastikan tidak hanya konten nyata yang ditata dengan benar, tapi juga kesalahan yang mungkin kita dapatkan.

Keuntungan lain adalah kemungkinan untuk membuat perubahan yang cepat. Anda bisa melihat sendiri dengan mengedit teks di footer.php saat Anda menyelesaikan tutorial ini; Anda akan melihat perubahan footer pada setiap halaman dengan segera. Akhirnya, kita menambahkan stylesheet yang memberi kita beberapa markup dasar - tidak ada yang terlalu mewah.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
1

Langkah 3: Siap Beraksi

Sebelum kita bisa membaca apapun dari database kita, kita membutuhkan sebuah koneksi. Itulah gunanya connect.php. Kita akan memasukkannya ke dalam setiap file yang akan kita buat.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
2

Cukup ganti nilai default dari variabel di bagian atas halaman dengan database Anda sendiri, simpan file dan Anda siap untuk pergi!

Langkah 4: Menampilkan Ikhtisar Forum

Karena kami baru saja mulai dengan beberapa teknik dasar, kita akan membuat versi sederhana dari forum sekilas untuk sekarang.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
3

Itu dia: ikhtisar yang bagus dan bersih. Kami akan memperbarui halaman ini seluruh tutorial sehingga menjadi lebih seperti hasil akhirnya, langkah demi langkah!

Langkah 5: Mendaftarkan Pengguna

Mari kita mulai dengan membuat form HTML sederhana sehingga pengguna baru bisa mendaftar.

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Sebuah halaman PHP diperlukan untuk memproses form. Kita akan menggunakan variabel $_SERVER. Variabel $_SERVER adalah array dengan nilai yang disetel secara otomatis dengan setiap permintaan. Salah satu nilai-nilai $_SERVER array adalah 'REQUEST_METHOD'. Bila halaman diminta dengan GET, variabel ini akan menyimpan nilai 'GET'. Bila halaman diminta melalui POST, maka akan memegang nilai 'POST'. Kita dapat menggunakan nilai ini untuk memeriksa apakah sebuah form telah diposting. Lihat halaman signup.php di bawah ini.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
4

Banyak penjelasan yang ada di komentar yang saya buat di file, jadi pastikan untuk memeriksanya. Pengolahan data berlangsung dalam tiga bagian:

  • Memvalidasi data
  • Jika data tidak valid, tampilkan form lagi
  • Jika data valid, simpan record di database

Bagian PHP sudah cukup jelas. Namun, query SQL mungkin memerlukan penjelasan sedikit lebih banyak.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
5

Pada baris 1 kita memiliki pernyataan INSERT INTO yang menjelaskan dirinya sendiri. Nama tabel ditentukan pada baris kedua. Kata-kata di antara tanda kurung mewakili kolom di mana kita ingin memasukkan data. Pernyataan VALUES memberitahu database bahwa kita telah mendeklarasikan nama kolom dan saatnya menentukan nilainya. Ada sesuatu yang baru di sini: mysql_real_escape_string. Fungsi escapes special characters dalam string yang unescaped, sehingga aman untuk menempatkannya dalam query. Fungsi ini HARUS selalu digunakan, dengan sangat sedikit pengecualian. Ada terlalu banyak skrip yang tidak menggunakannya dan bisa di-hack dengan mudah. Jangan mengambil risiko, gunakan mysql_real_escape_string().

"Jangan pernah memasukkan password biasa seperti apa adanya. Anda HARUS mengenkripsinya."

Juga, Anda dapat melihat bahwa fungsi sha1() digunakan untuk mengenkripsi password pengguna. Ini juga hal yang sangat penting untuk diingat. Jangan pernah memasukkan password biasa seperti apa adanya. Anda HARUS mengenkripsinya. Bayangkan seorang hacker yang entah bagaimana berhasil mendapatkan akses ke database Anda. Jika dia melihat semua password teks biasa, dia bisa masuk ke akun (admin) yang dia inginkan. Jika kolom password mengandung string sha1 dia harus memecahkannya terlebih dahulu yang hampir tidak mungkin.

Catatan: ini juga memungkinkan menggunakan md5(), saya selalu menggunakan sha1() karena benchmark telah membuktikan bahwa ia sedikit lebih cepat, namun tidak banyak. Anda bisa mengganti sha1 dengan md5 jika Anda suka.

Jika proses pendaftaran berhasil, Anda harus melihat hal seperti ini:

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Coba refresh layar phpMyAdmin Anda, sebuah record baru harus terlihat di tabel users.

Langkah 6: Menambahkan Otentikasi dan Tingkat Pengguna

Aspek penting dari sebuah forum adalah perbedaan antara pengguna biasa dan admin/moderator. Karena ini adalah forum kecil dan menambahkan fitur seperti menambahkan moderator baru dan banyak hal akan memakan banyak waktu, kita akan fokus pada proses login dan membuat beberapa fitur admin seperti membuat kategori baru dan menutup sebuah thread.

Setelah menyelesaikan langkah sebelumnya, kita akan membuat akun yang baru dibuat menjadi akun admin. Di phpMyAdmin, klik tabel users, lalu 'Browse'. Akun Anda mungkin akan langsung muncul. Klik ikon edit dan ubah nilai field user_level dari 0 menjadi 1. Itu saja untuk saat ini. Anda tidak akan melihat adanya perbedaan dalam aplikasi kita dengan segera, namun saat kita menambahkan fitur admin, akun normal dan akun Anda akan memiliki kemampuan yang berbeda.

Proses sign-in bekerja dengan cara berikut:

  • Pengunjung memasukkan data pengguna dan mengirimkan form
  • Jika username dan password sudah benar, kita bisa memulai sebuah sesi
  • Jika username dan password salah, kita tampilkan form lagi dengan sebuah pesan
Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

File signin.php berada di bawah. Jangan berpikir saya tidak menjelaskan apa yang saya lakukan, tapi periksa komentar di file. Jauh lebih mudah untuk memahami seperti itu.

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
6

Ini adalah query yang ada di file signin.php:

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
7

Hal ini jelas kita perlu memeriksa untuk memberitahu jika kredensial disediakan milik pengguna yang ada. Banyak skrip mengambil password dari database dan membandingkannya menggunakan PHP. Jika kita melakukan ini secara langsung melalui SQL password akan disimpan dalam database sekali selama pendaftaran dan tidak pernah meninggalkan itu lagi. Hal ini lebih aman, karena semua tindakan nyata yang terjadi di lapisan database dan tidak di aplikasi kita.

Jika pengguna masuk berhasil, kami melakukan beberapa hal:

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
8

Pertama, kita menetapkan 'signed_in' $_SESSION var ke true, jadi kita dapat menggunakannya pada halaman lain untuk memastikan pengguna masuk. Kami juga menempatkan id pengguna dan pengguna dalam variabel $_SESSION untuk penggunaan pada halaman yang berbeda. Akhirnya, kami menampilkan link ke forum sekilas sehingga pengguna dapat mulai segera.

Tentu saja sign in membutuhkan fungsi lain, sign out! Proses sign-out sebenarnya jauh lebih mudah daripada proses sign-in. Karena semua informasi tentang pengguna disimpan dalam variabel $_SESSION, yang harus kita lakukan adalah unset mereka dan menampilkan pesan.

Setelah kita menetapkan variabel $_SESSION, kita dapat menentukan apakah seseorang masuk. Mari membuat perubahan sederhana terakhir ke header.php:

Menggantikan:

CREATE TABLE categories (
cat_id 		 	INT(8) NOT NULL AUTO_INCREMENT,
cat_name	 	VARCHAR(255) NOT NULL,
cat_description 	VARCHAR(255) NOT NULL,
UNIQUE INDEX cat_name_unique (cat_name),
PRIMARY KEY (cat_id)
) TYPE=INNODB;
9

Dengan:

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
0

Jika pengguna masuk, dia akan melihat namanya ditampilkan di halaman depan dengan link ke halaman keluar. Otentikasi kita sudah selesai! Sekarang forum kita akan terlihat seperti ini:

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Langkah 7: Membuat Kategori

Kita ingin membuat kategori, jadi mari kita mulai dengan membuat sebuah form.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
1

Langkah ini terlihat banyak seperti langkah 4 (sign up pengguna '), jadi saya tidak akan melakukan penjelasan mendalam di sini. Jika Anda mengikuti semua langkah yang Anda harus mampu memahami hal ini agak cepat.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
2

Seperti yang Anda lihat, kita telah memulai skrip dengan pemeriksaan $_SERVER, setelah memeriksa apakah pengguna memiliki hak admin, yang diperlukan untuk membuat kategori. Form akan ditampilkan jika belum dikirim. Jika sudah, nilainya akan disimpan. Sekali lagi, query SQL disiapkan dan kemudian dieksekusi.

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Langkah 8: Menambahkan Kategori ke index.php

Kami telah membuat beberapa kategori, sehingga sekarang kita dapat menampilkan mereka di halaman depan. Mari kita tambahkan query berikut untuk wilayah isi index.php.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
3

Query ini memilih semua kategori dan nama dan deskripsi mereka dari tabel categories. Kita hanya butuh sedikit PHP untuk menampilkan hasilnya. Jika kita menambahkan bagian itu seperti yang kita lakukan pada langkah sebelumnya, kode akan terlihat seperti ini.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
4

Perhatikan bagaimana kita menggunakan cat_id untuk membuat link ke category.php. Semua link ke halaman ini akan terlihat seperti ini: category.php?cat_id=x, dimana x bisa berupa nilai numerik. Ini mungkin baru bagi Anda. Kita bisa mengecek url dengan PHP untuk nilai $_GET. Misalnya, kita memiliki tautan ini:

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
5

Pernyataan itu meng-echo $_GET['cat_id']; akan menampilkan '23'. Dalam beberapa langkah berikutnya, kita akan menggunakan nilai ini untuk mengambil topik saat melihat satu kategori, namun topik tidak dapat dilihat jika kita belum membuatnya. Jadi mari kita membuat beberapa topik!

Langkah 9: Membuat sebuah Topik

Pada langkah ini, kita menggabungkan teknik yang telah kita pelajari di langkah sebelumnya. Kita memeriksa apakah pengguna masuk, kita akan menggunakan query input untuk membuat topik dan membuat beberapa form HTML dasar.

Struktur create_topic.php hampir tidak dapat dijelaskan dalam daftar atau sesuatu, jadi saya menuliskannya kembali dalam pseudo-code.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
6

Inilah kode sebenarnya dari bagian forum kita ini, periksa penjelasan di bawah kode untuk melihat apa yang dilakukannya.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
7

Saya akan membahas halaman ini dalam dua bagian, menunjukkan form-nya dan pengolahan form.

Menampilkan form-nya
Kita memulai dengan form HTML sederhana. Sebenarnya ada sesuatu yang istimewa di sini, karena kita menggunakan dropdown. Dropdown ini diisi dengan data dari database, dengan menggunakan query ini:

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
8

Itulah satu-satunya bagian yang berpotensi membingungkan di sini; ini hanyalah sepotong kode, seperti yang bisa Anda lihat saat melihat file create_topic.php di bagian bawah langkah ini.

Pengolahan form

Proses menyimpan topik terdiri dari dua bagian: menyimpan topik di tabel topics dan menyimpan posting pertama di tabel posts. Ini membutuhkan sesuatu yang cukup lanjut yang berjalan sedikit di luar cakupan tutorial ini. Ini disebut transaction, yang pada dasarnya berarti kita memulai dengan menjalankan perintah start dan kemudian rollback ketika ada kesalahan database dan komit saat semuanya berjalan dengan baik. Lebih lanjut tentang transactions.

CREATE TABLE topics (
topic_id		INT(8) NOT NULL AUTO_INCREMENT,
topic_subject  		VARCHAR(255) NOT NULL,
topic_date		DATETIME NOT NULL,
topic_cat		INT(8) NOT NULL,
topic_by		INT(8) NOT NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;
9

Query pertama yang digunakan untuk menyimpan data adalah query pembuatan topik, yang terlihat seperti ini:

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
0

Pada awalnya field didefinisikan, kemudian nilai yang akan dimasukkan. Kita pernah melihat yang pertama sebelumnya, itu hanya string yang dibuat aman dengan menggunakan mysql_real_escape_string(). Nilai kedua, NOW(), adalah fungsi SQL untuk waktu saat ini. Nilai ketiga, bagaimanapun, adalah nilai yang belum pernah kita lihat sebelumnya. Ini mengacu pada id (valid) dari sebuah kategori. Nilai terakhir mengacu pada user_id (yang ada), yaitu dalam hal ini, nilai $_SESSION['user_id']. Variabel ini dinyatakan selama proses sign-in.

Jika query dieksekusi tanpa kesalahan kita melanjutkan ke query kedua. Ingat kita masih melakukan transaction di sini. Jika kita memiliki kesalahan, kita akan menggunakan perintah ROLLBACK.

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
1

Hal pertama yang kita lakukan dalam kode ini adalah menggunakan mysql_insert_id() untuk mengambil id yang dihasilkan terbaru dari field topic_id di tabel topik. Seperti yang mungkin Anda ingat dari langkah pertama tutorial ini, id dihasilkan di database menggunakan auto_increment.

Kemudian posting tersebut dimasukkan ke dalam tabel posts. Query ini terlihat sangat mirip query topik. Satu-satunya perbedaan adalah bahwa posting ini mengacu pada topik dan topik yang mengacu ke kategori. Sejak awal, kita memutuskan untuk membuat model data yang bagus dan inilah hasilnya: struktur hirarkis yang bagus.

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Langkah 10: Tampilan Kategori

Kita akan membuat halaman ikhtisar untuk satu kategori. Kita baru saja membuat sebuah kategori, akan sangat berguna untuk dapat melihat semua topik di dalamnya. Pertama, buatlah halaman yang disebut category.php.

Daftar singkat hal-hal yang kita butuhkan:

Diperlukan untuk menampilkan kategori

  • cat_name
  • cat_description

Diperlukan untuk menampilkan semua topik

  • topic_id
  • topic_subject
  • topic_date
  • topic_cat

Mari membuat dua query SQL yang mengambil data persis ini dari database.

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
2

Query di atas memilih semua kategori dari database.

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
3

Query di atas dijalankan pada while loop dimana kita echo kategori. Dengan melakukannya dengan cara ini, kita akan melihat semua kategori dan topik terbaru untuk masing-masing.
Kode lengkap dari category.php akan sebagai berikut:

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
4

Dan inilah hasil akhir dari halaman kategori kita:

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Langkah 11: Tampilan Topik

Query SQL dalam langkah ini adalah yang rumit. Bagian PHP adalah semua hal yang pernah Anda lihat sebelumnya. Mari kita lihat query-nya. Yang pertama mengambil informasi dasar tentang topik ini:

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
5

Informasi ini ditampilkan di head tabel yang akan kita gunakan untuk menampilkan semua data. Selanjutnya, kita mengambil semua posting dalam topik ini dari database. Query berikut memberi kita apa yang kita butuhkan:

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
6

Kali ini, kita menginginkan informasi dari tabel users dan posts - jadi kita menggunakan LEFT JOIN lagi. Kondisinya adalah: id pengguna harus sama dengan field post_by. Dengan cara ini kita bisa menampilkan username dari pengguna yang membalas di setiap postingan.

Tampilan topik terakhir terlihat seperti ini:

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Langkah 12: Menambahkan Balasan

Mari membuat bagian terakhir dari forum ini, kemungkinan untuk menambahkan balasan. Kita akan mulai dengan membuat form:

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
7
Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Kode reply.php lengkap terlihat seperti ini.

CREATE TABLE posts (
post_id 		INT(8) NOT NULL AUTO_INCREMENT,
post_content		TEXT NOT NULL,
post_date 		DATETIME NOT NULL,
post_topic		INT(8) NOT NULL,
post_by		INT(8) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;
8

Komentar dalam kode cukup banyak terperinci apa yang terjadi. Kita memeriksa pengguna sebenarnya dan kemudian memasukkan posting ke database.

Source code forum diskusi dengan php
Source code forum diskusi dengan php
Source code forum diskusi dengan php

Menyelesaikan

Setelah Anda telah menyelesaikan tutorial ini, Anda seharusnya sudah memiliki pemahaman yang lebih baik tentang apa yang diperlukan untuk membangun sebuah forum. Saya harap penjelasan saya sudah cukup jelas! Terima kasih lagi untuk membaca.