Anda di halaman 1dari 25

LECTURE NOTES

ISYS6307 – Data & Information


Management

Week ke - 5

Class OOP PHP Native


LEARNING OUTCOMES

LO2: Demonstrate Database Query to Programming Language

OUTLINE MATERI :

1. Introduction to Database

2. Using PDO

3. Inserting data

4. Querying data

5. Updating

6. Deleting data

ISYS6307 – Data and Information Management


ISI MATERI

A. Introducing to Database
Data mungkin merupakan landasan sebagian besar aplikasi web. Tentu saja,
aplikasi Anda harus cantik, cepat, tanpa cela, dan sebagainya, tetapi jika satu hal penting
bagi pengguna, itulah data yang dapat Anda kelola untuk mereka. Dari sini kami dapat
menyimpulkan bahwa mengelola data adalah salah satu hal terpenting yang harus
dipertimbangkan saat mendesain aplikasi Anda.
Mengelola data tidak hanya melibatkan penyimpanan file read-only dan
membacanya saat diperlukan, seperti yang telah kami lakukan sejauh ini, tetapi juga
menambahkan, mengambil, memperbarui, dan menghapus informasi individual. Untuk
ini, kami memerlukan alat yang mengkategorikan data kami dan membuat tugas-tugas ini
lebih mudah bagi kami, dan inilah saat database mulai bekerja.
Database adalah alat untuk mengelola data. Fungsi dasar database adalah
memasukkan, mencari, memperbarui, dan menghapus data, meskipun kebanyakan sistem
database melakukan lebih dari ini. Basis data diklasifikasikan ke dalam dua kategori
berbeda bergantung pada cara mereka menyimpan data: basis data relasional dan non-
relasional.
Database relasional menyusun data dengan cara yang sangat mendetail, memaksa
pengguna untuk menggunakan format yang ditentukan dan memungkinkan untuk
membuat koneksi - yaitu, hubungan - antara berbagai bagian informasi. Database non-
relasional adalah sistem yang menyimpan data dengan cara yang lebih santai, seolah-olah
tidak ada struktur yang jelas. Meskipun dengan definisi yang sangat kabur ini Anda
mungkin berasumsi bahwa setiap orang ingin menggunakan database relasional, kedua
sistem ini sangat berguna; itu tergantung bagaimana Anda ingin menggunakannya.
Dalam mata kuliah ini, kita akan fokus pada database relasional, karena database
tersebut banyak digunakan dalam aplikasi web kecil, di mana tidak ada data dalam
jumlah besar. Ini karena aplikasi biasanya berisi data yang berhubungan satu sama lain;

ISYS6307 – Data and Information Management


Misalnya, aplikasi kami mungkin berisi penjualan eceran yang terdiri dari pelanggan dan
buku.

B. Using PDO
Kita telah bekerja dengan MySQL selama ini dan Anda sudah memiliki ide bagus
tentang apa yang dapat Anda lakukan dengannya. Namun, berhubungan dengan
pelanggan dan melakukan pencarian secara manual bukanlah tujuan kita. Yang ingin
kami capai adalah aplikasi kami dapat menggunakan database secara otomatis. Untuk
melakukan ini, kita akan menggunakan sekumpulan kelas yang disertakan dengan PHP
yang memungkinkan Anda untuk terhubung ke database dan menjalankan kueri dari
kode.
PHP Data Objects (PDO) adalah kelas yang menghubungkan dan berinteraksi
dengan database. Ini adalah cara kerja database yang populer untuk pengembang PHP,
meskipun ada cara lain yang tidak akan kami bahas di sini. Dengan PDO Anda dapat
bekerja dengan sistem database yang berbeda, jadi Anda tidak hanya terikat pada
MySQL. Pada bagian berikut ini kita akan melihat bagaimana menghubungkan ke
database, memasukkan data dan mengambilnya dengan kelas ini.
Untuk koneksi ke database, praktik yang baik adalah menjaga kredensial (yaitu,
pengguna dan kata sandi) terpisah dari kode dalam file konfigurasi. Kami sudah memiliki
file ini sebagai config / app.json sejak kita bekerja dengan kelas Config. Mari tambahkan
kredensial yang benar untuk database kita. Jika Anda memiliki konfigurasi default, file
konfigurasinya akan terlihat seperti ini bukan:
{
"db": {
"user": "root",
"password": ""
}
}
Pengembang biasanya menentukan informasi lain yang terkait dengan koneksi,
seperti host, port, atau nama database. Ini tergantung pada bagaimana aplikasi Anda

ISYS6307 – Data and Information Management


diinstal, apakah MySQL berjalan di server lain, dll., Dan terserah Anda berapa banyak
informasi yang ingin Anda simpan tentang kode Anda dan dalam file konfigurasi Anda.
Untuk terhubung ke database, kita perlu membuat instance objek dari kelas PDO.
Konstruktor kelas ini menggunakan tiga argumen: Domain Source Name (DSN), string
yang menentukan tipe database yang akan digunakan; nama pengguna; dan kata sandi.
Kami sudah memiliki nama pengguna dan kata sandi kelas Config, tetapi kami belum
membangun DSN.
Salah satu format untuk database MySQL adalah <database type>: host <host>;
dbname = <nama skema>. Karena sistem database kita adalah MySQL, ia berjalan di
server yang sama dan nama skema adalah toko buku, DSN adalah mysql: host =
127.0.0.1; dbname = toko buku. Mari kita lihat bagaimana kita akan menggabungkan
semuanya:
$dbConfig = Config::getInstance()->get('db');
$db = new PDO(
'mysql:host=127.0.0.1;dbname=bookstore',
$dbConfig['user'],
$dbConfig['password']
);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,
PDO::FETCH_ASSOC);

Perhatikan juga bahwa kita akan memanggil metode setAttribute dari instance
PDO. Metode ini memungkinkan Anda mengatur beberapa opsi untuk koneksi; dalam hal
ini, ini menetapkan format hasil yang berasal dari MySQL. Opsi ini memaksa MySQL
untuk mengembalikan array yang kuncinya adalah nama bidang, yang jauh lebih berguna
daripada default, mengembalikan kunci numerik berdasarkan urutan bidang. Menyetel
opsi ini sekarang akan memengaruhi semua kueri yang dijalankan dengan instance $ db,
alih-alih menyetel opsi setiap kali kami menjalankan kueri.
Cara termudah untuk mendapatkan data dari database Anda adalah dengan
menggunakan metode kueri. Metode ini menerima kueri sebagai string dan
mengembalikan daftar baris sebagai array. Mari kita lihat contoh: setelah menginisialisasi
koneksi database, tulis yang berikut ini, misalnya di file init.php:

ISYS6307 – Data and Information Management


$rows = $db->query('SELECT * FROM book ORDER BY title');
foreach ($rows as $row) {
var_dump($row);
}

Pencarian ini mencoba untuk memasukkan semua buku ke dalam database dengan
mengurutkannya berdasarkan judul. Ini bisa menjadi konten dari fungsi seperti
getAllBooks, yang digunakan saat kami menampilkan katalog kami. Setiap baris adalah
larik yang berisi semua bidang sebagai kunci dan data sebagai nilai.
Jika Anda menjalankan aplikasi di browser Anda, Anda akan mendapatkan hasil
sebagai berikut:

Gambar 5.1 Contoh Array

ISYS6307 – Data and Information Management


Fungsi query berguna ketika kita ingin mengambil data, tetapi untuk menjalankan
query dengan memasukkan baris, PDO menyediakan fungsi exec. Fungsi ini juga
mengharapkan parameter pertama sebagai string, yang mendefinisikan kueri untuk
dijalankan, tetapi mengembalikan nilai Boolean yang menunjukkan apakah eksekusi
berhasil atau tidak. Contoh yang bagus adalah mencoba memasukkan buku. Ketik berikut
ini:
$query = <<<SQL
INSERT INTO book (isbn, title, author, price)
VALUES ("9788187981954", "Peter Pan", "J. M. Barrie", 2.34)
SQL;
$result = $db->exec($query);
var_dump($result); // true

Kode ini juga menggunakan cara baru untuk merender string: heredoc. Kami
menyertakan string <<< SQL dan SQL ;, keduanya dalam baris yang berbeda, bukan
tanda kutip. Keuntungan dari ini adalah kemampuan untuk menulis string multiline
dengan tabel atau ruang kosong lainnya, dan PHP akan menghargai ini. Kita dapat
membuat kueri yang mudah dibaca alih-alih menulisnya dalam satu baris atau harus
menghubungkan berbagai string bersama. Perhatikan bahwa SQL adalah token untuk
mewakili awal dan akhir string, tetapi Anda dapat menggunakan teks apa pun yang Anda
inginkan.
Pertama kali Anda menjalankan aplikasi dengan kode ini, kueri akan berhasil
dijalankan, sehingga hasilnya adalah Boolean true. Namun, jika Anda menjalankannya
lagi, itu akan mengembalikan false karena ISBN yang kami masukkan sama, tetapi
kami telah menyetel batasan ke unik.
Sangat membantu untuk mengetahui bahwa pencarian gagal, tetapi lebih baik jika
kita mengetahui alasannya. Contoh PDO memiliki metode errorInfo yang
mengembalikan array dengan informasi kesalahan terbaru. Kunci 2 berisi deskripsi, jadi
mungkin itu yang akan lebih sering kita gunakan. Perbarui kode sebelumnya dengan yang
berikut ini:
$query = <<<SQL
INSERT INTO book (isbn, title, author, price)

ISYS6307 – Data and Information Management


VALUES ("9788187981954", "Peter Pan", "J. M. Barrie", 2.34)
SQL;
$result = $db->exec($query);
var_dump($result); // false
$error = $db->errorInfo()[2];
var_dump($error); // Duplicate entry '9788187981954' for key
'isbn'

Hasilnya adalah pencarian gagal karena nomor ISBN digandakan. Sekarang kita
dapat membuat pesan kesalahan yang lebih bermakna untuk pelanggan kita atau hanya
untuk tujuan debugging.
Dua fungsi sebelumnya sangat berguna saat Anda perlu menjalankan kueri cepat
yang selalu sama. Namun, pada contoh kedua, Anda mungkin memperhatikan bahwa
string kueri tidak terlalu berguna karena selalu menyisipkan buku yang sama. Meskipun
benar bahwa Anda dapat mengganti nilai dengan variabel, ini bukanlah praktik yang baik
karena variabel ini biasanya berasal dari sisi pengguna dan mungkin berisi kode
berbahaya. Itu selalu lebih baik untuk membersihkan nilai-nilai ini terlebih dahulu.
PDO menyediakan kemampuan untuk menyiapkan pernyataan, yaitu kueri dengan
parameter. Anda dapat menentukan parameter untuk bidang yang akan diubah dalam
kueri dan kemudian menetapkan nilai ke parameter ini. Mari kita ambil contoh dulu,
sebagai berikut:
$query = 'SELECT * FROM book WHERE author = :author';
$statement = $db->prepare($query);
$statement->bindValue('author', 'George Orwell');
$statement->execute();
$rows = $statement->fetchAll();
var_dump($rows);

Pencarian normal, kecuali ia memiliki: author alih-alih string penulis yang ingin
kita temukan. Ini adalah parameter dan kami akan mengidentifikasinya dengan awalan:.
Metode prepare mendapatkan query sebagai argumen dan mengembalikan instance
PDOStatement. Kelas ini berisi beberapa metode untuk mengikat nilai, menjalankan

ISYS6307 – Data and Information Management


pernyataan, mendapatkan hasil, dan banyak lagi. Dalam potongan kode ini, kami hanya
akan menggunakan tiga, sebagai berikut:
• bindValue: Ini membutuhkan dua argumen: nama parameter seperti yang dijelaskan
dalam kueri dan nilai yang akan ditetapkan. Menentukan nama parameter yang tidak ada
dalam kueri akan memunculkan pengecualian.
• excute: ini akan mengirim kueri ke MySQL menggantikan parameter dengan nilai yang
ditentukan. Jika ada parameter yang tidak diberi nilai, metode akan melontarkan
pengecualian. Sebagai saudara eksekutifnya, eksekusi akan mengembalikan Boolean
yang menentukan apakah kueri berhasil dieksekusi atau tidak.
• fetchAll: Mendapatkan data dari MySQL jika itu adalah kueri SELECT. Sebagai
kueri, fetchAll mengembalikan daftar semua baris sebagai array.

Jika Anda mencoba kode ini, Anda akan melihat bahwa hasilnya sangat mirip
dengan menggunakan query; namun, kali ini kodenya jauh lebih dinamis karena Anda
dapat menggunakannya kembali untuk pembuat mana pun yang Anda perlukan.

ISYS6307 – Data and Information Management


Gambar 5.2 Hasil PDO Query

Ada cara berbeda untuk mengikat nilai ke parameter kueri dibandingkan dengan
metode bindValue. Anda dapat menyiapkan array di mana kuncinya adalah nama
parameter dan nilainya adalah nilai yang ingin Anda tetapkan, dan kemudian Anda dapat
mengirimkannya sebagai argumen pertama dari metode eksekusi. Cara ini sangat berguna
karena Anda biasanya memiliki array ini yang sudah disiapkan dan Anda tidak perlu
memanggil bindValue berkali-kali dengan isinya. Tambahkan kode ini untuk
mengujinya:
$query = <<<SQL
INSERT INTO book (isbn, title, author, price)

ISYS6307 – Data and Information Management


VALUES (:isbn, :title, :author, :price)
SQL;
$statement = $db->prepare($query);
$params = [
'isbn' => '9781412108614',
'title' => 'Iliad',
'author' => 'Homer',
'price' => 9.25
];
$statement->execute($params);
echo $db->lastInsertId(); // 8

Dalam contoh terakhir ini, kami membuat buku baru dengan hampir semua
parameter, tetapi kami tidak menentukan ID, yang merupakan perilaku yang diinginkan,
karena kami ingin MySQL memilih buku yang valid untuk kami. Tetapi bagaimana jika
Anda ingin mengetahui ID dari baris yang disisipkan? Anda dapat meminta MySQL
untuk buku dengan nomor ISBN yang sama dan baris yang dikembalikan akan berisi ID
tersebut, tetapi tampaknya ini membutuhkan banyak pekerjaan. Sebagai gantinya, PDO
memiliki metode lastInsertId, yang mengembalikan ID terakhir yang disisipkan oleh
kunci utama, sehingga menghemat pencarian ekstra.

C. Inserting data
Kami telah membuat tabel yang sempurna untuk menyimpan data kami, tetapi
sejauh ini tabel tersebut kosong. Sudah saatnya kita mengisi mereka. Kami telah
menunda momen ini karena memodifikasi tabel dengan data lebih sulit daripada saat
kosong.
Untuk memasukkan data ini, kami menggunakan perintah INSERT INTO. Perintah
ini menggunakan nama tabel, bidang yang ingin Anda isi, dan data untuk setiap bidang.
Perhatikan bahwa Anda dapat memilih untuk tidak menentukan nilai suatu bidang, dan
ada beberapa alasan untuk melakukannya, yaitu:
• Bidang memiliki nilai default dan kami ingin menggunakannya untuk baris
khusus ini

ISYS6307 – Data and Information Management


• Meskipun bidang tidak memiliki nilai default eksplisit, bidang tersebut dapat
memiliki nilai null; jadi, dengan tidak menentukan kolomnya, MySQL akan
secara otomatis memasukkan nilai null di sini
• Field adalah primary key dan auto-incremental, dan kami ingin MySQL
mengambil ID berikut untuk kami.

Ada beberapa alasan mengapa perintah INSERT INTO gagal:


• Jika Anda tidak menentukan nilai bidang dan MySQL tidak dapat memberikan
nilai default yang valid
• Jika nilai yang ditentukan bukan dari jenis bidang dan MySQL tidak dapat
menemukan konversi yang valid
• Jika Anda menentukan bahwa Anda ingin menyetel nilai untuk sebuah bidang,
tetapi Anda tidak menentukan nilainya
• Jika Anda menentukan kunci asing dengan ID, tetapi ID tidak ada dalam tabel
yang direferensikan

Mari kita lihat cara menambahkan baris. Mari kita mulai dengan tabel klien kita, dengan
tabel dasar dan tabel premium, sebagai berikut:

mysql> INSERT INTO customer (firstname, surname, email,


type)
-> VALUES ("Han", "Solo", "han@tatooine.com",
"premium");
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO customer (firstname, surname, email,
type)
-> VALUES ("James", "Kirk", "enter@prise", "basic");
Query OK, 1 row affected (0.00 sec)

Perhatikan bahwa MySQL menunjukkan beberapa informasi pengembalian;


dalam hal ini menunjukkan bahwa satu baris terpengaruh, yaitu baris yang kita sisipkan.
Kami tidak memberikan ID, jadi MySQL baru saja menambahkan yang berikut ini ke

ISYS6307 – Data and Information Management


daftar. Karena ini pertama kalinya kami menambahkan data, MySQL menggunakan ID 1
dan 2.
Mari kita coba mengelabui MySQL dan menambahkan klien lain, ulangi bidang
alamat email yang kami tetapkan sebagai unik di bagian sebelumnya:

mysql> INSERT INTO customer (firstname, surname, email,


type)
-> VALUES ("Mr", "Spock", "enter@prise", "basic");
ERROR 1062 (23000): Duplicate entry 'enter@prise' for key
'email'

Kesalahan dikembalikan dengan kode kesalahan dan pesan kesalahan, dan baris
tentu saja tidak dimasukkan. Pesan kesalahan biasanya berisi informasi yang cukup untuk
memahami dan menyelesaikan masalah. Jika tidak, kami selalu dapat mencoba mencari
web menggunakan kode kesalahan dan mencatat apa yang dikatakan oleh dokumentasi
resmi atau pengguna lain tentangnya. Jika Anda perlu menambahkan beberapa baris ke
tabel yang sama dan berisi bidang yang sama, ada versi perintah yang lebih pendek, di
mana Anda dapat menentukan bidang dan kemudian menentukan grup nilai untuk setiap
baris. Mari kita lihat cara menggunakannya dalam menambahkan buku ke tabel buku
kita, sebagai berikut:

mysql> INSERT INTO book (isbn,title,author,stock,price)


VALUES
-> ("9780882339726","1984","George Orwell",12,7.50),
-> ("9789724621081","1Q84","Haruki Murakami",9,9.75),
-> ("9780736692427","Animal Farm","George
Orwell",8,3.50),
-> ("9780307350169","Dracula","Bram Stoker",30,10.15),
-> ("9780753179246","19 minutes","Jodi Picoult",0,10);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

ISYS6307 – Data and Information Management


Untuk klien, kami tidak akan menentukan ID dan membiarkan MySQL memilih
yang benar. Perhatikan juga bahwa jumlah baris yang terlibat sekarang adalah 5 saat kami
memasukkan lima baris. Bagaimana kita dapat memanfaatkan pengaturan default
eksplisit yang telah kita tentukan di tabel kita? Nah, kita bisa melakukan ini dengan cara
yang sama seperti dengan kunci utama: jangan tentukan di daftar bidang atau di daftar
nilai, dan MySQL hanya akan menggunakan nilai default. Misalnya, kami telah
menetapkan nilai default 1 untuk bidang book.stock kami, yang merupakan format yang
berguna untuk tabel buku dan bidang stok. Mari tambahkan baris lain dengan default ini
sebagai berikut:

mysql> INSERT INTO book (isbn,title,author,price) VALUES


-> ("9781416500360", "Odyssey", "Homer", 4.23);
Query OK, 1 row affected (0.00 sec)

Sekarang kita memiliki buku dan pelanggan, mari tambahkan beberapa data
historis tentang pelanggan yang meminjam buku. Untuk melakukan ini, gunakan nomor
buku dan pelanggan, seperti pada kode berikut:

mysql> INSERT INTO borrowed_books


book_id,customer_id,start,end)
-> VALUES
-> (1, 1, "2014-12-12", "2014-12-28"),
-> (4, 1, "2015-01-10", "2015-01-13"),
-> (4, 2, "2015-02-01", "2015-02-10"),
-> (1, 2, "2015-03-12", NULL);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

D. Querying data
Ini memakan cukup banyak waktu, tetapi akhirnya kami berada di bagian yang
paling menarik - dan berguna - mengenai database: kueri data. Kueri data mengacu pada
meminta MySQL untuk mengembalikan baris dari tabel yang ditentukan dan secara
opsional memfilter hasil ini dengan serangkaian aturan. Anda juga dapat memilih untuk

ISYS6307 – Data and Information Management


mendapatkan bidang tertentu alih-alih seluruh baris. Untuk melakukan kueri data, kami
menggunakan pernyataan SELECT, sebagai berikut:

mysql> SELECT firstname, surname, type FROM customer;


+-----------+---------+---------+
| firstname | surname | type |
+-----------+---------+---------+
| Han | Solo | premium |
| James | Kirk | basic |
+-----------+---------+---------+
2 rows in set (0.00 sec)

Ini memakan cukup banyak waktu, tetapi akhirnya kami berada di bagian yang
paling menarik - dan berguna - mengenai database: kueri data. Kueri data mengacu pada
meminta MySQL untuk mengembalikan baris dari tabel yang ditentukan dan secara
opsional memfilter hasil ini dengan serangkaian aturan. Anda juga dapat memilih untuk
mendapatkan bidang tertentu alih-alih seluruh baris. Untuk melakukan kueri data, kami
menggunakan pernyataan SELECT, sebagai berikut:
Salah satu cara termudah untuk mengkueri data adalah dengan menentukan
bidang minat setelah SELECT dan tentukan tabel dengan kata kunci FROM. Karena kami
tidak menambahkan filter - biasanya dikenal sebagai kondisi - ke kueri, kami memiliki
semua baris di sana. Terkadang ini adalah perilaku yang diinginkan, tetapi yang paling
umum adalah menambahkan kondisi ke kueri untuk hanya mendapatkan baris yang kita
butuhkan. Gunakan kata kunci WHERE untuk mencapai ini.
mysql> SELECT firstname, surname, type FROM customer
-> WHERE id = 1;
+-----------+---------+---------+
| firstname | surname | type |
+-----------+---------+---------+
| Han | Solo | premium |
+-----------+---------+---------+
1 row in set (0.00 sec)

ISYS6307 – Data and Information Management


Menambahkan kondisi sangat mirip dengan saat kita membuat ekspresi Boolean
di PHP. Kami menentukan nama bidang, operator dan nilai, dan MySQL hanya
mendapatkan baris yang mengembalikan true ke ekspresi ini. Dalam hal ini, kami
bertanya tentang pelanggan dengan ID 1 dan MySQL mengembalikan satu baris: yang
memiliki ID persis 1.
Pertanyaan umum adalah mendapatkan buku yang dimulai dengan beberapa teks.
Kami tidak dapat membuat ekspresi ini dengan operan perbandingan yang Anda ketahui,
seperti = dan <or>, karena kami hanya ingin mencocokkan bagian dari string. Untuk ini,
MySQL memiliki operator LIKE, yang mengambil string yang dapat berisi wildcard.
Karakter pengganti adalah karakter yang mewakili baris dan cocok dengan sejumlah
karakter yang diikuti baris tersebut. Misalnya,% wildcard mewakili sejumlah karakter,
jadi menggunakan string 1% akan cocok dengan string apa pun yang dimulai dengan 1
dan diikuti oleh satu atau lebih karakter, string yang cocok seperti 1984 atau 1Q84. Mari
pertimbangkan contoh berikut:

mysql> SELECT title, author, price FROM book


-> WHERE title LIKE "1%";
+------------+-----------------+-------+
| title | author | price |
+------------+-----------------+-------+
| 1984 | George Orwell | 7.5 |
| 1Q84 | Haruki Murakami | 9.75 |
| 19 minutes | Jodi Picoult | 10 |
+------------+-----------------+-------+
3 rows in set (0.00 sec)

Kami meminta semua buku dengan judul dimulai dengan 1, dan kami mendapat
tiga baris. Bisa dibayangkan betapa bergunanya operator ini, terutama saat kita
mengimplementasikan mesin pencari dalam aplikasi kita.
Seperti di PHP, MySQL juga memungkinkan Anda untuk menambahkan operator
logika, yaitu operator yang menggunakan operan dan melakukan operasi logis,
menghasilkan nilai Boolean. Operator logika yang paling umum adalah, seperti di PHP,

ISYS6307 – Data and Information Management


AND dan OR. AND mengembalikan true jika kedua ekspresi benar dan OR
mengembalikan true jika salah satu operan benar. Mari kita ambil contoh sebagai berikut:
mysql> SELECT title, author, price FROM book
-> WHERE title LIKE "1%" AND stock > 0;
+------------+-----------------+-------+
| title | author | price |
+------------+-----------------+-------+
| 1984 | George Orwell | 7.5 |
| 1Q84 | Haruki Murakami | 9.75 |
+------------+-----------------+-------+
2 rows in set (0.00 sec)

Contoh ini sangat mirip dengan yang sebelumnya, tetapi kami menambahkan
ketentuan tambahan. Kami meminta semua judul dimulai dengan 1 dan apakah ada stok.
Inilah mengapa salah satu buku tidak ditampilkan karena tidak memenuhi kedua syarat
tersebut. Anda dapat menambahkan ketentuan sebanyak yang Anda butuhkan dengan
operator logika, tetapi perlu diingat bahwa operator DAN lebih diutamakan daripada
ATAU. Jika Anda ingin mengubah prioritas ini, Anda selalu dapat meletakkan ekspresi
dalam tanda kurung, seperti di PHP. Sejauh ini kami telah mengambil bidang tertentu
saat melakukan kueri data, tetapi kami dapat meminta semua bidang dalam tabel tertentu.
Untuk melakukan ini kita hanya menggunakan * wildcard di SELECT. Mari pilih semua
bidang untuk pelanggan melalui kode berikut:

mysql> SELECT * FROM customer \G


*************************** 1. row
***************************
id: 1
firstname: Han
surname: Solo
email: han@tatooine.com
type: premium
*************************** 2. row
***************************
id: 2

ISYS6307 – Data and Information Management


firstname: James
surname: Kirk
email: enter@prise
type: basic
2 rows in set (0.00 sec)

Anda bisa mendapatkan informasi lebih dari sekedar bidang. Misalnya, Anda
dapat menggunakan COUNT untuk mendapatkan jumlah baris yang memenuhi kondisi
yang diberikan daripada mendapatkan semua kolom. Dengan cara ini, ini lebih cepat
daripada mendapatkan semua kolom dan kemudian menghitungnya saat Anda
menghemat waktu dengan mengurangi ukuran respons. Mari kita lihat seperti apa:

mysql> SELECT COUNT(*) FROM borrowed_books


-> WHERE customer_id = 1 AND end IS NOT NULL;
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)

Seperti yang Anda perhatikan, jawabannya adalah 1, yang berarti hanya ada satu
buku pinjaman yang memenuhi persyaratan. Namun, periksa kondisinya; Anda akan
melihat bahwa kami menggunakan operator logika terkenal lainnya: NOT. NOT
menyangkal ungkapan seperti! lakukan di PHP. Perhatikan juga bahwa kami tidak
menggunakan tanda sama dengan untuk membandingkan dengan nilai nol. Di MySQL,
Anda harus menggunakan IS, bukan tanda sama dengan untuk membandingkannya
dengan NULL. Jadi, kondisi kedua akan terpenuhi jika buku yang dipinjam memiliki
tanggal akhir bukan nol.
Mari akhiri bagian ini dengan menambahkan dua fungsi lagi saat membuat kueri
data. Yang pertama adalah kemampuan untuk menentukan urutan baris harus
dikembalikan. Untuk melakukan ini, gunakan kata kunci ORDER BY diikuti dengan nama
bidang yang ingin Anda pesan. Anda juga bisa menentukan apakah ingin memesan dalam

ISYS6307 – Data and Information Management


mode ascending, yang standar, atau dalam mode descending, yang dapat dilakukan
dengan menambahkan DESC. Fungsi lainnya adalah kemampuan untuk membatasi jumlah
baris yang akan dikembalikan dengan LIMIT dan jumlah baris yang akan diambil.
Sekarang lakukan hal berikut:

mysql> SELECT id, title, author, isbn FROM book


-> ORDER BY title LIMIT 4;
+----+-------------+-----------------+---------------+
| id | title | author | isbn |
+----+-------------+-----------------+---------------+
| 5 | 19 minutes | Jodi Picoult | 9780753179246 |
| 1 | 1984 | George Orwell | 9780882339726 |
| 2 | 1Q84 | Haruki Murakami | 9789724621081 |
| 3 | Animal Farm | George Orwell | 9780736692427 |
+----+-------------+-----------------+---------------+
4 rows in set (0.00 sec)

E. Updating
Kami sudah tahu banyak tentang penyisipan dan pengambilan data, tetapi jika
aplikasi dapat melakukan ini sendiri, mereka akan sangat statis. Mengedit data ini sesuai
kebutuhan adalah hal yang membuat aplikasi dinamis dan yang memberi pengguna
beberapa nilai. Di MySQL, dan di sebagian besar sistem database, Anda memiliki dua
perintah untuk mengubah data: UPDATE dan DELETE. Mari kita bahas secara detail.
Saat memperbarui data di MySQL, yang paling penting adalah memiliki referensi
unik dari baris yang ingin Anda perbarui. Kunci primer sangat berguna untuk ini; Namun,
jika Anda memiliki tabel tanpa kunci utama, yang biasanya tidak demikian, Anda masih
dapat memperbarui baris berdasarkan bidang lain. Selain referensi, Anda akan
membutuhkan nilai baru dan tentu saja nama tabel dan field untuk diperbarui. Mari
pertimbangkan contoh yang sangat sederhana:
mysql> UPDATE book SET price = 12.75 WHERE id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

ISYS6307 – Data and Information Management


Dalam pencarian UPDATE ini, kami menetapkan harga buku dengan ID 2
menjadi 12.75. Klausul SET tidak harus menentukan hanya satu perubahan; Anda dapat
menentukan beberapa perubahan dalam baris yang sama segera setelah Anda
memisahkannya dengan koma, misalnya SET price = 12.75, stock = 14. Perhatikan
juga klausa WHERE, di mana kami menentukan baris mana yang ingin kami ubah. MySQL
mengambil semua baris dari tabel ini berdasarkan kondisi ini seolah-olah itu adalah kueri
SELECT dan menerapkan perubahan ke kumpulan baris ini.
Apa yang dikembalikan MySQL sangat penting - jumlah baris yang cocok dan
jumlah baris telah berubah. Yang pertama adalah jumlah baris yang sesuai dengan
kondisi pada klausa WHERE. Yang kedua menentukan jumlah baris yang dapat diubah.
Ada beberapa alasan untuk tidak mengubah baris, seperti ketika baris tersebut sudah
memiliki nilai yang sama. Untuk melihat ini, mari jalankan kueri yang sama lagi:

mysql> UPDATE book SET price = 12.75 WHERE id = 2;


Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0

Baris yang sama sekarang mengatakan 1 baris cocok seperti yang diharapkan,
tetapi 0 baris berubah. Alasannya adalah kami telah menetapkan harga buku ini pada
12.75, jadi MySQL tidak perlu melakukan apa-apa sekarang.
Seperti yang disebutkan sebelumnya, klausa WHERE adalah bit terpenting dalam
kueri ini. Terlalu sering kita melihat pengembang menjalankan query UPDATE yang tidak
bersalah secara apriori mengubah seluruh tabel karena mereka tidak memiliki klausa
WHERE; Jadi MySQL mencocokkan seluruh tabel sebagai baris yang valid untuk
diperbarui. Ini biasanya bukan maksud pengembang, juga tidak menyenangkan, jadi
cobalah untuk memastikan Anda selalu memberikan sekumpulan ketentuan yang valid.
Merupakan praktik yang baik untuk terlebih dahulu menuliskan query SELECT yang
mengembalikan baris yang perlu Anda edit, dan setelah Anda yakin bahwa kondisinya
cocok dengan kumpulan baris yang diinginkan, Anda dapat menulis kueri UPDATE.
Namun, terkadang skenario yang dimaksudkan adalah memengaruhi beberapa
baris. Bayangkan kita sedang melalui masa-masa sulit dan harus menaikkan harga semua

ISYS6307 – Data and Information Management


buku kita. Kami memutuskan ingin menaikkan harga sebesar 16%, yang sama dengan
harga saat ini dikalikan 1,16. Kami dapat menjalankan kueri berikut untuk membuat
perubahan ini:
mysql> UPDATE book SET price = price * 1.16;
Query OK, 8 rows affected (0.00 sec)
Rows matched: 8 Changed: 8 Warnings: 0

Pencarian ini tidak mengandung klausa WHERE karena kami ingin mencocokkan
semua buku kami. Perhatikan juga bahwa klausul SET menggunakan kolom harga untuk
mendapatkan nilai saat ini untuk harga, yang benar-benar valid. Terakhir, tuliskan jumlah
baris yang cocok dan dimodifikasi, yaitu 8 - seluruh rangkaian baris untuk tabel ini.
Untuk menyelesaikan subbagian ini, mari kita lihat bagaimana menggunakan
query UPDATE dari PHP ke PDO. Skenario umum adalah ketika kami ingin
menambahkan salinan dari buku yang sudah ada ke inventaris kami. Dengan adanya ID
buku dan jumlah buku opsional - secara default nilainya adalah 1 - kami akan
meningkatkan nilai inventaris buku ini sebanyak itu. Tulis fungsi ini di file init.php Anda:

function addBook(int $id, int $amount = 1): void {


$db = new PDO(
'mysql:host=127.0.0.1;dbname=bookstore',
'root',
''
);
$query = 'UPDATE book SET stock = stock + :n WHERE id =
:id';
$statement = $db->prepare($query);
$statement->bindValue('id', $id);
$statement->bindValue('n', $amount);
if (!$statement->execute()) {
throw new Exception($statement->errorInfo()[2]);
}
}

ISYS6307 – Data and Information Management


Ada dua argumen: $ id dan $ jumlah. Yang pertama akan selalu wajib, sedangkan
yang kedua dapat dihilangkan, dan nilai defaultnya adalah 1. Fungsi pertama menyiapkan
pencarian yang mirip dengan yang pertama dari bagian ini, di mana kita memiliki
inventaris buku tertentu, lalu mengikat kedua parameter tersebut pernyataan dan akhirnya
menjalankan kueri. Jika terjadi sesuatu dan mengeksekusi kembali false, kami akan
melempar pengecualian dengan isi pesan kesalahan dari MySQL.
Fitur ini sangat berguna ketika kita membeli lebih banyak stok atau pelanggan
mengembalikan buku. Kami bahkan dapat menggunakannya untuk menghapus buku
dengan memberikan nilai negatif $ jumlah, tetapi ini adalah praktik yang sangat buruk.
Alasannya adalah walaupun kita memaksa stock field unsigned, settingnya ke nilai
negatif tidak akan menyebabkan error, hanya peringatan. MySQL tidak akan menetapkan
baris ke nilai negatif, tetapi panggilan eksekusi akan mengembalikan nilai true, dan kita
tidak akan mengetahuinya. Lebih baik buat saja metode kedua, removeBook, dan periksa
dulu apakah jumlah buku yang akan dihapus kurang dari atau sama dengan inventaris
saat ini.

F. Deleting data
Menghapus data hampir sama dengan mengupdatenya. Anda harus memberikan
klausa WHERE yang sesuai dengan baris yang ingin Anda hapus. Seperti halnya
memperbarui data, sangat disarankan untuk terlebih dahulu membangun query SELECT
yang akan mendapatkan baris yang ingin Anda hapus sebelum menjalankan perintah
DELETE. Jangan berpikir bahwa Anda membuang-buang waktu dengan metodologi ini;
seperti kata pepatah: ukur dua kali, potong sekali. Tidak selalu mungkin untuk
memulihkan data setelah menghapus baris!
Mari kita coba untuk menghapus sebuah buku dengan melihat bagaimana opsi
CASCADE yang kita setel sebelumnya berperilaku. Untuk melakukan ini, mari kita
request dulu daftar buku yang ada yang dipinjamkan melalui yang berikut ini:

mysql> SELECT book_id, customer_id FROM borrowed_books;


+---------+-------------+
| book_id | customer_id |

ISYS6307 – Data and Information Management


+---------+-------------+
| 1 | 1 |
| 4 | 1 |
| 4 | 2 |
| 1 | 2 |
+---------+-------------+
4 rows in set (0.00 sec)

Ada dua buku yang berbeda, 1 dan 4, masing-masing dipinjam dua kali. Ayo coba
hapus buku dengan ID 4. Pertama buat kueri seperti SELECT * FROM book WHERE id
= 4 untuk memastikan kondisi di klausa WHERE sudah benar. Jika Anda yakin, lakukan
pencarian berikut:
mysql> DELETE FROM book WHERE id = 4;
Query OK, 1 row affected (0.02 sec)

Seperti yang Anda lihat, kami hanya menentukan perintah DELETE FROM, diikuti
dengan nama tabel dan klausa WHERE. MySQL memberi tahu kita bahwa 1 baris
terpengaruh, yang masuk akal mengingat pernyataan SELECT sebelumnya yang kami
buat.
Jika kita kembali ke tabel borrow_books kita dan melakukan pencarian untuk
tabel yang sudah ada, kita akan melihat bahwa semua baris yang mengacu pada buku
dengan ID 4 telah hilang. Ini karena saat menghapus tabel books, MySQL
memperhatikan referensi ke foreign key, memeriksa apa yang harus dilakukan saat
menghapus CASCADE dalam kasus ini - dan juga menghapus baris di borrow_books.
Simak berikut ini:
mysql> SELECT book_id, customer_id FROM borrowed_books;
+---------+-------------+
| book_id | customer_id |
+---------+-------------+
| 1 | 1 |
| 1 | 2 |
+---------+-------------+
2 rows in set (0.00 sec)

ISYS6307 – Data and Information Management


KESIMPULAN

1. PHP Data Objects (PDO) adalah kelas yang menghubungkan dan berinteraksi dengan
database. Dengan PDO Anda dapat bekerja dengan sistem database yang berbeda, jadi
Anda tidak hanya terikat pada MySQL.
2. perintah INSERT INTO digunakan untuk menambah data pada tabel.
3. Query data mengacu pada meminta MySQL untuk mengembalikan baris dari tabel yang
ditentukan dan secara opsional memfilter hasil ini dengan serangkaian aturan.
4. Mengedit data ini sesuai kebutuhan adalah hal yang membuat aplikasi dinamis dan yang
memberi pengguna beberapa nilai. Di MySQL, dan di sebagian besar sistem database,
Anda memiliki dua perintah untuk mengubah data: UPDATE dan DELETE.

ISYS6307 – Data and Information Management


DAFTAR PUSTAKA

1. Antonio Lopez. (2016). Learning PHP 7. Published by Packt Publishing Ltd. Livery
Place 35 Livery Street. Birmingham B3 2PB, UK. ISBN 978-1-78588-054-4.
.

ISYS6307 – Data and Information Management

Anda mungkin juga menyukai