BAB 5 MENGAKSES MySQL MENGGUNAKAN PHP
5.3 Membangun dan Mengeksekusi Kueri
Mengirim kueri ke MySQL dari PHP dengan mysqli semudah mengeluarkannya menggunakan metode kueri. Contoh dibawah ini menunjukkan cara menggunakannya.
Contoh Membuat kueri database dengan mysqli
<?php
$query = "SELECT * FROM classics";
$result = $connection->query($query);
if (!$result) die($connection->error);
?>
Variabel $query diatur ke kueri yang akan dibuat, tetapi di sini nilai ini diteruskan ke metode kueri objek $connection, yang mengembalikan hasil yang kita tempatkan di objek
$result. kita telah melakukan semua yang kita butuhkan dengan $connection dan beralih ke
$result untuk menikmati apa yang telah dikembalikan dari koneksi. $result akan menjadi FALSE jika ada kesalahan; jika tidak, itu akan menjadi objek yang dapat diakses. Properti kesalahan $connection berisi string yang merinci kesalahan apa pun.
Mengambil hasil
Setelah objek dikembalikan dalam $result, kita dapat menggunakannya untuk mengambil data yang diinginkan, satu item dalam satu waktu, menggunakan metode fetch_assoc objek. Contoh selanjutnya adalah menggabungkan dan memperluas contoh sebelumnya ke dalam program yang dapat kita ketik dan jalankan sendiri untuk mengambil hasil ini. Saya sarankan kita menyimpan skrip ini menggunakan nama file query-mysqli.php.
Contoh Mengambil hasil dengan mysqli, satu sel pada satu waktu
<?php // query-mysqli.php require_once 'login.php';
$connection =
new mysqli($db_hostname, $db_username, $db_password, $db_database);
if ($connection->connect_error) die($connection->connect_error)
$query = "SELECT * FROM classics";
$result = $connection->query($query);
if (!$result) die($connection->error);
$rows = $result->num_rows;
for ($j = 0 ; $j < $rows ; ++$j) {
$result->data_seek($j);
echo 'Author: ' . $result->fetch_assoc()['author'] . '<br>';
$result->data_seek($j);
echo 'Title: ' . $result->fetch_assoc()['title'] . '<br>';
$result->data_seek($j);
echo 'Category: ' . $result->fetch_assoc()['category'] . '<br>';
$result->data_seek($j);
echo 'Year: ' . $result->fetch_assoc()['year'] . '<br>';
$result->data_seek($j);
echo 'ISBN: ' . $result->fetch_assoc()['isbn'] . '<br><br>';
}
$result->close();
$connection->close();
?>
Di sini, untuk mencari baris yang benar setiap kali di sekitar loop, kita memanggil metode data_seek dari $result sebelum mengambil setiap item data. Kemudian kita memanggil metode fetch_assoc untuk mengambil nilai yang disimpan di setiap sel, dan menampilkan hasilnya menggunakan perintah echo. Kita mungkin akan setuju bahwa semua pencarian data ini agak rumit dan harus ada metode yang lebih efisien untuk mencapai hasil yang sama. Dan, memang, ada metode yang lebih baik, yaitu mengekstrak satu baris sekaligus.
Mengambil baris
Untuk mengambil satu baris pada satu waktu, ganti loop for dari Contoh sebelumnya dengan yang disorot dalam huruf tebal pada Contoh dibawah dan kita akan menemukan
bahwa kita mendapatkan hasil yang sama persis. Kita mungkin ingin menyimpan file yang direvisi ini sebagai fetchrow-mysqli.php.
Contoh Mengambil hasil dengan mysqli, satu per satu
<?php //fetchrow-mysqli.php require_once 'login.php';
$connection =
new mysqli($db_hostname, $db_username, $db_password, $db_database);
if ($connection->connect_error) die($connection->connect_error);
$query = "SELECT * FROM classics";
$result = $connection->query($query);
if (!$result) die($connection->error);
$rows = $result->num_rows;
for ($j = 0 ; $j < $rows ; ++$j) {
$result->data_seek($j);
$row = $result->fetch_array(MYSQLI_ASSOC);
echo 'Author: ' . $row['author'] . '<br>';
echo 'Title: ' . $row['title'] . '<br>';
echo 'Category: ' . $row['category'] . '<br>';
echo 'Year: ' . $row['year'] . '<br>';
echo 'ISBN: ' . $row['isbn'] . '<br><br>';
}
$result->close();
$connection->close();
?>
Dalam kode yang dimodifikasi ini, hanya seperlima dari interogasi objek $result yang dibuat, dan hanya satu pencarian ke objek yang dilakukan di setiap iterasi loop, karena setiap baris diambil secara keseluruhan melalui metode fetch_array. Ini mengembalikan satu baris data sebagai array, yang kemudian ditetapkan ke array $row. Metode fetch_array dapat mengembalikan tiga jenis array sesuai dengan nilai yang diteruskan ke sana:
MYSQLI_NUM
Array numerik. Setiap kolom muncul dalam larik sesuai urutan yang kita tentukan saat kita membuat (atau mengubah) tabel. Dalam kasus kami, elemen ke nol dari array berisi kolom Penulis, elemen 1 berisi Judul, dan seterusnya.
MYSQLI_ASSOC
Array asosiatif. Setiap kunci adalah nama kolom. Karena item data direferensikan dengan nama kolom (bukan nomor indeks), gunakan opsi ini jika memungkinkan dalam kode kita untuk mempermudah proses debug dan membantu programmer lain mengelola kode kita dengan lebih baik.
MYSQLI_BOTH
Array asosiatif dan numerik. Array asosiatif biasanya lebih berguna daripada numerik karena kita dapat merujuk ke setiap kolom dengan nama, seperti $row['author'], daripada mencoba mengingat di mana letaknya dalam urutan kolom. Jadi skrip ini menggunakan array asosiatif, mengarahkan kita untuk melewati MYSQLI_ASSOC.
Menutup koneksi
PHP pada akhirnya akan mengembalikan memori yang telah dialokasikan untuk objek setelah kita selesai dengan skrip, jadi dalam skrip kecil, kita biasanya tidak perlu khawatir
melepaskan memori sendiri. Namun, jika kita mengalokasikan banyak objek hasil atau mengambil data dalam jumlah besar, sebaiknya kita mengosongkan memori yang telah digunakan untuk mencegah masalah di skrip kita nanti.
Pada halaman yang memiliki lalu lintas tinggi hal ini menjadi sangat penting karena jumlah memori yang dikonsumsi dalam satu sesi dapat bertambah dengan cepat. Oleh karena itu, perhatikan panggilan ke metode close objek $result dan $connection di skrip sebelumnya, segera setelah setiap objek tidak lagi diperlukan. Idealnya, kita harus menutup setiap objek hasil ketika kita telah selesai menggunakannya, dan kemudian menutup objek koneksi ketika skrip kita tidak akan mengakses MySQL lagi. Praktik terbaik ini memastikan bahwa sumber daya dikembalikan ke sistem secepat mungkin untuk menjaga MySQL tetap berjalan secara optimal, dan mengurangi keraguan apakah PHP akan mengembalikan memori yang tidak terpakai tepat waktu ketika kita membutuhkannya lagi.
Contoh Praktis
Sekarang mari kita tulis ulang program sqltest.php prosedural dari bab sebelumnya menggunakan mysqli. Konversinya cukup mudah, seperti yang kita lihat pada Contoh dibawah (yang harus kita simpan sebagai mysqlitest.php jika kita ingin mengujinya, karena ia terus memanggil dirinya sendiri).
Contoh Memasukkan dan menghapus menggunakan mysqlitest.php
<?php // mysqlitest.php require_once 'login.php';
$connection =
new mysqli($db_hostname, $db_username, $db_password, $db_database);
if ($connection->connect_error) die($connection->connect_error);
if (isset($_POST['delete']) && isset($_POST['isbn'])) {
$isbn = get_post($connection, 'isbn');
$query = "DELETE FROM classics WHERE isbn='$isbn'";
$result = $connection->query($query);
if (!$result) echo "DELETE failed: $query<br>" .
$connection->error . "<br><br>";
}
if (isset($_POST['author']) &&
isset($_POST['title']) &&
isset($_POST['category']) &&
isset($_POST['year']) &&
isset($_POST['isbn'])) {
$author = get_post($connection, 'author');
$title = get_post($connection, 'title');
$category = get_post($connection, 'category');
$year = get_post($connection, 'year');
$isbn = get_post($connection, 'isbn');
$query = "INSERT INTO classics VALUES" .
"('$author', '$title', '$category', '$year', '$isbn')";
$result = $connection->query($query);
if (!$result) echo "INSERT failed: $query<br>" .
$connection->error . "<br><br>";
}
echo <<<_END
<form action="mysqlitest.php" method="post"><pre>
Author <input type="text" name="author">
Title <input type="text" name="title">
Category <input type="text" name="category">
Year <input type="text" name="year">
ISBN <input type="text" name="isbn">
<input type="submit" value="ADD RECORD">
</pre></form>
END;
$query = "SELECT * FROM classics";
$result = $connection->query($query);
if (!$result) die ("Database access failed: " . $connection->error);
$rows = $result->numrows;
for ($j = 0 ; $j < $rows ; ++$j) {
$result->data_seek($j);
$row = $result->fetch_array(MYSQLI_NUM);
echo <<<_END
<pre>
Author $row[0]
Title $row[1]
Category $row[2]
Year $row[3]
ISBN $row[4]
</pre>
<form action="mysqlitest.php" method="post">
<input type="hidden" name="delete" value="yes">
<input type="hidden" name="isbn" value="$row[4]">
<input type="submit" value="DELETE RECORD"></form>
END;
}
$result->close();
$connection->close();
function getpost($connection, $var) {
return $connection->real_escape_string($_POST[$var]);
}
?>
Pada beberapa baris pertama menarik kode dari login.php dan membuat objek
$connection untuk mendapatkan akses ke database. Lalu ada kode untuk menghapus entri, yang hanya mengeluarkan perintah DELETE ke objek $connection menggunakan metode kueri, dan mengembalikan pesan kesalahan jika ada masalah. Kemudian, jika data baru telah diposting ke program, program akan mengeluarkan perintah INSERT, sekali lagi pada objek
$connection menggunakan metode kueri. Dalam kedua contoh, objek $result diberikan hasil dari operasi ini, yang harus berupa TRUE atau FALSE. Bagian utama terakhir dari program ini berkaitan dengan mengekstraksi data dari database dan menampilkannya menggunakan metode data_seek dan fetch_array dari objek $result. Tidak seperti Contoh sebelumnya,
bagaimanapun, di mana array asosiatif dikembalikan, di sini metode fetch_array diberi nilai MYSQLI_NUM sehingga array numerik dikembalikan; karenanya, sel direferensikan secara numerik (mis., $row[0] untuk penulis). Hasilnya kemudian ditampilkan di setiap iterasi loop, dan akhirnya objek hasil dan koneksi ditutup. Fungsi get_post juga telah dimodifikasi di sini untuk menggunakan metode real_escape_string baru dari objek koneksi, jadi sekarang dua nilai diteruskan ke sana (koneksi dan nilai string).