Sunday, January 8, 2017

Bab 12. PHP/MySQL Untuk Pemula


Aplikasi Database Pada Web



Membuat File Header
Buka kembali file header.html pada editor teks Anda. Lakukan beberapa modifikasi pada sejumlah link, sebagai berikut:

<!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">
 <head>
  <title><?php echo $judul_halaman;?></title>
  <link rel="stylesheet" href="includes/style.css" type="text/css" media="screen" />
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
  <div id="header">
    <h1>Situs Web Anda</h1>
    <h2>Slogan hidup...</h2>
  </div>
 
  <div id="navigasi">
  <ul>
    <li><a href="indeks.php">Halaman Rumah</a></li>
      <li><a href="lihat_pengguna.php">Lihat Pengguna</a></li>
    <li><a href="registrasi_pengguna.php">Registrasi</a></li>
    <li><a href="password.php">Ubah Password</a></li>
    <li><a href="#">link lima</a></li>
  </ul>
  </div>
 
<div id="isi"><!-- Awal dari isi halaman spesifik. -->

<!-- header.html -->
 
File indeks.php sama seperti sebelumnya, sebagai berikut:

<?php # indeks.php
$judul_halaman = 'Selamat Datang ke Situs ini!';
include ('C:\wamp\www\header.html');
?>

<h1>Isi Header</h1>

    <p>Ini merupakan isi dari halaman spesifik. Bagian ini, dan header terkait
       akan berubah dari satu halaman ke halaman lainnya.</p>

    <p>Volutpat at varius sed sollicitudin et, arcu. Vivamus viverra. Nullam turpis. Vestibulum
       sed etiam. Lorem ipsum sit amet dolore. Nulla facilisi. Sed tortor. Aenean felis.
       Quisque eros. Cras lobortis commodo metus. Vestibulum vel purus. In eget odio in sapien
       adipiscing blandit. Quisque augue tortor, facilisis sit amet, aliquam, suscipit vitae,
       cursus sed, arcu lorem ipsum dolor sit amet.</p>

<?php
include ('C:\wamp\www\footer.html');
?> 

Dan file footer.html sama seperti sebelumnya, sebagai berikut:

<!-- footer.html -->
<!-- Akhir dari isi halaman spesifik. --></div>

<div id="footer">
  <p>Copyright &copy; <a href="#">Plain and Simple</a> 2007 | Didesain oleh <a href="http://
  www.edg3.co.uk/">edg3.co.uk</a> | Disponsori oleh <a href="http://www.opendesigns.org/">Desain
  terbuka</a> | Valid <a href="http://jigsaw.w3.org/css-validator/">CSS</a> &amp; <a
  href="http://validator.w3.org/">XHTML</a></p>
</div>

</body>
</html>

Kemudian, Anda perlu menjalankan indeks.php pada web browser untuk memastikan hasil yang telah diperoleh, sebagai berikut:






Koneksi Ke MySQL
Berikut merupakan skrip untuk melakukan koneksi ke MySQL. Anda menyimpan file tersebut dengan nama koneksi_mysqli.php.

<?php # koneksi_mysqli.php.php
// File ini memuat informasi akses database.
// File ini juga menetapkan koneksi ke MySQL
// dan memilih database.

// Menetapkan informasi akses database sebagai konstanta
DEFINE ('DB_USER', 'rismon');
DEFINE ('DB_PASSWORD', 'Dolokulu77');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'namasitus');

// Melakukan koneksi
$dbc = @mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
OR die ('Tidak dapat terkoneksi ke MySQL: ' . mysqli_connect_error() );
?>


Mengeksekusi Query Sederhana
Berikut merupakan skrip untuk melakukan query sederhana untuk menambahkan rekaman pada database. Simpan file tersebut dengan nama registrasi_pengguna.php. Berikut merupakan tampilan ketika file tersebut dijalankan:




<?php # registrasi_pengguna.php

$judul_halaman = 'Registrasi';
include ('C:\wamp\www\header.html');

// Memeriksa apakah form telah disubmit
if (isset($_POST['submitted'])) {
    $arrayError = array(); // Menginisialisasi sebuah array error

    // Memeriksa nama depan
    if (empty($_POST['nama_depan'])) {
        $arrayError[] = 'Anda lupa memasukkan nama depan Anda.';
    } else {
        $fn = trim($_POST['nama_depan']);
    }

    // Memeriksa nama belakang
    if (empty($_POST['nama_belakang'])) {
        $arrayError[] = 'Anda lupa memasukkan nama belakang Anda.';
    } else {
        $ln = trim($_POST['nama_belakang']);
    }

    // Memeriksa alamat email
    if (empty($_POST['email'])) {
        $arrayError[] = 'Anda lupa memasukkan alamat email Anda.';
    } else {
        $e = trim($_POST['email']);
    }

    // Memeriksa password dan kecocokannya
    if (!empty($_POST['pass1'])) {
        if ($_POST['pass1'] != $_POST['pass2']) {
            $arrayError[] = 'Password Anda tidak cocok.';
        } else {
            $p = trim($_POST['pass1']);
        }
    } else {
        $arrayError[] = 'Anda lupa memasukkan password Anda.';
    }

    if (empty($arrayError)) { // Semuanya berjalan OK

    // Registrasi pengguna dalam database...

    require_once('C:\wamp\www\koneksi_mysqli.php'); // Koneksi ke database

    // Melakukan query
    $q = "INSERT INTO pengguna (nama_depan, nama_belakang, email, pass, tanggal_registrasi)
          VALUES ('$fn', '$ln', '$e', SHA1('$p'), NOW() )";
    $r = @mysqli_query ($dbc, $q); // Jalankan query
   
      if ($r) { // Jika OK
        // Tampilkan sebuah pesan
        echo '<h1>Terimakasih!</h1>
              <p>Anda sekarang terdaftar!</p><p><br /></p>';

    } else { // Jika tidak OK
        // Tampilkan pesan
        echo '<h1>Sistem Error/h1>
              <p class="error">Anda tidak dapat terdaftar
              karena adanya gangguan sistem.
              Mohon maaf atas ketidak-nyamanan ini.</p>';

        // Pesan debugging:
        echo '<p>' . mysqli_error($dbc) . '<br /><br />Query: ' . $q . '</p>';
    } // Akhir dari IF

    mysqli_close($dbc); // Menutup koneksi database

    // Mencantumkan footer dan keluar dari skrip
    include ('C:\wamp\www\footer.html');
    exit();

    } else { // Laporkan arrayError.
        echo '<h1>Error!</h1>
              <p class="error">Terjadi error berikut:<br />';

        foreach ($arrayError as $msg) { // Tampilkan tiap error
            echo " - $msg<br />\n";
        }

        echo '</p><p>Silahkan coba kembali.</p><p><br /></p>';

    } // Akhir IF.
} // Akhir dari submit kondisional
?>

<h1>Register</h1>
<form action="registrasi_pengguna.php" method="post">
  <p>Nama Depan: <input type="text" name="nama_depan" size="15"
    maxlength="20" value="<?php if (isset($_POST['nama_depan']))
      echo $_POST['nama_depan']; ?>" /></p>
     
  <p>Nama Belakang: <input type="text" name="nama_belakang" size="15"
    maxlength="40" value="<?php if (isset($_POST['nama_belakang']))
    echo $_POST['nama_belakang']; ?>" /></p>

  <p>Alamat Email: <input type="text" name="email" size="20" maxlength="80"
    value="<?php if (isset($_POST['email']))
    echo $_POST['email']; ?>" /> </p>

  <p>Password: <input type="password" name="pass1" size="10"
    maxlength="20" /></p>

  <p>Konfirmasi Password: <input type="password" name="pass2" size="10"
    maxlength="20" /></p> <p><input type="submit" name="submit"
    value="Register" /></p><input type="hidden" name="submitted"
    value="TRUE" />
</form>

<?php
 include ('C:\wamp\www\footer.html');
?>


Membaca Hasil Query
Berikut merupakan skrip untuk membaca hasil query. Simpan file tersebut dengan nama lihat_pengguna.php.

<?php # lihat_pengguna.php
// Skrip ini membaca semua rekaman
// dari tabel pengguna.

$judul_halaman = Registrasi;
include ('C:\wamp\www\header.html');

// Header halaman:
echo '<h1>Daftar Pengguna yang Terdaftar</h1>';

// Koneksi ke database
require_once ('C:\wamp\www\koneksi_mysqli.php');

// Melakukan query
$q = "SELECT CONCAT(nama_belakang, ', ', nama_depan) AS nama,
    DATE_FORMAT(tanggal_registrasi, '%M %d,%Y') AS dr
      FROM pengguna ORDER BY tanggal_registrasi ASC";
$r = @mysqli_query ($dbc, $q); // Jalankan query

if ($r) { // Jika berjalan Ok, tampilkan rekaman
    // Header tabel
    echo '<table align="center" cellspacing="3" cellpadding="3" width="75%">
          <tr><td align="left"><b>Name</b></td><td align="left"><b>
          Tanggal terdaftar</b></td></tr>';

    // Menampilkan semua rekaman
    while ($baris = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
        echo '<tr><td align="left">' . $baris['nama'] . '</td><td align="left">'
        . $baris['dr'] . '</td></tr>';
    }
    echo '</table>'; // Menutup tabel

    mysqli_free_result ($r); // Membebaskan sumber-daya

} else { // Jika tidak berjalan OK
    // Tampilkan pesan
    echo '<p class="error">Daftar pengguna tidak dapat dibaca. Mohon maaf
          atas ketidak-nyamanan ini.</p>';

    // Pesan debugging
    echo '<p>' . mysqli_error($dbc) . '<br/><br />Query: ' . $q . '</p>';

} // Akhir dari IF.

mysqli_close($dbc); // Menutup koneksi ke database

include ('C:\wamp\www\footer.html');
?>





Memastikan Keamanan SQL
Keamanan database bertujuan untuk:
1. Melindungi informasi akses MySQL.
2. Tidak terlalu banyak menyingkapkan informasi tentang database.
3. Hati-hati ketika menjalankan query khususnya yang terkait dengan data yang disubmit oleh pengguna.

Buka kembali file registrasi_pengguna.php pada editor teks Anda. Pindahkan inklusi dari file koneksi_mysqli ke tepat setelah kondisional utama. Karena fungsi mysqli_real_escape_string() memerlukan koneksi database, maka skrip koneksi_mysqli.php diperlukan di awal skrip.

<?php # registrasi_pengguna.php

$judul_halaman = 'Register';
include ('C:\wamp\www\header.html');

// Memeriksa apakah form telah disubmit
if (isset($_POST['submitted'])) {
    require_once('C:\wamp\www\koneksi_mysqli.php'); // Koneksi ke database
     
    $arrayError = array(); // Menginisialisasi sebuah array error

    // Memeriksa nama depan
    if (empty($_POST['nama_depan'])) {
        $arrayError[] = 'Anda lupa memasukkan nama depan Anda.';
    } else {
        $fn = mysqli_real_escape_string($dbc, trim($_POST['nama_depan']));
    }

    // Memeriksa nama belakang
    if (empty($_POST['nama_belakang'])) {
        $arrayError[] = 'Anda lupa memasukkan nama belakang Anda.';
    } else {
        $ln = mysqli_real_escape_string($dbc, trim($_POST['nama_belakang']));
    }

    // Memeriksa alamat email
    if (empty($_POST['email'])) {
        $arrayError[] = 'Anda lupa memasukkan alamat email Anda.';
    } else {
        $e = mysqli_real_escape_string($dbc, trim($_POST['email']));
    }

    // Memeriksa password dan kecocokannya
    if (!empty($_POST['pass1'])) {
        if ($_POST['pass1'] != $_POST['pass2']) {
            $arrayError[] = 'Password Anda tidak cocok.';
        } else {
            $p = mysqli_real_escape_string($dbc, trim($_POST['pass1']));
        }
    } else {
        $arrayError[] = 'Anda lupa memasukkan password Anda.';
    }

    if (empty($arrayError)) { // Semuanya berjalan OK

    // Registrasi pengguna dalam database...

    // Melakukan query
    $q = "INSERT INTO pengguna (nama_depan, nama_belakang, email, pass, tanggal_registrasi)
          VALUES ('$fn', '$ln', '$e', SHA1('$p'), NOW() )";
    $r = @mysqli_query ($dbc, $q); // Jalankan query
   
      if ($r) { // Jika OK
        // Tampilkan sebuah pesan
        echo '<h1>Terimakasih!</h1>
              <p>Anda sekarang terdaftar!</p><p><br /></p>';

    } else { // Jika tidak OK
        // Tampilkan pesan
        echo '<h1>Sistem Error/h1>
              <p class="error">Anda tidak dapat terdaftar
              karena adanya gangguan sistem.
              Mohon maaf atas ketidak-nyamanan ini.</p>';

        // Pesan debugging:
        echo '<p>' . mysqli_error($dbc) . '<br /><br />Query: ' . $q . '</p>';
    } // Akhir dari IF

    mysqli_close($dbc); // Menutup koneksi database

    // Mencantumkan footer dan keluar dari skrip
    include ('C:\wamp\www\footer.html');
    exit();

    } else { // Laporkan arrayError.
        echo '<h1>Error!</h1>
              <p class="error">Terjadi error berikut:<br />';

        foreach ($arrayError as $msg) { // Tampilkan tiap error
            echo " - $msg<br />\n";
        }

        echo '</p><p>Silahkan coba kembali.</p><p><br /></p>';

    } // Akhir IF.
     
      mysqli_close($dbc); // Menutup koneksi database
} // Akhir dari submit kondisional
?>

<h1>Register</h1>
<form action="registrasi_pengguna.php" method="post">
  <p>Nama Depan: <input type="text" name="nama_depan" size="15"
    maxlength="20" value="<?php if (isset($_POST['nama_depan']))
      echo $_POST['nama_depan']; ?>" /></p>
     
  <p>Nama Belakang: <input type="text" name="nama_belakang" size="15"
    maxlength="40" value="<?php if (isset($_POST['nama_belakang']))
      echo $_POST['nama_belakang']; ?>" /></p>

  <p>Alamat Email: <input type="text" name="email" size="20" maxlength="80"
    value="<?php if (isset($_POST['email']))
    echo $_POST['email']; ?>" /> </p>

  <p>Password: <input type="password" name="pass1" size="10"
    maxlength="20" /></p>

  <p>Konfirmasi Password: <input type="password" name="pass2" size="10"
    maxlength="20" /></p> <p><input type="submit" name="submit"
    value="Register" /></p><input type="hidden" name="submitted"
    value="TRUE" />
</form>

<?php
include ('C:\wamp\www\footer.html');
?>


Memodifikasi File registrasi_pengguna.php
Fungsi mysqli_num_rows() dapat dipakai pada file registrasi_pengguna.php untuk mencegah seseorang agar tidak mendaftar dengan alamat email yang sama beberapa kali. Meskipun indeks UNIQUE pada kolom tersebut dalam database dapat mencegah hal tersebut, tindakan pengguna tersebut akan menciptakan error MySQL. Agar hal ini tidak terjadi pada PHP, Anda perlu menjalankan query SELECT untuk memastikan bahwa alamat email belum terdaftar. Hal ini memerlukan query sebagai berikut:

SELECT id_pengguna FROM pengguna WHERE email='$e'

<?php # lihat_pengguna.php
// Skrip ini membaca semua rekaman
// dari tabel pengguna.

$judul_halaman = 'Register';
include ('C:\wamp\www\header.html');

// Header halaman:
echo '<h1>Daftar Pengguna yang Terdaftar</h1>';

// Koneksi ke database
require_once ('C:\wamp\www\koneksi_mysqli.php');

// Melakukan query
$q = "SELECT CONCAT(nama_belakang, ', ', nama_depan) AS nama,
    DATE_FORMAT(tanggal_registrasi, '%M %d,%Y') AS dr
      FROM pengguna ORDER BY tanggal_registrasi ASC";
$r = @mysqli_query ($dbc, $q); // Jalankan query

// Menghitung jumlah baris yang dihasilkan
$jum = mysqli_num_rows($r);

if ($jum > 0) { // Jika berjalan Ok, tampilkan rekaman
    // Header tabel
    echo '<table align="center" cellspacing="3" cellpadding="3" width="75%">
          <tr><td align="left"><b>Name</b></td><td align="left"><b>
              Tanggal terdaftar</b></td></tr>';

    // Menampilkan semua rekaman
    while ($baris = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
        echo '<tr><td align="left">' . $baris['nama'] . '</td><td align="left">'
        . $baris['dr'] . '</td></tr>';
    }
    echo '</table>'; // Menutup tabel

    mysqli_free_result ($r); // Membebaskan sumber-daya

} else { // Jika tidak ada rekaman yang dihasilkan
    echo '<p class="error">Tidak ada pengguna yang terdaftar.</p>';

} // Akhir dari IF.

mysqli_close($dbc); // Menutup koneksi ke database

include ('C:\wamp\www\footer.html');
?>


Memperbarui Rekaman
Teknik terakhir pada bab ini akan menunjukkan bagaiman memperbarui rekaman-rekaman database melalui skrip PHP. Untuk itu, Anda memerlukan sebuah query UPDATE, dan keberhasilannya dapat diverifikasi dengan fungsi PHP mysqli_affected_rows().

Simpan file berikut dengan nama password.php.

<?php # password.php
// Halaman ini untuk pengubahan password oleh pengguna
$judul_halaman = 'Ubah Password Anda';
include ('C:\wamp\www\header.html');

// Memeriksa apakah form telah disubmit
if (isset($_POST['submitted'])) {
    // Koneksi ke database
    require_once ('C:\wamp\www\koneksi_mysqli.php');

    $arrayError = array(); // Menginisialisasi array error

    // Memeriksa alamat email
    if (empty($_POST['email'])) {
        $arrayError[] = 'Anda lupa memasukkan email Anda';
    } else {
        $e = mysqli_real_escape_string($dbc, trim($_POST['email']));
    }

    // Memeriksa password terkini
    if (empty($_POST['pass'])) {
        $arrayError[] = 'Anda lupa memasukkan password';
    } else {
        $p = mysqli_real_escape_string($dbc, trim($_POST['pass']));
    }

    // Memeriksa kecocokan password baru
    if (!empty($_POST['pass1'])) {
        if ($_POST['pass1'] != $_POST['pass2']) {
            $arrayError[] = 'Password baru Anda tidak cocok
                dengan password konfirmasi.';
        } else {
            $np = mysqli_real_escape_string($dbc, trim($_POST['pass1']));
       }
    } else {
       $arrayError[] = 'Anda lupa memasukkan password baru.';
    }

    if (empty($arrayError)) { // Jika semuanya OK
        // Memeriksa apakah pengguna telah memasukkan
        // kombinasi email/password yang tepat
        $q = "SELECT id_pengguna FROM pengguna
                WHERE (email='$e' AND pass=SHA1('$p') )";
        $r = @mysqli_query($dbc, $q);
        $jum = @mysqli_num_rows($r);
        if ($jum == 1) { // Ada kecocokan
            // Mendapatkan id_pengguna
            $baris = mysqli_fetch_array($r, MYSQLI_NUM);

            // Melakukan query UPDATE
            $q = "UPDATE pengguna SET pass=SHA1('$np')
                      WHERE id_pengguna = $baris[0]";
            $r = @mysqli_query($dbc, $q);

            if (mysqli_affected_rows($dbc) == 1) { // Jika berjalan OK
                // Tampilkan pesan
                echo '<h1>Terimakasih!</h1>
                      <p>Password baru Anda telah diperbarui!</p><p><br /></p>';

            } else { // Jika tidak berjalan OK
                // Tampilkan pesan
                echo '<h1>Sistem Error</h1>
                      <p class="error">Password baru tidak dapat diperbarui
                      karena ada error sistem. Kami minta maaf atas
                      ketidak-nyamanan ini.</p>';

                // Pesan debugging
                echo '<p>' . mysqli_error($dbc) . '<br/><br />Query: ' . $q .'</p>';

            }

            // Mencantumkan footer dan keluar
            include ('C:\wamp\www\footer.html');
            exit();
        } else { // kombinasi email/password tak-valid
            echo '<h1>Error!</h1>
                  <p class="error">Alamat email dan
                  password tidak cocok.</p>';
        }
    } else { // Melaporkan arrayError.
        echo '<h1>Error!</h1>
              <p class="error">Terjadi error berikut:<br />';
        foreach ($arrayError as $msg) { // Tampilkan tiap error
            echo " - $msg<br />\n";
        }
        echo '</p><p>Silahkan coba lagi.</p><p><br /></p>';
    } // Akhir dari IF.

    mysqli_close($dbc); // Menutup koneksi database
} // Akhir dari kondisional utama
?>

<h1>Ubah Password Anda</h1>
<form action="password.php" method="post">
  <p>Alamat Email: <input type="text" name="email" size="20"
    maxlength="80" value="<?php if (isset($_POST['email']))
    echo $_POST['email']; ?>" /> </p>

  <p>Password Sekarang: <input type="password" name="pass" size="10"
    maxlength="20" /></p>

  <p>Password Baru: <input type="password" name="pass1" size="10"
    maxlength="20" /></p>

  <p>Konfirmasi Password Baru: <input type="password" name="pass2"
    size="10" maxlength="20" /></p>

  <p><input type="submit" name="submit" value="Ubah Password" /></p>
  <input type="hidden" name="submitted" value="TRUE" />
</form>

<?php
include ('C:\wamp\www\footer.html');
?>







No comments:

Post a Comment