Pendahuluan

Di kantor saya ditugaskan membuat semacam custom report dari Magento, yang mana report tersebut diambil langsung dari database dengan menggunakan query dari MySQL. Dalam pengerjaan tersebut, saya membuat semacam table generator yang bersumber dari hasil query. Kemudian disajikan dalam bentuk berkas .csv yang nantinya dapat diolah dengan MS Excel atau sejenisnya.

Dari hasil kerjaan tersebut, saya mencoba menuangkannya dalam bentuk artikel. Akan tetapi, tidak 100% sesuai dengan kode sumber yang saya buat di kantor. Hanya dasarnya saja yang saya bagikan di sini, selebihnya nanti kalian bisa kembangkan sendiri.

Identifikasi Masalah

Sebagai PHP developer kalian pasti pernah menggunakan phpMyAdmin atau Adminer atau sejenis aplikasi pengelola database MySQL. Ketika kalian menuliskan query, secara otomatis aplikasi tersebut menampilkan dalam bentuk table._ Table header_ mengambil hasil dari field sedangkan datanya diambil dari value.

Kira-kira gambarannya seperti berikut:

img

Sumber: https://www.hostinger.es/tutoriales/wp-content/uploads/sites/7/2018/05/hositnger-phpmyadmin-php-insertar-en-mysql-final.png

Secara umum kode php procedural untuk menampilkan hasil query dalam bentuk table adalah sebagai berikut:

<?php

$query = 'SELECT * FROM mytable';
$query = mysqli_query($connection, $query);

echo '<table>';
echo '<tr><th>Name</th><th>Address</th></tr>';

while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
    $name = $row['name'];
    $address = $row['address'];
    echo '<tr><td>'.$name.'</td><td>'.$address.'</td></tr>';
}

Seperti yang terlihat dari kode di atas. Ketika memanggil value-nya kita menuliskan manual table header <th> dan untuk mendapatkan hasil value-nya dengan mengambil array sesuai nama dari field yang ditulis secara manual.

Lalu bagiamana jika kita tidak tahu berapa banyak field dari hasil query kita yang dinamis? Oleh karena itu, kode di atas tidak dapat diimplementasikan untuk kebutuhan query yang digunakan secara dinamis.

Penyelesaian

Saya mencoba membuat kode sederhana untuk mendapatkan hasil query dinamis dari database. Berikut ini kodenya:

<?php
function formatPeriod($endtime, $starttime)
{
    $duration = $endtime - $starttime;
    $hours = (int) ($duration / 60 / 60);
    $minutes = (int) ($duration / 60) - $hours * 60;
    $seconds = (int) $duration - $hours * 60 * 60 - $minutes * 60;
    return ($hours == 0 ? "00":$hours) . ":" .
        ($minutes == 0 ? "00":($minutes < 10? "0".$minutes:$minutes)) . ":" .
        ($seconds == 0 ? "00":($seconds < 10? "0".$seconds:$seconds));
}

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mysql";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM user";
$result = $conn->query($sql);

$start = microtime(true);
$theTitle = date('Ymd') . '-hasilQuery';
$theFile = __DIR__ . '/' . $theTitle .'.csv';

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $tables[]=$row;
}

$file = fopen($theFile,"w");

echo '<table border="1"><tr>';
foreach ($tables[0] as $key => $value)
{
    echo "<th>{$key}</th>";
    $keys[] = $key;
}
echo '</tr>';

fputcsv($file,$keys);

foreach ($tables as $value)
{
    echo '<tr>';
    foreach($keys as $key) {
        echo '<td>' . $value[$key] . '</td>';
    }
    echo '</tr>';
    fputcsv($file,$value);
}

echo '</table>';
$conn->close();
fclose($file);
$time_elapsed_secs = formatPeriod(microtime(true),$start);
echo "<p><h2>{$time_elapsed_secs}</h2></p>";

echo "Download: <a href=\"{$theTitle}.csv\">{$theTitle}.cvs</a>";

Kode simpel di atas dapat kalian pakai untuk kebutuhan pembuatan table sederhana dengan query apapun, asalkan valid. Nah kode di atas juga saya sisipkan microtime dengan format jam (00:00:00) guna mengetahui berapa waktu yang dihabiskan server menarik data dari hasil query. Saya sisipkan pula metode export data to cvs dengan demikian hasilnya bisa kita olah diaplikasi seperti MS Excel atau sejenisnya.

Akhir kata, semoga bermanfaat. 😁