Categories
Berita PDSI

Pelatihan dan Sertifikasi Kompetensi Teknis Profesi Basis Data Programmer

Daftar Isi

Hari 4

Galeri

Praktik Aplikasi Web Pegawai (PHP Plain – MySQL)

– Nur Hidayat

Sumber: https://bit.ly/3bfPU9e

  • Unduh sebagai *.zip
  • Ekstrak di root web
  • Buat basis data/skema baru bernama pegawai
  • Impor berkas scripts/tables.sql ke dalam basis data/skema pegawai
  • Jalankan aplikasi Web Pegawai
debugging koneksi (query)
form manipulasi data pegawai

Buat User Baru di MySQL

CREATE USER pegpeg@localhost IDENTIFIED BY 'Xp5cUvR8i80Sqx34Gv8i0DcXt';
GRANT USAGE ON pegawai.* TO pegpeg@localhost;
GRANT ALL ON pegawai.* TO pegpeg@localhost;
FLUSH PRIVILEGES;

-Visualisasi Bind

visualisasi bind result

-Implementasi DML Select, Insert, Update dan Delete


<!-- Skrip untuk menampilkan data (select) -->
<h3>Daftar Pegawai</h3>
<a href="index.php?f=pegawai-form&action=create">Tambah Pegawai</a>

<br /><br />
<table cellpadding="2" cellspacing="1" border="1">
<tr>
    <th>No</th>
    <th>NIP</th>
    <th>Nama</th>
    <th>Alamat</th>
    <th>Action</th>
</tr>

<?php
// ambil data pegawai dari database
// kemudian simpan ke array $data
$sql = 'select * from pegawai order by nip';
$rs = mysqli_query($db_conn,$sql);
if (!$rs) die('Koneksi Database GAGAL: ' . mysqli_error($db_conn));
$nomor = 0;
while ($row = mysqli_fetch_assoc($rs)) {
?>
<tr>
    <td><?php print ++$nomor; ?></td>
    <td><?php print $row['nip']; ?></td>
    <td><?php print $row['nama']; ?></td>
    <td><?php print $row['alamat']; ?></td>
    <td>
        &nbsp;<a href="index.php?f=pegawai-view&action=view&id=<?php print $row['id']; ?>">View</a>
        &nbsp;<a href="index.php?f=pegawai-form&action=edit&id=<?php print $row['id']; ?>">Edit</a>
        &nbsp;<a href="index.php?f=pegawai-view&action=delete&id=<?php print $row['id']; ?>">Delete</a>
        &nbsp;
    </td>
</tr>
<?php
} // end while
?>
</table>
<!-- Skrip untuk memanipulasi data (insert/update/delete) -->
<?php
require_once('config.php');
require_once('koneksi.php');

// prepare data to process
$id = htmlspecialchars($_POST['id']??0);
$nip = htmlspecialchars($_POST['nip']??'');
$nama = htmlspecialchars($_POST['nama']??'');
$alamat = htmlspecialchars($_POST['alamat']??'');
$tmplhr = htmlspecialchars($_POST['tempat_lahir']??'');
$tgllhr = htmlspecialchars($_POST['tanggal_lahir']??'');

/**
 * Proses tambah pegawai baru
 */
if ($_POST['action']=='create') {
    $sql = "
        insert into 
        pegawai ( nip,nama,alamat,tempat_lahir,tanggal_lahir ) 
        values ( ?, ?, ?, ?, ?) 
    ";

    // prepare sql statement
    $stmt = mysqli_prepare($db_conn, $sql);
    // bind parameter to prevent sql injection
    mysqli_stmt_bind_param($stmt, 'sssss', $nip, $nama, $alamat, $tmplhr, $tgllhr);
    // execute sql statement
    $result = mysqli_stmt_execute($stmt);
    // clean up memory
    mysqli_stmt_close($stmt);
    // give feedback to user
    if ($result)
        print 'Insert Data Pegawai BERHASIL!';
    else
        print 'Insert Data Pegawai GAGAL!';
}

/**
 * Proses edit pegawai pegawai lama
 */
if ($_POST['action']=='edit') {
    $sql = "
        update pegawai 
        set nip = ?,
            nama = ?,
            alamat = ?,
            tempat_lahir = ?,
            tanggal_lahir = ?
        where id = ?
    ";
    // prepare sql statement
    $stmt = mysqli_prepare($db_conn, $sql);
    // bind parameter to prevent sql injection
    mysqli_stmt_bind_param($stmt, 'sssssd', $nip, $nama, $alamat, $tmplhr, $tgllhr, $id);
    // execute sql statement
    $result = mysqli_stmt_execute($stmt);
    // clean up memory
    mysqli_stmt_close($stmt);
    // give feedback to user
    if ($result)
        print 'Update Data Pegawai BERHASIL!';
    else
        print 'Update Data Pegawai GAGAL!';
}

/**
 * Proses delete pegawai pegawai lama
 */
if ($_POST['action']=='delete') {
    $sql = "
        delete from pegawai 
        where id = ?
    ";
    // prepare sql statement
    $stmt = mysqli_prepare($db_conn, $sql);
    // bind parameter to prevent sql injection
    mysqli_stmt_bind_param($stmt, 'd', $id);
    // execute sql statement
    $result = mysqli_stmt_execute($stmt);
    // clean up memory
    mysqli_stmt_close($stmt);
    // give feedback to user
    if ($result)
        print 'Delete Data Pegawai BERHASIL!';
    else
        print 'Delete Data Pegawai GAGAL!';
}

?>

<br />
<br />
<a href="index.php?f=pegawai-list">Kembali ke Daftar Pegawai</a>

-Contoh Menambah Field

-- tambahkan kolom gaji pokok di basis data
ALTER TABLE `pegawai`
	ADD COLUMN `gaji_pokok` INT NULL AFTER `tanggal_lahir`;
  • Tambahkan input form di pegawai-form.php
    • tambahkan item di mysqli_stmt_bind_result
      mysqli_stmt_bind_result($stmt, $id, $nip, $nama, $alamat, $tempat_lahir, $tanggal_lahir, $gaji_pokok);
    • tambahkan tampilkan data
      <tr>
      <th>Gaji Pokok</th>
      <td><input type="text" name="gaji_pokok" value="<?= $gaji_pokok ?>" size="15" /></td>
      </tr>
  • Edit pegawai-list.php
    • tambahkan heading
      <th>Gaji Pokok</th>
    • tambahkan tampilkan data di dalam while ($row = mysqli_fetch_assoc($rs))
      <td><?php print $row['gaji_pokok']; ?></td>
  • Edit pegawai-view.php
    • tambahkan item di mysqli_stmt_bind_result
      mysqli_stmt_bind_result($stmt, $id, $nip, $nama, $alamat, $tempat_lahir, $tanggal_lahir, $gaji_pokok);
    • tambahkan tampilan data
      <tr>
      <th>Gaji Pokok</th>
      <td><?php print $gaji_pokok; ?></td>
      </tr>
  • Edit pegawai-proses.php
    • tambahkan penangkap data pos
      $gapok = htmlspecialchars($_POST['gaji_pokok']??0);
    • pada create
      • edit string sql
        insert into
        pegawai ( nip,nama,alamat,tempat_lahir,tanggal_lahir,gaji_pokok )
        values ( ?, ?, ?, ?, ?, ?)
      • edit item di mysqli_stmt_bind_param
        mysqli_stmt_bind_param($stmt, 'sssssd', $nip, $nama, $alamat, $tmplhr, $tgllhr, $gapok);
    • pada edit
      • edit string sql
        update pegawai
        set nip = ?,
        nama = ?,
        alamat = ?,
        tempat_lahir = ?,
        tanggal_lahir = ?,
        gaji_pokok = ?

        where id = ?
      • edit item di mysqli_stmt_bind_param
        mysqli_stmt_bind_param($stmt, 'sssssdd', $nip, $nama, $alamat, $tmplhr, $tgllhr, $gapok, $id);

-Contoh Tidak Aman (SQL Injection)

Masukkan sebuah data dummy

insert into pegawai (nip,nama,alamat,tempat_lahir,tanggal_lahir) values ('2021050013', 'Kaz Brekker', 'Ketterdam', 'Ketterdam', '1980-01-01');
localhost:8000/pegawai-master/index.php?f=pegawai-view-contoh-sqlinjection&id=1 or true&action=view

Buat file baru bernama pegawai-view-contoh-sqlinjection.php

<?php
$id = $_GET['id'] ?? 0;
// ambil data pegawai dari database

/**
//contoh yang aman
//seharusnya menggunakan ini

    // kemudian simpan ke array $data
    $sql = "select * from pegawai where id = ?";
    // prepare sql statement
    $stmt = mysqli_prepare($db_conn, $sql);
    // bind parameter to prevent sql injection
    mysqli_stmt_bind_param($stmt, 'd', $id);
    // execute sql statement
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $id, $nip, $nama, $alamat, $tempat_lahir, $tanggal_lahir);

    // tampilkan data pegawai
    if ($row = mysqli_stmt_fetch($stmt)): 
 */
    //contoh yang tidak aman
    $sql = "select * from pegawai where id = " . $id;
    // prepare sql statement
    $stmt = mysqli_query($db_conn, $sql);
    if ($row = mysqli_fetch_assoc($stmt)):
         extract($row);
?>

<h3>View Pegawai</h3>
<form id="frmPegawai" name="frmPegawai" action="pegawai-proses.php" method="post">
    <table cellpadding="2" cellspacing="1" border="1">
    <tr>
        <th>NIP</th>
        <td><?php print $nip; ?></td>
    </tr>
    <tr>
        <th>Nama</th>
        <td><?php print $nama; ?></td>
    </tr>
    <tr>
        <th>Alamat</th>
        <td><?php print $alamat; ?></td>
    </tr>
    <tr>
        <th>Tempat Lahir</th>
        <td><?php print $tempat_lahir; ?></td>
    </tr>
    <tr>
        <th>Tanggal Lahir</th>
        <td><?php print $tanggal_lahir; ?></td>
    </tr>
    <tr>
        <th colspan="2">
            &nbsp;
            <?php if ($_GET['action']=='delete'): ?>
                <input type="submit" name="btnHapusPegawai" value="Hapus" style="width: 100px;" />
                <input type="hidden" name="id" value="<?php print $id; ?>" />
                <input type="hidden" name="action" value="delete" />
            <?php endif; ?>
            <a href="index.php?f=pegawai-list">Kembali ke Daftar Pegawai</a>
            &nbsp;
        </th>
    </tr>
    </table>
</form>

<?php 
// end if
endif; 

Contoh menampilkan data Brekker tanpa perlu mengetahui id

http://localhost/pegawai-master/index.php?f=pegawai-view-contoh-sqlinjection&id=0+or+nama+like+%27%25bre%25%27&action=view
contoh sql injection

Buat User Baru di Postgresql

CREATE USER scholl WITH PASSWORD 'Xp5cUvR8i80Sqx34Gv8i0DcXt';
grant all privileges on database hari2.* to scholl;
grant all privileges on schema education to scholl;
GRANT all privileges
ON ALL TABLES IN SCHEMA education 
TO scholl;

Praktik Aplikasi Web Pegawai (Framework YII – MySQL)

– Nur Hidayat

  1. Pasang YII menggunakan composer
    composer create-project --prefer-dist yiisoft/yii2-app-basic siakad
  2. Aktifkan mod pdo_pgsql di PHP
  3. Ubah config/db.php (sesuai dengan praktikum sebelumnya)

    'dsn' => 'pgsql:host=localhost;dbname=hari2;port=5432',
    'username' => 'school',
    'password' => 'Xp5cUvR8i80Sqx34Gv8i0DcXt',
  4. Ubah config/web.php
    aktifkan 'urlManager'
  5. Buka alamat http://localhost/siakad/web/gii
    • Model Generator untuk membuat model students, courses dan student_courses.
      Jika skema public maka langsung namatabel atau *, tetapi jika skema bukan public, misalnya: education, maka perlu menambahkan nama skema sebelum nama tabel, misalnya: education.* atau education.namatabel
    • CRUD Generator untuk membuat View, Controller dan Search untuk model students, courses dan student_courses di atas.
    • Seharusnya, pada tabel yang memiliki relasi/foreign key akan di-generate relasi dengan tabel lain, misalnya memiliki relasi dengan tabel (model) student, maka seharusnya ada kode seperti di bawah ini
      public function getStudent()
      {
      return $this->hasOne(Students::className(), ['id' => 'student_id']);
      }

      Apabila belum maka dapat dibuat sendiri
    • Ubah index.php pada view yang terdapat foreign key agar menampilkan label, bukan menampilkan ID, misalnya menampilkan nama student
      'student.name', //awalnya student_id
      'course_id',
    • Ubah _form.php pada view yang terdapat foreign key agar menjadi dropdown, bukan textbox biasa, misalnya membuat dropdown untuk student
      <?= $form -> field ($model, 'student_id') -> dropDownList ( ArrayHelper::map (EducationStudents::find() -> asArray() -> all(), 'id', 'name') ) ?>

– Contoh Kode Lengkap Model ber-Foreign Key

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "student_courses".
 *
 * @property int $id
 * @property int $semester
 * @property int $student_id
 * @property int $course_id
 */
class StudentCourses extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'student_courses';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['semester', 'student_id', 'course_id'], 'required'],
            [['semester', 'student_id', 'course_id'], 'default', 'value' => null],
            [['semester', 'student_id', 'course_id'], 'integer'],
            [['course_id'], 'exist', 'skipOnError' => true, 'targetClass' => Courses::className(), 'targetAttribute' => ['course_id' => 'id']],
            [['student_id'], 'exist', 'skipOnError' => true, 'targetClass' => Students::className(), 'targetAttribute' => ['student_id' => 'id']],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'semester' => 'Semester',
            'student_id' => 'Student ID',
            'course_id' => 'Course ID',
        ];
    }
    

//FOREIGN KEY
    public function getStudent()
    {
        return $this->hasOne(Students::className(), ['id' => 'student_id']);
    }
    
    public function getCourse()
    {
        return $this->hasOne(Courses::className(), ['id' => 'course_id']);
    }

}

– Contoh Kode Lengkap index.php Pada View yang Terdapat Foreign Key

<?php

use yii\helpers\Html;
use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $searchModel app\models\StudentCoursesSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Student Courses';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="student-courses-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Create Student Courses', ['create'], ['class' => 'btn btn-success']) ?>
    </p>

    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            'semester',
            'Student.name',
            'Course.name',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

</div>

– Contoh Kode Lengkap _form.php Pada View Untuk Membuat Dropdown pada Foreign Key

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

use yii\helpers\ArrayHelper;

use app\models\Students;
use app\models\Courses;

/* @var $this yii\web\View */
/* @var $model app\models\StudentCourses */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="student-courses-form">

    <?php $form = ActiveForm::begin(); ?>

    <?php $semester = ["Semester Awal" => [1=>1,2=>2,3=>3,4=>4], "Semester Akhir" => [5=>5,6=>6,7=>7,8=>8]]; ?>
    <?php //$form->field($model, 'semester')->textInput() ?>
    <?= $form->field($model, 'semester')->dropDownList($semester) ?>
    
    <?php // $form->field($model, 'student_id')->textInput() ?>
    <?= $form->field($model, 'student_id')->dropDownList(
            ArrayHelper::map(Students::find()->asArray()->all(), 'id', 'name')
            )
    ?>
    

    <?php //$form->field($model, 'course_id')->textInput() ?>
    <?= $form->field($model, 'course_id')->dropDownList(
            ArrayHelper::map(Courses::find()->asArray()->all(), 'id', 'name')
            )
    ?>

    <div class="form-group">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

Field Read Only

  1. Wajib:
    Berikan rules 'on'=>'view' pada field yang akan dibuat readonly pada Model
    public function rules()
    {
    return [
    [['code', 'name'], 'required'],
    [['code'], 'string', 'max' => 20],
    [['name'], 'string', 'max' => 200],
    [['total_course'], 'integer', 'on' => 'view'],
    ];
    }
  2. Opsional:
    Tambahkan opsi readonly dan disabled pada _form
    <?= form->field($model, 'total_course')->textInput(['disabled' => true, 'readonly' => true]) ?>

Hash Password

  1. Tambahkan field password pada tabel students
    ALTER TABLE students
    ADD COLUMN password character varying(255);
  2. Tambahkan pada Model students
    public function rules()
    {
    return [
    //…
    [['password'], 'string', 'max' => 255],
    ];
    }

    public function attributeLabels()
    {
    return [
    //…
    'password' => 'Password',
    ];
    }
  3. Ubah pada Controller students
    public function actionCreate()
    {
    $model = new EducationStudents();
    if ($this->request->isPost) {
    //ubah password plain menjadi password hash
    $req = $this->request->post("Students");
    $req['password'] = \Yii::$app->security->generatePasswordHash($req['password']);
    $this->request->setBodyParams(["Students" => $req]);

    if ($model->load($this->request->post()) && $model->save()) {
    return $this->redirect(['view', 'id' => $model->id]);
    }
    } else {
    $model->loadDefaultValues();
    }
    return $this->render('create', [
    'model' => $model,
    ]);
    }
  4. Tambahkan pada View student pada _form
    <?php $this->field($model, 'password')->textInput(['type' => 'password']) ?>

Uji Kemampuan

  1. Buat kolom baru bernama total_course pada tabel students
  2. Buat trigger, sehingga apabila ada perubahan data di tabel student_courses, maka total_course akan dihitung ulang
  3. Sesuaikan aplikasi web berbasis YII. total_course harus read only

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.