Daftar Isi
- Pelatihan dan Sertifikasi Kompetensi Programmer Database
- Pengajar
- Hari 1
- Hari 2
- Hari 3
- Galeri
- Praktik Nilai Otomatis [Inventory]
- Join
- Praktik Join [Education]
- Stored Procedure [Education]
- Trigger [Inventory]
- Hari 4
- Galeri
- Praktik Aplikasi Web Pegawai (PHP Plain - MySQL)
- Buat User Baru di MySQL
- -Visualisasi Bind
- -Implementasi DML Select, Insert, Update dan Delete
- -Contoh Menambah Field
- -Contoh Tidak Aman (SQL Injection)
- Buat User Baru di Postgresql
- Praktik Aplikasi Web Pegawai (Framework YII - MySQL)
- - Contoh Kode Lengkap Model ber-Foreign Key
- - Contoh Kode Lengkap index.php Pada View yang Terdapat Foreign Key
- - Contoh Kode Lengkap _form.php Pada View Untuk Membuat Dropdown pada Foreign Key
- Field Read Only
- Hash Password
- Uji Kemampuan
- Hari 5
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
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
-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>
<a href="index.php?f=pegawai-view&action=view&id=<?php print $row['id']; ?>">View</a>
<a href="index.php?f=pegawai-form&action=edit&id=<?php print $row['id']; ?>">Edit</a>
<a href="index.php?f=pegawai-view&action=delete&id=<?php print $row['id']; ?>">Delete</a>
</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>
- tambahkan item di mysqli_stmt_bind_result
- 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>
- tambahkan heading
- 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>
- tambahkan item di mysqli_stmt_bind_result
- 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);
- edit string sql
- 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);
- edit string sql
- tambahkan penangkap data pos
-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">
<?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>
</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
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
- Pasang YII menggunakan composer
composer create-project --prefer-dist yiisoft/yii2-app-basic siakad
- Aktifkan mod pdo_pgsql di PHP
- Ubah config/db.php (sesuai dengan praktikum sebelumnya)
'dsn' => 'pgsql:host=localhost;dbname=hari2;port=5432',
'username' => 'school',
'password' => 'Xp5cUvR8i80Sqx34Gv8i0DcXt', - Ubah config/web.php
aktifkan'urlManager'
- 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') ) ?>
- Model Generator untuk membuat model students, courses dan student_courses.
– 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
- Wajib:
Berikan rules'on'=>'view'
pada field yang akan dibuat readonly pada Modelpublic function rules()
{
return [
[['code', 'name'], 'required'],
[['code'], 'string', 'max' => 20],
[['name'], 'string', 'max' => 200],
[['total_course'], 'integer', 'on' => 'view'],
];
} - Opsional:
Tambahkan opsi readonly dan disabled pada _form<?= form->field($model, 'total_course')->textInput(['disabled' => true, 'readonly' => true]) ?>
Hash Password
- Tambahkan field password pada tabel students
ALTER TABLE students
ADD COLUMN password character varying(255); - Tambahkan pada Model students
public function rules()
{
return [
//…
[['password'], 'string', 'max' => 255],
];
}public function attributeLabels()
{
return [
//…
'password' => 'Password',
];
} - 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,
]);
} - Tambahkan pada View student pada _form
<?php $this->field($model, 'password')->textInput(['type' => 'password']) ?>
Uji Kemampuan
- Buat kolom baru bernama total_course pada tabel students
- Buat trigger, sehingga apabila ada perubahan data di tabel student_courses, maka total_course akan dihitung ulang
- Sesuaikan aplikasi web berbasis YII. total_course harus read only