Tuesday, December 27, 2016

Bab 10. PHP/MySQL Untuk Programer


Sistem Manajemen Konten






Dengan alasannya masing-masing, orang cenderung mudah bosan. Salah satu tugas Anda sebagai administrator dari sebuah situs web bukan hanya bagaimana mendapatkan sebanyak mungkin orang untuk mengunjungi web site Anda, tetapi juga berusaha agar mereka tetap selalu mengunjungi situs Anda.

Agar pengunjung nyaman di situs Anda, para ahli mengusulkan agar situs web Anda didesain untuk mudah dinavigasi, diakses dengan mudah. Situs web Anda juga sebaiknya memberikan pengalaman pribadi bagi penggunanya.

Konten yang Segar Memerlukan Kerja Keras
Ingat semua situs yang sering Anda kunjungi hampir setiap hari. Apa kesamaan dari semua situs tersebut? Sudah hampir pasti, tiap situs tersebut secara periodik diperbarui dengan informasi baru. Anda mungkin mengunjungi sebuah situs web setiap hari untuk melihat cuaca di daerah Anda atau untuk melihat berita nasional terbaru. Pada tiap situs tersebut, konten selalu diperbarui secara reguler, bisa mingguan, harian, dan kadangkala tiap jam. Sekarang, Anda bisa membayangkan berapa banyak pekerjaan dari para pengembang situs web tersebut untuk memperbarui kontennya setiap hari!

Apapun tujuan dari situs web Anda, yang biasa dimuatnya adalah berita, gambar, komentar pengguna, dan lainnya. Anda sendiri tidak mungkin bisa memperbarui semua konten situs tersebut. Situs Anda harus memiliki kemampuan untuk membagi beban pekerjaan tersebut kepada beberapa pihak lain.

Secara teori, yang harus dilakukan oleh para pengembang situs web adalah memperbarui desain dan kode situs. Sebagai contoh, memperbarui beberapa kode HTML, mengubah warna latar belakang, memperbarui kekurangan minor pada kode PHP Anda, dan seterusnya. Konten seutuhnya seharusnya terpisah dari desain situs sehingga konten dapat dilakukan oleh pihak lain. Karena pengelolaan konten terpisah dari desain, orang yang Anda utus untuk mengembangkan konten tidak perlu mengetahui apapun tentang perancangan web!

Tergantung dari banyaknya konten yang dimiliki situs Anda, pemuatan konten tersebut ke dalam situs Anda kemungkinan besar akan menyita waktu. Anda perlu sebuah cara untuk mengorganisirnya, mengkategorikannya, dan menempatkannya pada situs Anda. Anda mungkin memerlukan sejumlah orang, setiap orang tersebut memegang peranan tertentu, yang bekerja sama untuk menciptakan konten dan mempercantiknya sehingga menjadi sajian menarik.

Sistem Manajemen Konten
Anda telah belajar bagaimana menciptakan database dan tabel Anda sendiri, dan bagaimana menciptakan halaman-halaman web yang dipakai untuk mengelola informasi di dalamnya. Anad juga telah belajar bagaimana mengotentikasi pengguna situs Anda dengan mewajibkan mereka untuk melakukan login. Diperlengkapi dengan semua pengetahuan ini, Anda dapat dengan mudah menciptakan sebuah aplikasi sehingga pengguna dapat menciptakan konten baru (pengarang atau penulis), mengedit konten tersebut (editor), dan mempublikasikannya. Dengan menugaskan beberapa pengguna dengan peran masing-masing, Anda dapat mengendalikan siapa yang memiliki akses terhadap fungsi-fungsi tertentu di dalam situs. Dengan kata lain, Anda memerlukan sebuah sistem sehingga Anda dapat mengelola konten situs web Anda yang terpisah dari perancangan situs. Oleh karena itu, Anda memerlukan sebuah sistem manajemen konten (CMS, content management system).

Ada banyak tingkatan manejemen konten. Pada beberapa situs, hal ini berkaitan dengan papan pesan, dimana pengguna dapat mendaftar dan kemudian menuliskan pesannya kepada pengguna lain. Pada situs lain, hal ini berkaitan dengan laporan peliputan berita, penulisan cerita pendek, dan lainnya.

Seperti yang Anda ketahui, CMS tidak hanya berkaitan dengan bagaimana sebuah aplikasi dipakai untuk mengelola konten, tetapi ia juga berkaitan dengan penentuan siapa yang bertanggung jawab dalam pengembangan konten dan berkaitan pula dengan aturan-aturan yang harus dipatuhi. Adalah tanggung jawab Anda untuk mencari siapa yang bisa Anda percayai, buku ini hanya membantu Anda dalam menetapkan beberapa aturan dan dalam mengembangkan aplikasi.

Aturan
Aplikasi CMS yang akan Anda bangun pada bab ini akan memampukan para pengguna yang terdaftar untuk menampilkan artikel. Artikel tersebut akan diberi label “pending” sampai seorang pengguna dengan tingkat hak akses yang lebih tinggi mempublikasikannya. Begitu sebuah artikel dipublikasikan, konten tersebut akan ditampilkan sebagai artikel terbaru pada halaman rumah. Pengguna tak-terdaftar dapat membaca artikel tersebut, tetapi ia tidak dapat memposkan artikel. Pengguna terdaftar dapat pula memposkan komentarnya tentang artikel tertentu. Ketika seorang penjung situs web membaca/melihat artikel utuh, semua komentar akan ditampilkan di bawahnya.



Mempersiapkan Database
Hal pertama yang Anda perlukan adalah menciptakan skript yang akan membangun struktur database awal. Anda akan menggunakan file otorisasi_komik.inc.php dari beberapa bab sebelumnya untuk menetapkan koneksi ke database Anda.

Contoh
Menciptakan struktur database
1.     Tempatkan kode berikut dalam sebuah file dengan nama struktur_db.php, jalankan dengan browser Anda. File tersebut akan menciptakan tabel-tabel Anda dan menyisipkan seorang pengguna administratif sehingga Anda dapat mengelola situs.

<?php
require 'otorisasi_komik.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

$sql = 'CREATE TABLE IF NOT EXISTS level_akses_cms (
        level_akses TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
        nama_akses VARCHAR(50) NOT NULL DEFAULT "",

          PRIMARY KEY (level_akses)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

$sql = 'INSERT IGNORE INTO level_akses_cms
        (level_akses, nama_akses)
    VALUES
        (1, "User"),
        (2, "Moderator"),
        (3, "Administrator")';
mysql_query($sql, $db) or die(mysql_error($db));

$sql = 'CREATE TABLE IF NOT EXISTS pengguna_cms (
        id_user INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        email VARCHAR(100) NOT NULL UNIQUE,
        password CHAR(41) NOT NULL,
        nama VARCHAR(100) NOT NULL,
        level_akses TINYINT UNSIGNED NOT NULL DEFAULT 1,

          PRIMARY KEY (id_user)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

$sql = 'INSERT IGNORE INTO pengguna_cms
        (id_user, email, password, nama, level_akses)
    VALUES
        (NULL, "admin@contoh.com", PASSWORD("rahasia"), "Administrator", 3)';
mysql_query($sql, $db) or die(mysql_error($db));

$sql = 'CREATE TABLE IF NOT EXISTS artikel_cms (
        id_artikel INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        id_user INTEGER UNSIGNED NOT NULL,
        apa_dipublikasikan BOOLEAN NOT NULL DEFAULT FALSE,
        tanggal_submit DATETIME NOT NULL,
        tanggal_publish DATETIME,
        judul VARCHAR(255) NOT NULL,
        teks_artikel MEDIUMTEXT,

          PRIMARY KEY (id_artikel),
        FOREIGN KEY (id_user) REFERENCES pengguna_cms(id_user),
        INDEX (id_user, tanggal_submit),
        FULLTEXT INDEX (judul, teks_artikel)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

$sql = 'CREATE TABLE IF NOT EXISTS komentar_cms (
        id_komentar INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        id_artikel INTEGER UNSIGNED NOT NULL,
        id_user INTEGER UNSIGNED NOT NULL,
        tanggal_komentar DATETIME NOT NULL,
        teks_komentar MEDIUMTEXT,

          PRIMARY KEY (id_komentar),
        FOREIGN KEY (id_artikel) REFERENCES artikel_cms(id_artikel),
        FOREIGN KEY (id_user) REFERENCES pengguna_cms(id_user)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));
echo 'Sukses!';
?>

Dalam struktur_db.php, Anda menciptakan tabel yang diperlukan untuk level-level akses. Semua bidang, tipe datanya, dan parameter-parameter lain didefinisikan pada statemen SQL ini. Anda menggunakan IF NOT EXISTS sehingga perintah CREATE tidak melakukan apapun jika tabel telah ada sebelumnya.

$sql = 'CREATE TABLE IF NOT EXISTS akses_level_cms (
        akses_level TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
        nama_akses VARCHAR(50) NOT NULL DEFAULT "",

              PRIMARY KEY (akses_level)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

Statemen SQL berikutnya menyisipkan data ke dalam tabel akses_level_cms. Level-level akses dipakai pada aplikasi CMS untuk menentukan apa fungsionalitas yang dimiliki oleh tiap user.

$sql = 'INSERT IGNORE INTO akses_level_cms
        (akses_level, nama_akses)
    VALUES
        (1, "User"),
        (2, "Moderator"),
        (3, "Administrator")';
mysql_query($sql, $db) or die(mysql_error($db));

Ketika menciptakan tabel pengguna_cms, Anda menggunakan katakunci UNIQUE untuk menambahkan pengekang dalam memastikan bahwa setiap alamat email pengguna harus unik.

$sql = 'CREATE TABLE IF NOT EXISTS pengguna_cms (
        id_user INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        email VARCHAR(100) NOT NULL UNIQUE,
        password CHAR(41) NOT NULL,
        nama VARCHAR(100) NOT NULL,
        akses_level TINYINT UNSIGNED NOT NULL DEFAULT 1,

              PRIMARY KEY (id_user)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

Setelah Anda menciptakan tabel pengguna_cms, Anda menyisipkan satu rekaman sehingga Anda  memiliki akun administrator yang dapat melakukan login dengan segera. Akun ini diberikan hak akses administrator dan memampukan Anda untuk mengelola situs.

$sql = 'INSERT IGNORE INTO pengguna_cms
        (id_user, email, password, nama, akses_level)
    VALUES
        (NULL, "admin@contoh.com", PASSWORD("rahasia"), "Administrator", 3)';

Tabel artikel_cms akan menyimpan artikel-artikel yang diposkan oleh para pengguna terdaftar pada situs Anda:

$sql = 'CREATE TABLE IF NOT EXISTS artikel_cms (
        id_artikel INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        id_user INTEGER UNSIGNED NOT NULL,
        apa_dipublikasikan BOOLEAN NOT NULL DEFAULT FALSE,
        tanggal_submit DATETIME NOT NULL,
        tanggal_publish DATETIME,
        judul VARCHAR(255) NOT NULL,
        teks_artikel MEDIUMTEXT,

              PRIMARY KEY (id_artikel),
        FOREIGN KEY (id_user) REFERENCES pengguna_cms(id_user),
        INDEX (id_user, tanggal_submit),
        FULLTEXT INDEX (judul, teks_artikel)
    )
    ENGINE=MyISAM';
mysql_query($sql, $db) or die(mysql_error($db));

Pendaur-ulangan Kode
Semakin mahir Anda sebagai programer, Anda akan memerhatikan bagian-bagian kode yang sering berulang pada aplikasi Anda. Daripada harus mengetikkan kode secara berulang, Anda dapat menempatkan kode tersebut pada file terpisah dan kemudian mencantumkan file tersebut pada skript Anda. Pada aplikasi CMS, fungsionalitas inti yang sama dipakai pada banyak halaman yang berbeda. Adalah masuk akal bila menuliskan kode ini sebagai fungsi atau kelas pada file terpisah dan kemudian mencantumkannya di atas tiap skript ketika fungsionalitas tersebut diperlukan.

Contoh
Menciptakan skript yang akan didaur-ulang
1.     Masukkan kode berikut, dan simpan dengan nama fungsi_keluaran_cms.inc.php. File ini memuat fungsi-fungsi untuk menghasilkan elemen-elemen halaman yang berbeda pada aplikasi CMS Anda.

<?php
// Menghasilkan sebuah string yang dipotong pada jumlah karakter maksimum.
// Jika string telah dipotong, ia akan memiliki $ekot yang
// ditempelkan di belakangnya.

function potong_tubuh($teks, $panjang_maks = 500, $ekor = '...') {
    $pjg_ekor = strlen($ekor);
    if (strlen($teks) > $panjang_maks) {
        $tmp_teks = substr($teks, 0, $panjang_maks - $pjg_ekor);
        if (substr($teks, $panjang_maks - $pjg_ekor, 1) == ' ') {
            $teks = $tmp_teks;
        }
        else {
            $pos = strrpos($tmp_teks, ' ');
            $teks = substr($teks, 0, $pos);
        }
        $teks = $teks . $ekor;
    }
    return $teks;
}

// Menampilkan sebuah artikel dari database.
function tampil_cerita($db, $id_artikel, $hanya_preview = FALSE) {
    if (empty($id_artikel)) {
        return;
    }
    $sql = 'SELECT
            nama, apa_dipublikasikan, judul, teks_artikel,
            UNIX_TIMESTAMP(tanggal_submit) AS tanggal_submit,
            UNIX_TIMESTAMP(tanggal_publish) AS tanggal_publish
        FROM
            artikel_cms a JOIN pengguna_cms u ON a.id_user = u.id_user
        WHERE
            id_artikel = ' . $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
  
    if ($baris = mysql_fetch_assoc($hasil)) {
        extract($baris);
        echo '<h2>' . htmlspecialchars($judul) . '</h2>';
        echo '<p>Oleh: ' . htmlspecialchars($nama) . '</p>';
        echo '<p>';
        if ($baris['apa_dipublikasikan']) {
            echo date('F j, Y', $tanggal_publish);
        } else {
            echo 'Artikel belum dipublikasikan.';
        }
        echo '</p>';
        if ($hanya_preview) {
            echo '<p>' . nl2br(htmlspecialchars(potong_tubuh($teks_artikel))) .
                 '</p>';
            echo '<p><a href="lihat_artikel_cms.php?id_artikel=' . $id_artikel .
                 '"> Baca Semuanya </a></p>';
        } else {
            echo '<p>' . nl2br(htmlspecialchars($teks_artikel)) . '</p>';
        }
    }
    mysql_free_result($hasil);
}

function tampil_komentar($db, $id_artikel, $tampil_link = TRUE) {
    if (empty($id_artikel)) {
        return;
    }
    $sql = 'SELECT apa_dipublikasikan FROM artikel_cms WHERE id_artikel = ' .
    $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
    $baris = mysql_fetch_assoc($hasil);
    $apa_dipublikasikan = $baris['apa_dipublikasikan'];
    mysql_free_result($hasil);
  
    $sql = 'SELECT
            teks_komentar, UNIX_TIMESTAMP(tanggal_komentar) AS tanggal_komentar,
            nama, email
        FROM
            komentar_cms c LEFT OUTER JOIN pengguna_cms u ON c.id_user = u.id_user
        WHERE
            id_artikel = ' . $id_artikel . '
        ORDER BY
            tanggal_komentar DESC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

   if ($tampil_link) {
        echo '<h3> ' . mysql_num_bariss($hasil) . ' Komentar';
        if (isset($_SESSION['id_user']) and $apa_dipublikasikan) {
            echo ' - <a href="komentar_cms.php?id_artikel=' . $id_artikel .
                 '">Tambah satu</a>';
        }
        echo '</h3>';
    }

    if (mysql_num_rows($hasil)) {
        echo '<div>';
        while ($baris = mysql_fetch_array($hasil)) {
            extract($baris);
            echo '<span>' . htmlspecialchars($nama) . '</span>';
            echo '<span>(' . date('l F j, Y H:i', $tanggal_komentar) . ')
                  </span> ';
            echo '<p>' . nl2br(htmlspecialchars($teks_komentar)) . '</p>';
        }
        echo '</div>';
    }
    echo '<br>';
    mysql_free_result($hasil);
}
?>

2.    Tiga file lain yang akan dicantumkan pada beberapa skript: header_cms.inc.php, footer_cms.inc.php, dan fungsi_http_cms.inc.php akan memuat bagian bawah dan atas dari halaman, dan file cms_http.php akan memuat fungsi redireksi, yang dipakai untuk mengarahkan pengguna ke halaman lain.

<?php session_start(); ?>
<html>
  <head>
    <title> CMS </title>
    <style type="text/css">
    td { vertical-align: top; }
    </style>
  </head>
  <body>
    <h1> Apresiasi Buku Komik </h1>
<?php
if (isset($_SESSION['nama'])) {
    echo '<p> Anda sekarang login dengan username: ' . $_SESSION['nama'] . '</p>';
}
?>
    </div>
    <div id="navright">
      <form method="get" action="cari_cms.php">
    <div>
      <label for="search"> Cari </label>
<?php
echo '<input type="text" id="cari" name="cari" ';
if (isset($_GET['keywords'])) {
    echo ' value="' . htmlspecialchars($_GET['keywords']) . '" ';
}
echo '/>';
?>
         <input type="submit" value="Cari" / >
        </div>
      </form>
    </div>
    <div id='navigasi'>
      <a href="indeks_cms.php"> Artikel </a>
<?php
if (isset($_SESSION['id_user'])) {
    echo ' | <a href="komposisi_cms.php"> Komposisi </a>';
    if ($_SESSION['level_akses'] > 1) {
        echo ' | <a href="pending_cms.php"> Review </a>';
    }
    if ($_SESSION['level_akses'] > 2) {
        echo ' | <a href="admin_cms.php"> Admin </a>';
    }
    echo ' | <a href="cpanel_cms.php"> Control Panel </a> ';
    echo ' | <a href="pengguna_transaksi_cms.php?aksi=Logout"> Logout </a>';
} else {
    echo ' | <a href="login_cms.php"> Login </a>';
    }
?>
</div>
<div id="artikel">
Masukkan kode berikut, dan simpan dengan nama header_cms.inc.php:

3.    Dan sekarang masukkan footer_cms.inc.php:

    </div>
  </body>
</html>

4.    Terakhir, masukkan file fungsi_http_cms.inc.php:

<?php
function redireksi($url) {
    if (!headers_sent()) {
        header('Location: ' . $url);
    } else {
        die('Tidak bisa meredireksi; Keluaran telah dikirim ke browser.');
    }
}
?>

Banyak halaman di sini yang akan memerlukan pekerjaan pemrosesan yang sama secara berulang. Kode ini ditulis sebagai fungsi pendaur-ulang dan ditempatkan pada file fungsi_keluaran_cms.inc.php.

Jika sebuah artikel sangat panjang, maka Anda hanya akan menampilkan ringkasannya saja. Fungsi potong_tubuh() mengambil sebagian teks dan menghasilkan versi terpotong dari teks untuk ditampilkan pada sebuah halaman. Parameter pertama, $teks, merupakan teks yang akan Anda potong. Parameter kedua ($panjang_maks) adalah string teks terpanjang yang dapat dihasilkan, diekspresikan dalam jumlah karakter. Nilai defaultnya adalah 500 karakter, jika nilainya tidak ditetapkan. Terakhir, parameter ketiga ($ekor) merupakan karakter-karakter pengekor yang ditempatkan di akhir teks yang terpotong. Nilai defaultnya adalah sebuah elipsis (…).

function potong_tubuh($teks, $panjang_maks = 500, $ekor = '...') {
    $pjg_ekor = strlen($ekor);
    if (strlen($teks) > $panjang_maks) {
        $tmp_teks = substr($teks, 0, $panjang_maks - $pjg_ekor);
        if (substr($teks, $panjang_maks - $pjg_ekor, 1) == ' ') {
            $teks = $tmp_teks;
        }
        else {
            $pos = strrpos($tmp_teks, ' ');
            $teks = substr($teks, 0, $pos);
        }
        $teks = $teks . $ekor;
    }
    return $teks;
}

Fungsi potong_tubuh() menggunakan fungsi-fungsi built-in PHP seperti strlen(), substr(), dan strrpos() untuk melakukan beberapa kalkulasi terhadap teks yang masuk dan memotongnya menjadi sepanjang jumlah karakter maksimum. Fungsi strlen() menerima sebuah string dan menghasilkan panjangnya. Fungsi substr() menerima sebuah string, sebuah offset string, dan sebuah nilai panjang (parameter opsional) dan menghasilkan sebuah substring yang berawal di offset. Jika tidak ada parameter panjang yang dilewatkan, maka substr() akan menghasilkan karakter-karakter sampai di akhir string. Fungsi strrpos() menerima sebuah string dan sebuah karakter dan melakukan pencarian terhadap karakter tersebut, diawali dari akhir string, bergerak maju ke awal string, dan kemudian menghasilkan posisi dari kemunculan pertama dari karakter tersebut. Fungsi strrpos() adalah sepupu dari fungsi strpos(), yang melakukan hal yang sama, kecuali bahwa fungsi ini melakukan pencarian dimulai dari awal string.

// Menampilkan sebuah artikel dari database.
function tampil_cerita($db, $id_artikel, $hanya_preview = FALSE) {
    if (empty($id_artikel)) {
        return;
    }
    $sql = 'SELECT
            nama, apa_dipublikasikan, judul, teks_artikel,
            UNIX_TIMESTAMP(tanggal_submit) AS tanggal_submit,
            UNIX_TIMESTAMP(tanggal_publish) AS tanggal_publish
        FROM
            artikel_cms a JOIN pengguna_cms u ON a.id_user = u.id_user
        WHERE
            id_artikel = ' . $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
      
    if ($baris = mysql_fetch_assoc($hasil)) {
        extract($baris);
        echo '<h2>' . htmlspecialchars($judul) . '</h2>';
        echo '<p>Oleh: ' . htmlspecialchars($nama) . '</p>';
        echo '<p>';
        if ($baris['apa_dipublikasikan']) {
            echo date('F j, Y', $tanggal_publish);
        } else {
            echo 'Artikel belum dipublikasikan.';
        }
        echo '</p>';
        if ($hanya_preview) {
            echo '<p>' . nl2br(htmlspecialchars(potong_tubuh($teks_artikel))) .
                 '</p>';
            echo '<p><a href="lihat_artikel_cms.php?id_artikel=' . $id_artikel .
                 '"> Baca Semuanya </a></p>';
        } else {
            echo '<p>' . nl2br(htmlspecialchars($teks_artikel)) . '</p>';
        }
    }
    mysql_free_result($hasil);
}

Fungsi terakhir dalam fungsi_keluaran_cms.inc.php adalah tampil_komentar(). Sama seperti tampil_cerita(), tampil_komentar() menerima sebuah koneksi database yang terbuka dan ID artikel yang berkaitan dengan komentar yang akan ditampilkan.

function tampil_komentar($db, $id_artikel, $tampil_link = TRUE) {
    if (empty($id_artikel)) {
        return;
    }
    $sql = 'SELECT apa_dipublikasikan FROM artikel_cms WHERE id_artikel = ' .
    $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
    $baris = mysql_fetch_assoc($hasil);
    $apa_dipublikasikan = $baris['apa_dipublikasikan'];
    mysql_free_result($hasil);
      
    $sql = 'SELECT
            teks_komentar, UNIX_TIMESTAMP(tanggal_komentar) AS tanggal_komentar,
            nama, email
        FROM
            komentar_cms c LEFT OUTER JOIN pengguna_cms u ON c.id_user = u.id_user
        WHERE
            id_artikel = ' . $id_artikel . '
        ORDER BY
            tanggal_komentar DESC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

       if ($tampil_link) {
        echo '<h3> ' . mysql_num_bariss($hasil) . ' Komentar';
        if (isset($_SESSION['id_user']) and $apa_dipublikasikan) {
            echo ' - <a href="komentar_cms.php?id_artikel=' . $id_artikel .
                 '">Tambah satu</a>';
        }
        echo '</h3>';
    }

    if (mysql_num_rows($hasil)) {
        echo '<div>';
        while ($baris = mysql_fetch_array($hasil)) {
            extract($baris);
            echo '<span>' . htmlspecialchars($nama) . '</span>';
            echo '<span>(' . date('l F j, Y H:i', $tanggal_komentar) . ')
                  </span> ';
            echo '<p>' . nl2br(htmlspecialchars($teks_komentar)) . '</p>';
        }
        echo '</div>';
    }
    echo '<br>';
    mysql_free_result($hasil);
}

File fungsi_keluaran_cms.inc.php dicantumkan di atas setiap skript yang memerlukan salah satu fungsinya. Jika Anda ingin menambagkan fungsionalitas pada CMS Anda nantinya dan memerlukan kode pemroses yang sama pada beberapa tempat, maka Anda sebaiknya menempatkan kode logika ke dalam sebuah fungsi dan menempatkannya di dalam fungsi_keluaran_cms.inc.php.

Dua file lainnya dicantumkan pada tiap halaman yang menampilkan informasi pada web browser pengguna: header_cms.inc.php dan footer_cms.inc.php. Keduanya berperan sebagai kode HTML pembungkus. File header_cms.inc.php memuat porsi atas dari sebuah dokumen HTML, sedangkan file footer_cms.inc.php memuat porsi bawahnya. Ada hal yang perlu diperhatikan pada baris pertama dari header_cms.inc.php, yang memanggil session_start(). Anda pasti mengingat pada bab sebelumnya bahwa sesi dapat Anda pakai untuk menyimpan informasi yang bisa digunakan nantinya, pada halaman-halaman berikutnya. Jadi, adalah masuk akal bila sesi dipakai untuk menyimpan data login. Dengan session_start() di awal halaman Anda, Anda memiliki kemampuan dalam menetapkan dan membaca variabel-variabel $_SESSION.

Berikut merupakan contoh pertama dari variabel sesi. Ketika session_start() telah diinisialisasi, variabel $_SESSION[‘nama’] tersedia untuk Anda, sepanjang pengguna telah melakukan login. Jika isset($_SESSION[‘nama’]) bernilai TRUE, maka Anda mengetahui bahwa pengguna tidak melakukan login.

if (isset($_SESSION['nama'])) {
    echo '<p> Anda sekarang login dengan username: ' . $_SESSION['nama'] . '</p>';
}

Pada aplikasi CMS ini, ada tiga nilai yang Anda simpan sebagai variabel sesi: nama pengguna, id login, dan level akses. Anda menggunakan ketiga nilai ini untuk menentukan item-item menu mana yang akan ditampilkan. Berikut merupakan opsi-opsi menu dan siapa yang memiliki akses terhadapnya:

D       Artikel: Semua pengguna.
D       Komposisi: Semua pengguna yang telah melakukan login.
D       Review: Semua pengguna yang telah melakukan login dengan level akses 2 atau lebih.
D       Admin: pengguna yang telah melakukan login dengan level akses 3 atau lebih.
D       Control Panel: Semua pengguna yang telah melakukan login.
D       Logout: Semua pengguna yang telah melakukan login.
D       Login: Semua pengguna yang belum melakukan login.

Anda menghasilkan menu-menu dengan menguji apakah $_SESSION[‘id_user’] telah ditetapkan dan nilai $_SESSION[‘level_akses’].

    <div id='navigasi'>
      <a href="indeks_cms.php"> Artikel </a>
<?php
if (isset($_SESSION['id_user'])) {
    echo ' | <a href="komposisi_cms.php"> Komposisi </a>';
    if ($_SESSION['level_akses'] > 1) {
        echo ' | <a href="pending_cms.php"> Review </a>';
    }
    if ($_SESSION['level_akses'] > 2) {
        echo ' | <a href="admin_cms.php"> Admin </a>';
    }
    echo ' | <a href="cpanel_cms.php"> Control Panel </a> ';
    echo ' | <a href="transaksi_pengguna_cms.php?action=Logout"> Logout </a>';
} else {
    echo ' | <a href="login_cms.php"> Login </a>';
    }
?>
</div>

Terakhir, Anda menempatkan fungsi di dalam file fungsi_http_cms.inc.php, yang dipakai untuk meredireksi pengunjung ke halaman lain.

<?php
function redireksi($url) {
    if (!headers_sent()) {
        header('Location: ' . $url);
    } else {
        die('Tidak bisa meredireksi; Keluaran telah dikirim ke browser.');
    }
}
?>


Halaman Transaksi
Jadi, sekarang Anda memasuki jantung dari aplikasi Anda: halaman-halaman transaksi. Data akan ditangani oleh salah satu skript: transaksi_pengguna_cms.php atau transaksi_artikel_cms.php  ketika data diposkan dari sebuah form.

Contoh
Halaman transaksi
1.     Masukkan kode ini, dan simpan dengan nama transaksi_pengguna_cms.php:

<?php
require 'otorisasi_komik.inc.php';
require 'fungsi_http_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

if (isset($_REQUEST['aksi'])) {
    switch ($_REQUEST['aksi']) {
    case 'Login':
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $password = (isset($_POST['password'])) ? $_POST['password'] : '';
        $sql = 'SELECT
                id_user, level_akses, nama
            FROM
                pengguna_cms
            WHERE
                email = "' . mysql_real_escape_string($email, $db) . '" AND
                password = PASSWORD("' . mysql_real_escape_string($password,
                                $db) . '")';
        $hasil = mysql_query($sql, $db) or die(mysql_error($db));
        if (mysql_num_rows($hasil) > 0) {
            $baris = mysql_fetch_array($hasil);
            extract($baris);
            session_start();
            $_SESSION['id_user'] = $id_user;
            $_SESSION['level_akses'] = $level_akses;
            $_SESSION['nama'] = $nama;
        }
        mysql_free_result($hasil);
        redireksi('indeks_cms.php');
        break;

   case 'Logout':
        session_start();
        session_unset();
        session_destroy();
        redireksi('indeks_cms.php');
        break;

   case 'Ciptakan Akun':
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $password_1 = (isset($_POST['password_1'])) ? $_POST['password_1'] : '';
        $password_2 = (isset($_POST['password_2'])) ? $_POST['password_2'] : '';
        $password = ($password_1 == $password_2) ? $password_1 : '';
        if (!empty($nama) && !empty($email) && !empty($password)) {
            $sql = 'INSERT INTO pengguna_cms
                    (email, password, nama)
                VALUES
                    ("' . mysql_real_escape_string($email, $db) . '",
                      PASSWORD("' . mysql_real_escape_string($password, $db) . '"),
                      "' . mysql_real_escape_string($nama, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));

                 session_start();
            $_SESSION['id_user'] = mysql_insert_id($db);
            $_SESSION['level_akses'] = 1;
            $_SESSION['nama'] = $nama;
        }
        redireksi('indeks_cms.php');
        break;

   case 'Modifikasi Akun':
        $id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '';
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';
        $level_akses = (isset($_POST['level_akses'])) ? $_POST['level_akses'] : '';

          if (!empty($id_user) && !empty($nama) && !empty($email) &&
            !empty($level_akses) && !empty($id_user)) {
            $sql = 'UPDATE pengguna_cms SET
                    email = "' . mysql_real_escape_string($email, $db) . '",
                    nama = "' . mysql_real_escape_string($nama, $db) . '",
                    level_akses = "' . mysql_real_escape_string ($level_akses, $db) . '",
                WHERE
                    id_user = ' . $id_user;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('admin_cms.php');
        break;

   case 'Kirim Reminder!':
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        if (!empty($email)) {
            $sql = 'SELECT email FROM pengguna_cms WHERE email="' .
                mysql_real_escape_string($email, $db) . '"';
            $hasil = mysql_query($sql, $db) or die(mysql_error($db));

            if (mysql_num_rows($hasil) > 0) {
                $password = strtoupper(substr(sha1(time()), rand(0, 32), 8));
                $subjek = 'Reset password situs komik';
                $tubuh = 'Sepertinya Anda lupa password Anda?
                          Jangan khawatir. ' .
                          'Kami meresetnya untuk Anda!' . '\n\n';
                $tubuh .= 'Katakunci Anda yang baru adalah: ' . $password;
                mail($email, $subjek, $tubuh);
            }
            mysql_free_result($hasil);
        }
        redireksi('login_cms.php');
        break;

   case 'Ubah Info':
        session_start();
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';

          if (!empty($nama) && !empty($email) && !empty($_SESSION['id_user']))
        {
            $sql = 'UPDATE pengguna_cms SET
                    email = "' . mysql_real_escape_string($email, $db) . '",
                    nama = "' . mysql_real_escape_string($nama, $db) . '",
                WHERE
                    id_user = ' . $_SESSION['id_user'];
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('cpanel_cms.php');
        break;

   default:
        redireksi('indeks_cms.php');
    }
} else {
    redireksi('indeks_cms.php');
}
?>

Aplikasi ini perlu mengakss database dan mengarahkan pengguna ke beberapa halaman setelah menyelesaikan transaksi. Anda perlu mencantumkan otorisasi_komik.inc.php dan fungsi_http_cms.inc.php. Karena halaman transaksi tidak menampilkan apapun pada layar, Anda tidak perlu mencantumkan header_cms.inc.php, footer_cms.inc.php, dan fungsi_keluaran_cms.inc.php.

require 'otorisasi_komik.inc.php';
require 'fungsi_http_cms.inc.php';

Variabel $_REQUEST[‘aksi’] memuat nilai tombol yang Anda klik pada halaman sebelumnya, atau permintaan GET dalam URL (seperti ?aksi=hapus). Jika $_REQUEST[‘aksi’] kosong, maka Anda tidak melakukan transaksi apapun dan hanya mengarahkan pengguna ke halaman indeks_cms.php.

if (isset($_REQUEST[‘aksi’])) {
    ...
} else {
    redireksi(‘indeks_cms.php’);
}

Anda menggunakan statemen switch karena fleksibilitasnya. Jika Anda mengembangkan fungsionalitas dari CMS Anda, maka Anda dapat perlu menambahkan beberapa aksi lain di dalam transaksi_pengguna_cms.php. Dengan switch, hal itu lebih mudah dilakukan dengan menambahkan kondisi case yang baru.

switch ($_REQUEST[‘aksi’]) {
    ...
    default:
        redirect(‘indeks_cms.php’);
}

Kasus Login menangani pengguna yang melakukan login. Email dan password adalah apa yang Anda pakai untuk melakukan login pada aplikasi CMS ini. Jika keduanya tidak dilewatkan, maka pengguna tidak dibiarkan masuk ke situs. Alamat dan password difilter, dan kemudian pencarian terhadap rekaman yang cocok di dalam tabel pengguna_cms dilakukan. Jika kecocokan ditemukan, maka sesi dimulai, dan $_SESSION[‘id_user’], $_SESSION[‘nama’], dan $_SESSION[‘level_akses’] disimpan untuk membiarkan pengguna tersebut masuk.

case 'Login':
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $katakunci = (isset($_POST['katakunci'])) ? $_POST['katakunci'] : '';
        $sql = 'SELECT
                id_user, level_akses, nama
            FROM
                pengguna_cms
            WHERE
                email = "' . mysql_real_escape_string($email, $db) . '" AND
                katakunci = PASSWORD("' . mysql_real_escape_string($katakunci,
                                $db) . '")';
        $hasil = mysql_query($sql, $db) or die(mysql_error($db));
        if (mysql_num_rows($hasil) > 0) {
            $baris = mysql_fetch_array($hasil);
            extract($baris);
            session_start();
            $_SESSION['id_user'] = $id_user;
            $_SESSION['level_akses'] = $level_akses;
            $_SESSION['nama'] = $nama;
        }
        mysql_free_result($hasil);
        redireksi('indeks_cms.php');
        break;

Melakukan logout cukup sederhana. Jika tidak ada variabel sesi dengan id user, level akses, dan username, maka aplikasi mengetahui tidak ada pengguna yang melakukan login. Yang perlu Anda lakukan adalah membersihkan variabel sesi. Pertama, Anda menggunakan session_start() untuk memberitahu PHP bahwa Anda sedang mengakses variabel sesi. Kemudian, Anda membersihkan sesi dengan session_unset(), yang membersihkan semua variabel sesi, dan terakhir Anda menghancurkan sesi dengan session_destroy(), yang menghapus semua data yang terdaftar pada sebuah sesi. Semua data login harus dihapus setelah pemanggilan session_unset() dan session_destroy().

case 'Logout':
        session_start();
        session_unset();
        session_destroy();
        redireksi('indeks_cms.php');
        break;

Untuk menciptakan sebuah akun, semua bidang yang disyaratkan harus diisi, dan dua bidang password harus sesuai (pengguna sering juga diwajibkan untuk mengisi passwordnya dua kali ketika melakukan registrasi pada sebuah akun, untuk mencegah error, dan Anda melakukannya pada aplikasi CMS ini). Setelah nilai-nilai yang masuk difilter, jika segala sesuatunya berjalan dengan baik, maka Anda menciptakan rekaman pada tabel pengguna_cms, yang secara otomatis membiarkan pengguna masuk dengan menetapkan $_SESSION[‘id_user’], $_SESSION[‘nama’], dan $_SESSION[‘level_akses’], dan kemudian mengarahkan pengguna ke halaman indeks_cms.php.

case 'Ciptakan Akun':
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $katakunci_1 = (isset($_POST['katakunci_1'])) ? $_POST['katakunci_1'] : '';
        $katakunci_2 = (isset($_POST['katakunci_2'])) ? $_POST['katakunci_2'] : '';
        $katakunci = ($katakunci_1 == $katakunci_2) ? $katakunci_1 : '';
        if (!empty($nama) && !empty($email) && !empty($katakunci)) {
            $sql = 'INSERT INTO pengguna_cms
                    (email, katakunci, nama)
                VALUES
                    ("' . mysql_real_escape_string($email, $db) . '",
                      PASSWORD("' . mysql_real_escape_string($katakunci, $db) . '"),
                      "' . mysql_real_escape_string($nama, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));

                     session_start();
            $_SESSION['id_user'] = mysql_insert_id($db);
            $_SESSION['level_akses'] = 1;
            $_SESSION['nama'] = $nama;
        }
        redireksi('indeks_cms.php');
        break;

etika akun pengguna lain dimodifikasi oleh administrator, maka semua bidang harus memiliki data. Setelah melakukan pembaruan, administrator diarahkan ke halaman admin_cms.php.

case 'Modifikasi Akun':
        $id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '';
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';
        $level_akses = (isset($_POST['level_akses'])) ? $_POST['level_akses'] : '';

              if (!empty($id_user) && !empty($nama) && !empty($email) &&
            !empty($level_akses) && !empty($id_user)) {
            $sql = 'UPDATE pengguna_cms SET
                    email = "' . mysql_real_escape_string($email, $db) . '",
                    nama = "' . mysql_real_escape_string($nama, $db) . '",
                    level_akses = "' . mysql_real_escape_string ($level_akses, $db) . '",
                WHERE
                    id_user = ' . $id_user;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('admin_cms.php');
        break;

Jika pengguna lupa akan passwordnya sendiri, maka pengguna tersebut dapat memiliki password baru yang dihasilkan dan dikirim ke akun email yang terdaftar dalam sistem Di sini, Anda dianjurkan untuk mengirim email plainteks sederhana.

Anda memfilter alamat email yang masuk dan melakukan pencarian terhadap alamat tersebut di dalam database. Jika ditemukan, maka Anda mengetahui bahwa alamat tersebut merupakan alamat yang terdaftar. Kemudian Anda membangkitkan password acak, memasukkan subjek (judul) dan tubuh pesan email (termasuk password baru), dan mengirimkan. Diasumsikan bahwa pengguna akan menerima dan membaca password tersebut dan melakukan login.

case 'Kirim Reminder!':
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        if (!empty($email)) {
            $sql = 'SELECT email FROM pengguna_cms WHERE email="' .
                mysql_real_escape_string($email, $db) . '"';
            $hasil = mysql_query($sql, $db) or die(mysql_error($db));

            if (mysql_num_rows($hasil) > 0) {
                $katakunci = strtoupper(substr(sha1(time()), rand(0, 32), 8));
                $subjek = 'Reset katakunci situs komik';
                $tubuh = 'Sepertinya Anda lupa katakunci Anda?
                          Jangan khawatir. ' .
                          'Kami meresetnya untuk Anda!' . '\n\n';
                $tubuh .= 'Katakunci Anda yang baru adalah: ' . $katakunci;
                mail($email, $subjek, $tubuh);
            }
            mysql_free_result($hasil);
        }
        redireksi('login_cms.php');
        break;

Kode berikut tampak familiar. Kode tersebut sangat identik dengan kasus Modifikasi Akun, kecuali bahwa pengguna mengubah datanya sendiri. Oleh karena itu, level akses tidak ikut diperbarui.

case 'Ubah Info':
        session_start();
        $email = (isset($_POST['email'])) ? $_POST['email'] : '';
        $nama = (isset($_POST['nama'])) ? $_POST['nama'] : '';

              if (!empty($nama) && !empty($email) && !empty($_SESSION['id_user']))
        {
            $sql = 'UPDATE pengguna_cms SET
                    email = "' . mysql_real_escape_string($email, $db) . '",
                    nama = "' . mysql_real_escape_string($nama, $db) . '",
                WHERE
                    id_user = ' . $_SESSION['id_user'];
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('cpanel_cms.php');
        break;

Contoh
Transaksi artikel
1.     Masukkan kode berikut, dan namai dengan transaksi_artikel_cms.php:

<?php
require 'otorisasi_komik.inc.php';
require 'fungsi_http_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

if (isset($_REQUEST['aksi'])) {
    switch ($_REQUEST['aksi']) {
    case 'Submit Artikel Baru':
        $judul = (isset($_POST['judul'])) ? $_POST['judul'] : '';
        $teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '';

          if (isset($_SESSION['id_user']) && !empty($judul) && !empty($teks_artikel)) {
            $sql = 'INSERT INTO artikel_cms
                    (id_user, tanggal_submit, judul, teks_artikel)
                VALUES
                    (' . $_SESSION['id_user'] . ',
                     "' . date('Y-m-d H:i:s') . '",
                     "' . mysql_real_escape_string($judul, $db) . '",
                     "' . mysql_real_escape_string($teks_artikel, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('indeks_cms.php');
        break;

   case 'Edit':
        redireksi('komposisi_cms.php?aksi=edit & id_artikel=' . $_POST['id_artikel']);
        break;

   case 'Simpan Perubahan':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        $id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '';
        $judul = (isset($_POST['judul'])) ? $_POST['judul'] : '';
        $teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '';

          if (!empty($id_artikel) && !empty($judul) && !empty($teks_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    judul = "' . mysql_real_escape_string($judul, $db) . '",
                    teks_artikel = "' . mysql_real_escape_string($teks_artikel, $db) . '",
                    tanggal_submit = "' . date('Y-m-d H:i:s') . '"
                WHERE
                    id_artikel = ' . $id_artikel;

                 if (!empty($id_user)) {
                $sql .= ' AND id_user = ' . $id_user;
            }
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        if (empty($id_user)) {
            redireksi('pending_cms.php');
        } else {
            redireksi('cpanel_cms.php');
        }
        break;

   case 'Publish':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    apa_dipublikasikan = TRUE,
                    tanggal_publish = "' . date('Y-m-d H:i:s') . '"
                WHERE
                    id_artikel = ' . $id_artikel;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

   case 'Retraksi':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    apa_dipublikasikan = FALSE,
                    tanggal_publish = "0000-00-00 00:00:00"
                WHERE
                    id_artikel = ' . $id_artikel;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

   case 'Hapus':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'DELETE a, c FROM
                    artikel_cms a LEFT JOIN komentar_cms c ON
                    a.id_artikel = c.id_artikel
                WHERE
                    a.id_artikel = ' . $id_artikel . ' AND
                    apa_dipublikasikan = FALSE';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

   case 'Submit Komentar':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        $teks_komentar = (isset($_POST['teks_komentar'])) ?
        $_POST['teks_komentar'] : '';

          if (isset($_SESSION['id_user']) && !empty($id_artikel) && !empty($teks_komentar)) {
            $sql = 'INSERT INTO komentar_cms
                    (id_artikel, id_user, tanggal_komentar, teks_komentar)
                VALUES
                    (' . $id_artikel . ',
                     ' . $_SESSION['id_user'] . ',
                     "' . date('Y-m-d H:i:s') . '",
                     "' . mysql_real_escape_string($teks_komentar, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('lihat_artikel_cms.php?id_artikel=' . $id_artikel);
        break;

   default:
        redireksi('indeks_cms.php');
}
} else {
    redireksi('indeks_cms.php');
}
?>

Sama dengan transaksi_pengguna_cms.php, Anda memeriksa nilai dari $_REQUEST[‘aksi’] pada transaksi_artikel_cms.php untuk melihat apakah sebuah tombol ditekan atau sebuah aksi ditetapkan dalam URL, dan jika ya, maka Anda akan bertindak sesuai dengan salah satu cabang pada statemen switch. Pengguna akan diarahkan ke halaman indeks utama jika tidak ada aksi yang dilewatkan atau jika aksi tidak dikenali oleh transaksi_artikel_cms.php.

if (isset($_REQUEST[‘aksi’])) {
    switch ($_REQUEST[‘aksi’]) {
    ...
    default:
        redireksi(‘indeks_cms.php’);
    }
} else {
    redireksi(‘indeks_cms.php’);
}

Kasus pertama menangani penambahan sebuah artikel baru dalam database. Anda pertama-tama memastikan bahwa judul dan tubuh artikel keduanya dilewatkan ke skript dan bahwa pengguna telah melakukan login (diuji dengan keberadaan $_SESSION[‘id_user’]. Kemudian, Anda menyisipkan artikel ke dalam database, termasuk ID user untuk pengarang artikel dan tanggal untuk tanggal penyerahan artikel.

case 'Submit Artikel Baru':
        $judul = (isset($_POST['judul'])) ? $_POST['judul'] : '';
        $teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '';

              if (isset($_SESSION['id_user']) && !empty($judul) && !empty($teks_artikel)) {
            $sql = 'INSERT INTO artikel_cms
                    (id_user, tanggal_submit, judul, teks_artikel)
                VALUES
                    (' . $_SESSION['id_user'] . ',
                     "' . date('Y-m-d H:i:s') . '",
                     "' . mysql_real_escape_string($judul, $db) . '",
                     "' . mysql_real_escape_string($teks_artikel, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('indeks_cms.php');
        break;

Penanganan kasus Edit cukup sederhana. Halaman komposisi_cms.php digunakan untuk membaca artikel dan dimuat pada bidang judul dan bidang tubuh. Anda hanya perlu menempelkan aksi=edit and id_artikel=nn ke alamat.

case 'Edit':
        redireksi('komposisi_cms.php?aksi=edit & id_artikel=' . $_POST['id_artikel']);
        break;

Untuk menyimpan perubahan pada sebuah artikel, Anda membaca dan memfilter ID artikel, ID pengguna, judul dan tubuh artikel. Jika $id_user memiliki nilai, maka Anda mengetahui bahwa pengguna sedang mengedit dokumennya, dan Anda perlu menambahkan sebuah kondisi untuk mencocokkan ID dengan statemen SQL. Anda kemudian mengarahkan pengguna ke panel kontrol jika pengguna mengedit artikelnya atau ke halaman review jika pengguna adalah moderator yang mengedit artikel orang lain.

case 'Simpan Perubahan':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        $id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '';
        $judul = (isset($_POST['judul'])) ? $_POST['judul'] : '';
        $teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '';

              if (!empty($id_artikel) && !empty($judul) && !empty($teks_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    judul = "' . mysql_real_escape_string($judul, $db) . '",
                    teks_artikel = "' . mysql_real_escape_string($teks_artikel, $db) . '",
                    tanggal_submit = "' . date('Y-m-d H:i:s') . '"
                WHERE
                    id_artikel = ' . $id_artikel;

                     if (!empty($id_user)) {
                $sql .= ' AND id_user = ' . $id_user;
            }
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        if (empty($id_user)) {
            redireksi('pending_cms.php');
        } else {
            redireksi('cpanel_cms.php');
        }
        break;

Pada kasus Publish, Anda menerima dan memfilter ID artikel, dan kemudian memodifikasi rekaman dalam database untuk menetapkan status dan tanggal publikasi.

case 'Publish':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    apa_dipublikasikan = TRUE,
                    tanggal_publish = "' . date('Y-m-d H:i:s') . '"
                WHERE
                    id_artikel = ' . $id_artikel;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

Kasus Retraksi sebenarnya mirip dengan kasus Publish, hanya kali ini, setelah pemeriksan ID artikel, Anda menetapkan apa_dipublikasikan menjadi FALSE dan membersihkan bidang tanggal_publish. Retraksi di sini merupakan kasus untuk menetapkan status prapublikasi.

case 'Retraksi':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'UPDATE artikel_cms SET
                    apa_dipublikasikan = FALSE,
                    tanggal_publish = "0000-00-00 00:00:00"
                WHERE
                    id_artikel = ' . $id_artikel;
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

Untuk menghapus sebuah artikel, Anda memeriksa apakah ID artikel dilewatkan dan kemudian menggunakannya untuk menghapus rekaman yang sesuai. Anda menggunakan JOIN dalam query agar Anda dapat menghapus komentar yang diberikan pada artikel tersebut.

case 'Hapus':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        if (!empty($id_artikel)) {
            $sql = 'DELETE a, c FROM
                    artikel_cms a LEFT JOIN komentar_cms c ON
                    a.id_artikel = c.id_artikel
                WHERE
                    a.id_artikel = ' . $id_artikel . ' AND
                    apa_dipublikasikan = FALSE';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('pending_cms.php');
        break;

Kasus terakhir menangani penambahan komentar baru. Pada kasus Submit Komentar, Anda menyisipkan ID artikel, ID user, tanggal komentar ditulis, dan teks komentar. Setelah itu, Anda mengarahkan pengguna kembali ke artikel, sehingga ia dapat melihat komentar tersebut.

case 'Submit Komentar':
        $id_artikel = (isset($_POST['id_artikel'])) ? $_POST['id_artikel'] : '';
        $teks_komentar = (isset($_POST['teks_komentar'])) ?
        $_POST['teks_komentar'] : '';

              if (isset($_SESSION['id_user']) && !empty($id_artikel) && !empty($teks_komentar)) {
            $sql = 'INSERT INTO komentar_cms
                    (id_artikel, id_user, tanggal_komentar, teks_komentar)
                VALUES
                    (' . $id_artikel . ',
                     ' . $_SESSION['id_user'] . ',
                     "' . date('Y-m-d H:i:s') . '",
                     "' . mysql_real_escape_string($teks_komentar, $db) . '")';
            mysql_query($sql, $db) or die(mysql_error($db));
        }
        redireksi('lihat_artikel_cms.php?id_artikel=' . $id_artikel);
        break;

Fungsionalitas Umum
Skript pertama yang akan Anda kode berkaitan dengan aksi seorang pengguna ketika mengunjungi situs, melakukan login, meminta password baru, dan menciptakan akun baru.

Contoh
Tampilan indeks utama dan login
1.     Ciptakanlah file login_cms.php:

<?php include 'header_cms.inc.php'; ?>
<h1> Login Anggota </h1>
<form method="post" action="transaksi_pengguna_cms.php">
  <table>
    <tr>
      <td><label for="email"> Alamat Email: </label></td>
      <td><input type="text" id="email" name="email" maxlength="100"/></td>
    </tr><tr>
      <td><label for="password"> Password: </label></td>
      <td><input type="password" id="password" name="password" maxlength="20"/>
  </td>
    </tr><tr>
      <td></td>
      <td><input type="submit" name="aksi" value="Login"/></td>
    </tr>
  </table>
</form>
<p> Belum Anggota? <a href="akun_pengguna_cms.php"> Ciptakan akun baru!</a></p>
<p><a href="lupa_password_cms.php"> Lupa password Anda? </a></p>
<?php include 'footer_cms.inc.php';?>

2.    Selanjutnya, ciptakanlah file lupa_password_cms:

<?php include 'header_cms.inc.php'; ?>
<h1> Email Pengingat Passowrd </h1>
<p> Lupa password Anda? Masukkan alamat email Anda, dan kami akan
mengemailkan password baru pada Anda! </p>
<form method="post" action="transaksi_pengguna_cms.php">
  <div>
    <label for="email" > Email Address: </label>
    <input type="text" id="email" name="email" maxlength="100"/>
    <input type="submit" name="aksi" value="Send my reminder!"/>
  </div>
</form>
<?php include 'footer_cms.inc.php'; ?>

3.    Ciptakanlah indeks_cms.php berikut:

<?php
require 'otorisasi_komik.inc.php';
require 'fungsi_http_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

include 'header_cms.inc.php';

$sql = 'SELECT
        id_artikel
    FROM
        artikel_cms
    WHERE
        apa_dipublikasikan = TRUE
    ORDER BY
        tanggal_publish DESC';
$hasil = mysql_query($sql, $db);

if (mysql_num_rows($hasil) == 0) {
    echo '<p><strong> Sekarang, sedang tidak ada artikel. </strong></p>';
} else {
    while ($baris = mysql_fetch_array($hasil)) {
        tampil_cerita($db, $baris['id_artikel'], TRUE);
    }
}
mysql_free_result($hasil);
include 'footer_cms.inc.php';
?>

4.    Sekarang, jalankan indeks_cms.php dengan browser Anda. Tampilan menjadi seperti berikut:



5.    Klik pada link Login, dan halaman login_cms.php akan terbuka. Masukkan alamat email admin@contoh.com dan password rahasia, seperti yang Anda masukkan pada struktur database.



6.    Anda akan melihat tampilan berikut setelah memasukkan alamat email admin@contoh.com dan password rahasia, seperti yang Anda masukkan pada struktur database.




Contoh
Menciptakan akun
1.     Ciptakanlah file baru, dan simpanlah dengan nama akun_pengguna_cms.php:

<?php
require 'otorisasi_komik.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

$id_user = (isset($_GET['id_user']) && ctype_digit($_GET['id_user'])) ?
    $_GET['id_user'] : '';

if (empty($id_user)) {
    $nama = '';
    $email = '';
    $level_akses = '';
} else {
    $sql = 'SELECT
            nama, email, level_akses
        FROM
            pengguna_cms
        WHERE
            id_user=' . $id_user;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
    $baris = mysql_fetch_array($hasil);
    extract($baris);
    mysql_free_result($hasil);
}

include 'header_cms.inc.php';

if (empty($id_user)) {
    echo '<h1> Ciptakan Akun </h1>';
} else {
    echo '<h1> Modifikasi Akun </h1>';
}
?>
<form method="post" action="transaksi_pengguna_cms.php">
  <table>
    <tr>
      <td><label for="name"> Nama Penuh: </label></td>
      <td><input type="text" id="nama" name="nama" maxlength="100"
        value="<?php echo htmlspecialchars($nama);?>"/></td>
    </tr><tr>
      <td><label for="email"> Alamat Email: </label></td>
      <td><input type="text" id="email" name="email" maxlength="100"
        value="<?php echo htmlspecialchars($email);?>"/></td>
    </tr>
<?php
if (isset($_SESSION['level_akses']) && $_SESSION['level_akses'] == 3)
{
    echo '<tr><td> Level Akses </td><td>';
    $sql = 'SELECT
            level_akses, nama_akses
        FROM
            level_akses_cms
        ORDER BY
            level_akses DESC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

   while ($baris = mysql_fetch_array($hasil)) {
        echo '<input type="radio" id="akl_' . $baris['level_akses'] .
             '" nama="level_akses" value="' . $baris['level_akses'] . '"';
        if ($baris['level_akses'] == $level_akses) {
            echo 'checked="checked"';
        }
            echo '/><label for="akl_' . $baris['level_akses'] . '"> ' .
              $baris['nama_akses'] . '</label><br/>';
    }
    mysql_free_result($hasil);
    echo '</td></tr> ';
}
if (empty($id_user)) {
?>
    <tr>
      <td><label for="password_1" > Password: </label></td>
      <td><input type="password" id="password_1" name="password_1"
        maxlength="50"/>
      </td>
    </tr><tr>
      <td><label for="password_2" > Password (lagi): </label></td>
      <td><input type="password" id="password_2" name="password_2"
        maxlength="50"/>
      </td>
    </tr><tr>
      <td></td>
      <td>
        <input type="submit" name="aksi" value="Ciptakan Akun"/>
      </td>
    </tr>
<?php
} else {
?>
    <tr>
      <td></td>
      <td>
        <input type="hidden" name="id_user" value="<?php echo $id_user;?>"/>
        <input type="submit" name="aksi" value="Modifikasi Akun"/>
      </td>
    </tr>
<?php
}
?>
  </table >
</form >
<?php
include 'footer_cms.inc.php';
?>
2.  Jika Anda masih login, klik link Logout.
3.  Selanjutnya, klik Login, dan kemudian klik “Ciptakan akun baru!”. Kemudian Anda akan melihat tampilan berikut:




4.    Setelah Anda semua bidang yang disyaratkan, Anda akan otomatis login dan memiliki akun dalam database, seperti berikut:




Anda perlu membaca semua data untuk pengguna ini, jika ID user telah dilewatkan. Setelah pemilteran dan penugasan $_GET[‘id_user’] kepada $id_user, Anda memeriksa apakah $id_user kosong atau tidak. Jika kosong, maka ditampilkan form untuk menciptakan akun pengguna yang baru dan menginisialisasi variabel. Jika $id_user memuat ID user, maka Anda membaca informasi dari tabel pengguna_cms.

$id_user = (isset($_GET['id_user']) && ctype_digit($_GET['id_user'])) ?
    $_GET['id_user'] : '';

if (empty($id_user)) {
    $nama = '';
    $email = '';
    $level_akses = '';
} else {
    $sql = 'SELECT
            nama, email, level_akses
        FROM
            pengguna_cms
        WHERE
            id_user=' . $id_user;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));
    $baris = mysql_fetch_array($hasil);
    extract($baris);
    mysql_free_result($hasil);
}

Jika $id_user memiliki nilai, maka ini berarti seorang pengguna telah melakukan login, dan halaman ini memuat data terkini dari pengguna sehingga ia dapat memodifikasi akunnya.

if (empty($id_user)) {
    echo '<h1> Ciptakan Akun </h1>';
} else {
    echo '<h1> Modifikasi Akun </h1>';
}

Form memposkan datanya ke transaksi_pengguna_cms.php. Porsi pertama dari kode form merupakan standar kode HTML yang menampilkan bidang-bidang yang bercampur dengan kode PHP untuk menampilkan isi variabel-variabel yang menyimpan nilai-nilai bidang.

<form method="post" action="transaksi_pengguna_cms.php">
  <table>
    <tr>
      <td><label for="name"> Nama Penuh: </label></td>
      <td><input type="text" id="nama" name="nama" maxlength="100"
        value="<?php echo htmlspecialchars($nama);?>"/></td>
    </tr><tr>
      <td><label for="email"> Alamat Email: </label></td>
      <td><input type="text" id="email" name="email" maxlength="100"
        value="<?php echo htmlspecialchars($email);?>"/></td>
    </tr>

Jika pengguna telah melakukan login dan mengedit informasinya, dan jika ia memiliki hak administratif, maka Anda membangkitkan sebuah baris dalam tabel sehingga pengguna tersebut dapat mengubah hak-hak akses pengguna lain. Daftar hak akses dibaca dari tabel level_akses_cms, dan setiap hak akses ditampilkan sebagai tombol radio pada form.

if (isset($_SESSION['level_akses']) && $_SESSION['level_akses'] == 3)
{
    echo '<tr><td> Level Akses </td><td>';
    $sql = 'SELECT
            level_akses, nama_akses
        FROM
            level_akses_cms
        ORDER BY
            level_akses DESC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

       while ($baris = mysql_fetch_array($hasil)) {
        echo '<input type="radio" id="akl_' . $baris['level_akses'] .
             '" nama="level_akses" value="' . $baris['level_akses'] . '"';
        if ($baris['level_akses'] == $level_akses) {
            echo 'checked="checked"';
        }
            echo '/><label for="akl_' . $baris['level_akses'] . '"> ' .
              $baris['nama_akses'] . '</label><br/>';
    }
    mysql_free_result($hasil);
    echo '</td></tr> ';
}

Apa yang ditampilkan pada porsi terakhir pada form tergantung dari apakah pengguna menciptakan akun pengguna baru atau memperbarui informasinya yang telah ada. Jika pengguna menciptakan akun baru, maka bidang-bidang password akan ditunjukkan, dan tombol submit akan diberikan nilai “Ciptakan Akun”. Jika pengguna memperbarui informasinya, maka bidang masukan tersembunyi akan ditampilkan yang memuat id_user, dan tombol submit diberikan nilai “Modifikasi Akun”. File transaksi_pengguna_cms.php akan menggunakan nilai dari tombol submit untuk memutuskan kasus switch yang mana yang akan dijalankan.

if (empty($id_user)) {
?>
    <tr>
      <td><label for="password_1" > Password: </label></td>
      <td><input type="password" id="password_1" name="password_1"
        maxlength="50"/>
      </td>
    </tr><tr>
      <td><label for="password_2" > Password (lagi): </label></td>
      <td><input type="password" id="password_2" name="password_2"
        maxlength="50"/>
      </td>
    </tr><tr>
      <td></td>
      <td>
        <input type="submit" name="aksi" value="Ciptakan Akun"/>
      </td>
    </tr>
<?php
} else {
?>
    <tr>
      <td></td>
      <td>
        <input type="hidden" name="id_user" value="<?php echo $id_user;?>"/>
        <input type="submit" name="aksi" value="Modifikasi Akun"/>
      </td>
    </tr>
<?php
}
?>

Contoh
Halaman administratif
1.     Ciptakanlah admin_cms.php:

<?php
require 'otorisasi_komik.inc.php';
include 'header_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

$sql = 'SELECT
        level_akses, nama_akses
    FROM
        level_akses_cms
    ORDER BY
        nama_akses ASC';
$hasil = mysql_query($sql, $db) or die(mysql_error($db));

$hak_akses = array();
while ($baris = mysql_fetch_assoc($hasil)) {
    $hak_akses[$baris['level_akses']] = $baris['nama_akses'];
}
mysql_free_result($hasil);

echo '<h2> Administrasi Pengguna </h2>';
$limit = count($hak_akses);
for($i = 1; $i <= $limit; $i++) {
    echo '<h3>' . $hak_akses[$i] . '</h3>';
    $sql = 'SELECT
            id_user, nama
        FROM
            pengguna_cms
        WHERE
            level_akses = ' . $i . '
        ORDER BY
            nama ASC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

    if (mysql_num_rows($hasil) == 0) {
        echo '<p><strong> Tidak ada ' . $hak_akses[$i] . ' akun ' .
             'yang terdaftar. </strong></p>';
    } else {
        echo '<ul>';
        while ($baris = mysql_fetch_assoc($hasil)) {
            if ($_SESSION['id_user'] == $baris['id_user']) {
                echo '<li>' . htmlspecialchars($baris['nama']) . '</li>';
            } else {
                echo '<li><a href="akun_pengguna_cms.php?id_user=' .
                     $baris['id_user'] . '">' . htmlspecialchars($baris['nama']) .
                     '</a></li>';
            }
        }
        echo '</ul>';
    }
    mysql_free_result($hasil);
}
require 'footer_cms.inc.php';
?>

2.    Silahkan Anda melakukan logout, kemudian melakukan login kembali menggunakan akun admin. Ketika Anda login, klik link Admin. Anda akan melihat tampilan berikut:


Anda akan melihat pengguna Robert Tohonan Sianipar. Anda juga akan memperhatikan nama administrator di bawah Administrator, tetapi itu bukan link. Anda dapat mengubah akun Anda sendiri dari halaman Control Panel.



3.    Klik user di bawah User. Anda akan melihat tampilan berikut. Perhatikan bahwa Anda dapat mengubah nama pengguna dan passwordnya. Juga perhatikan opsi Level Akses. Anda dapat mengubah pengguna tertentu menjadi User, Moderator, atau Admin. User merupakan nilai default untuk pengguna baru.




Di awal skript, Anda melakukan query terhadap database untuk membaca daftar hak akses dari level_akses_cms. Nama dari tiap hak akses disimpan dalam $hak_akses, yaitu sebuah array yang menggunakan id numerik level_akses sebagai indeksnya. Anda juga membaca jumlah rekaman dengan fungsi mysql_num_rows() dan menyimpannya dalam $limit.

$sql = 'SELECT
        level_akses, nama_akses
    FROM
        level_akses_cms
    ORDER BY
        nama_akses ASC';
$hasil = mysql_query($sql, $db) or die(mysql_error($db));

$hak_akses = array();
while ($baris = mysql_fetch_assoc($hasil)) {
    $hak_akses[$baris['level_akses']] = $baris['nama_akses'];
}
mysql_free_result($hasil);

Anda menggunakan nilai $limit ketika Anda mulai beriterasi menjejah daftar hak akses. Perhatikan bahwa Anda memulai loop for dengan nilai awal 1, bukan 0. Array PHP umumnya diawali dengan indeks numerik 0, tetapi Anda menon-aktifkan watak ini dengan menugaskan indeks-indeks dengan id hak akses.

$limit = count($hak_akses);
for($i = 1; $i <= $limit; $i++) {
    echo '<h3>' . $hak_akses[$i] . '</h3>';
    $sql = 'SELECT
            id_user, nama
        FROM
            pengguna_cms
        WHERE
            level_akses = ' . $i . '
        ORDER BY
            nama ASC';
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

    if (mysql_num_rows($hasil) == 0) {
        echo '<p><strong> Tidak ada ' . $hak_akses[$i] . ' akun ' .
             'yang terdaftar. </strong></p>';
    } else {
        echo '<ul>';
        while ($baris = mysql_fetch_assoc($hasil)) {
            if ($_SESSION['id_user'] == $baris['id_user']) {
                echo '<li>' . htmlspecialchars($baris['nama']) . '</li>';
            } else {
                echo '<li><a href="akun_pengguna_cms.php?id_user=' .
                     $baris['id_user'] . '">' . htmlspecialchars($baris['nama']) .
                     '</a></li>';
            }
        }
        echo '</ul>';
    }
    mysql_free_result($hasil);



Contoh
Menciptakan artikel
1.     Ciptakanlah sebuah file baru, dan namai dengan komposisi_cms.php:

<?php
require 'otorisasi_komik.inc.php';
include 'header_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

$aksi = (isset($_GET['aksi'])) ? $_GET['aksi'] : '';
$id_artikel = (isset($_GET['id_artikel']) && ctype_digit($_GET['id_artikel'])) ?
    $_GET['id_artikel'] : '' ;
$judul = (isset($_POST['judul'])) ? $_POST['judul'] : '' ;
$teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '' ;
$id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '' ;

if ($aksi == 'edit' && !empty($id_artikel)) {
    $sql = 'SELECT
            judul, teks_artikel, id_user
        FROM
            artikel_cms
        WHERE
            id_artikel = ' . $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

   $baris = mysql_fetch_array($hasil);
    extract($baris);
    mysql_free_result($hasil);
}
?>
<h2> Komposisi Artikel </h2>
<form method="post" action="transaksi_artikel_cms.php">
  <table>
    <tr>
      <td><label for="judul"> Judul: </label></td>
      <td><input type="text" name="judul" id="judul" maxlength="255"
        value="<?php echo htmlspecialchars($judul);?>"/></td>
    </tr><tr>
      <td><label for="teks_artikel"> Teks: </label></td>
      <td><textarea name="teks_artikel" name="teks_artikel" rows="10"
        cols="60" ><?php echo htmlspecialchars($teks_artikel);?></textarea></td>
    </tr><tr>
      <td></td>
      <td>
<?php
if ($_SESSION['level_akses'] < 2) {
    echo '<input type="hidden" name="id_user" value="' . $id_user . '"/>';
}
if (empty($id_artikel)) {
    echo '<input type="submit" name="aksi" "value="Submit Artikel Baru"/>';
} else {
    echo '<input type="hidden" name="id_artikel" value="' . $id_artikel . '"/>';
    echo '<input type="submit" name="aksi" "value="Simpan Perubahan"/>';
}
?>
      </td>
    </tr>
  </table>
</form>
<?php
require_once 'footer_cms.inc.php';
?>

2.    Klik link Komposisi untuk menjalankan komposisi_cms.php, yang menampilkan berikut:





3.    Masukkan judul dan teks untuk artikel. Ketika selesai, klik Submit. Anda akan diarahkan ke halaman indeks kembali, tetapi tidak ada artikel yang ditampilkan; Artikel yang telah Anda tulis masih dalam status pending.

Anda telah menuliskan kode untuk komposisi_cms.php, halaman dimana Anda dan pengguna situs dapat menuliskan artikel baru. Pertama-tama, Anda menerima dan memfilter nilai-nilai yang masuk:

$aksi = (isset($_GET['aksi'])) ? $_GET['aksi'] : '';
$id_artikel = (isset($_GET['id_artikel']) && ctype_digit($_GET['id_artikel'])) ?
    $_GET['id_artikel'] : '' ;
$judul = (isset($_POST['judul'])) ? $_POST['judul'] : '' ;
$teks_artikel = (isset($_POST['teks_artikel'])) ? $_POST['teks_artikel'] : '' ;
$id_user = (isset($_POST['id_user'])) ? $_POST['id_user'] : '' ;

Jika pengguna mengedit artikel, aksi=edit dan id artikel  dilewatkan dalam string URL, maka $aksi akan memuat nilai ‘edit’, dan $id_artikel akan memuat ID dari artikel. Anda bisa membaca artikel yang ada dari tabel artikel_cms.

if ($aksi == 'edit' && !empty($id_artikel)) {
    $sql = 'SELECT
            judul, teks_artikel, id_user
        FROM
            artikel_cms
        WHERE
            id_artikel = ' . $id_artikel;
    $hasil = mysql_query($sql, $db) or die(mysql_error($db));

       $baris = mysql_fetch_array($hasil);
    extract($baris);
    mysql_free_result($hasil);
}

Kemudian Anda menampilkan form yang digunakan untuk menulis atau mengedit artikel. Di akhir form, Anda memeriksa nilai dari $_SESSION[‘level_akses’] dan mencantumkan bidang tersembunyi dengan ID pegguna, jika level akses kurang dari 2 (pengguna biasa). Selain itu, Anda juga menampilkan tombol submit dan id_artikel jika artikel terkait sedang diedit atau jika artikel merupakan artikel baru.

<h2> Komposisi Artikel </h2>
<form method="post" action="transaksi_artikel_cms.php">
  <table>
    <tr>
      <td><label for="judul"> Judul: </label></td>
      <td><input type="text" name="judul" id="judul" maxlength="255"
        value="<?php echo htmlspecialchars($judul);?>"/></td>
    </tr><tr>
      <td><label for="teks_artikel"> Teks: </label></td>
      <td><textarea name="teks_artikel" name="teks_artikel" bariss="10"
        cols="60" ><?php echo htmlspecialchars($teks_artikel);?></textarea></td>
    </tr><tr>
      <td></td>
      <td>
<?php
if ($_SESSION['level_akses'] < 2) {
    echo '<input type="hidden" name="id_user" value="' . $id_user . '"/>';
}
if (empty($id_artikel)) {
    echo '<input type="submit" name="aksi" "value="Submit Artikel Baru"/>';
} else {
    echo '<input type="hidden" name="id_artikel" value="' . $id_artikel . '"/>';
    echo '<input type="submit" name="aksi" "value="Simpan Perubahan"/>';
}
?>
      </td>
    </tr>
  </table>
</form>
<?php
require_once 'footer_cms.inc.php';
?>

Contoh
Mereview artikel baru
1.     Tuliskanlah kode ke dalam file pending_cms.php berikut:

<?php
require 'otorisasi_komik.inc.php';
include 'header_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

echo '<h2> Ketersediaan Artikel </h2>';
echo '<h3> Artikel-Artikel yang Dipending </h3>';
$sql = 'SELECT
        id_artikel, judul, UNIX_TIMESTAMP(tanggal_submit) AS tanggal_submit
    FROM
        artikel_cms
    WHERE
        apa_dipublikasikan = FALSE
    ORDER BY
        judul ASC';
$hasil = mysql_query($sql, $db) or die(mysql_error($db));

if (mysql_num_rows($hasil) == 0) {
    echo '<p><strong> Tidak ada artikel yang tersedia. </strong></p>';
} else {
    echo '<ul>';
    while ($baris = mysql_fetch_array($hasil)) {
        echo '<li><a href="review_artikel_cms.php?id_artikel=' .
            $baris['id_artikel'] . '" > ' . htmlspecialchars($baris['judul']) .
            '</a>(' . date('F j, Y', $baris['tanggal_submit']) . ')</li>';
    }
    echo '</ul>';
}
mysql_free_result($hasil);

echo '<h3> Artikel-Artikel yang Dipublikasikan </h3>';
$sql = 'SELECT
        id_artikel, judul, UNIX_TIMESTAMP(tanggal_publish) AS tanggal_publish
    FROM
        artikel_cms
    WHERE
        apa_dipublikasikan = TRUE
    ORDER BY
        judul ASC';
$hasil = mysql_query($sql, $db) or die(mysql_error($db));

if (mysql_num_rows($hasil) == 0) {
    echo '<p><strong> Tidak ada artikel yang tersedia. </strong></p>';
} else {
    echo '<ul>';
    while ($baris = mysql_fetch_array($hasil)) {
        echo '<li><a href="review_artikel_cms.php?id_artikel=' .
             $baris['id_artikel'] . '" > ' . htmlspecialchars($baris['judul']) .
             '</a> (' . date('F j, Y', $baris['tanggal_publish']) . ')</li>';
    }
    echo '</ul>';
}
mysql_free_result($hasil);

include 'footer_cms.inc.php';
?>

2.    Selanjutnya, tuliskan kode pada file review_artikel_cms.php berikut:

<?php
require 'otorisasi_komik.inc.php';
require 'fungsi_keluaran_cms.inc.php';
include 'header_cms.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
    die ('Tidak bisa terhubung. Periksa parameter-parameter koneksi.');
  
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));

$id_artikel = (isset($_GET['id_artikel']) && ctype_digit($_GET['id_artikel'])) ?
    $_GET['id_artikel'] : '';
  
echo '<h2> Review Artikel </h2>';
tampil_cerita($db, $id_artikel);
$sql = 'SELECT
        apa_dipublikasikan, UNIX_TIMESTAMP(tanggal_publish) AS tanggal_publish,
        level_akses
    FROM
        artikel_cms a INNER JOIN pengguna_cms u ON a.id_user = u.id_user
    WHERE
        id_artikel = ' . $id_artikel;
$hasil = mysql_query($sql, $db) or die(mysql_error());

$baris = mysql_fetch_array($hasil);
extract($baris);
mysql_free_result($hasil);

if (!empty($tanggal_dipublikasikan) and $apa_dipublikasikan) {
    echo '<h4> Dipublikasikan: ' . date('l F j, Y H:i', $tanggal_dipublikasikan) . '</h4>';
}
?>
<form method="post" action="transaksi_artikel_cms.php">
  <div>
    <input type="submit" name="aksi" value="Edit"/>
<?php
if ($level_akses > 1 || $_SESSION['level_akses'] > 1) {
    if ($apa_dipublikasikan) {
        echo '<input type="submit" name="aksi" value="Retraksi"/>';
    } else {
        echo '<input type="submit" name="aksi" value="Publish"/>';
        echo '<input type="submit" name="aksi" value="Hapus"/>';
    }
}
?>
    <input type="hidden" name="id_artikel" value="<?php echo $id_artikel;?>"/>
  </div>
</form>
<?php
include 'footer_cms.inc.php';
?>