Di mana kita harus menggunakan metode Fetch_assoc?

Saya memulai proyek blog kecil ini dan saya rasa saya baru saja membuat kesalahan dengan tidak menyertakan metode fetch_assoc. Ini kodenya:

$data = new database();
$sql = "SELECT * FROM post ";
 $article = $data->select($sql);
 foreach ($article as  $value) : ?>
 <div class="blog-post">
<h2 class="blog-post-title"><?= $value["blog_title"]; ?></h2>

dan seperti inilah tampilan metode pemilihannya:

public function select($sql){
     $result = $this->con->query($sql) or die($this->con->error.__LINE__);
     if ($result->num_rows > 0) {
        return $result;
     }else {
       return false;
     }
}

Saya ingin tahu mengapa ini berhasil bagi saya (judul blog muncul dengan benar) meskipun saya lupa memasukkan metode fetch_assoc?


person Fares Ars    schedule 04.07.2020    source sumber


Jawaban (1)


Anda tidak perlu menggunakan fetch_assoc() hampir sepanjang waktu. Jika Anda menulis semacam kelas abstraksi di sekitar mysqli maka Anda tidak perlu menggunakan fungsi mysqli apa pun secara langsung.

mysqli:query() mengembalikan objek bertipe mysqli_result yang dapat diubah. Ini berarti Anda dapat menggunakan loop foreach untuk mengulanginya.

Saya perlu menunjukkan bahwa Anda masih mengikuti beberapa praktik pemrograman yang buruk. Anda tidak boleh menggunakan or die($this->con->error.__LINE__). Ini adalah praktik pengkodean yang buruk dan sama sekali tidak diperlukan. Sebaliknya, Anda harus mengaktifkan pelaporan kesalahan yang tepat. Lihat Bagaimana cara mendapatkan pesan kesalahan di MySQLi?

Metode select() Anda seharusnya hanya mengembalikan sebuah array. Ini akan membuat kode Anda lebih mudah dan mengurangi rawan kesalahan. Jadi tulis ulang fungsi select() Anda menjadi ini:

public function select($sql){
    return $this->con->query($sql)->fetch_all(MYSQLI_ASSOC);
}

Seperti yang Anda lihat, seluruh fungsi adalah satu baris kode, yang berarti metode select() Anda tidak terlalu berguna. Anda dapat menggantinya dengan sesuatu yang lebih umum. Dengan cara ini Anda menghindari banyak pengulangan kode.

public function executeQuery(string $sql, array $params = []): ?array {
    // Prepare/bind/execute
    $stmt = $this->con->prepare($sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    // If it was a select query which gives result then return results in an array
    if ($result = $stmt->get_result()) {
        return $result->fetch_all(MYSQLI_BOTH);
    }
    // If it is INSERT/UPDATE then return null instead of array
    return null;
}

Tentu saja metode ini tidak boleh menjadi bagian dari model Anda. Ini harus menjadi bagian dari kelas khusus untuk komunikasi database. Anda kemudian dapat membuat satu instance di aplikasi Anda dan meneruskannya ke model Anda.

person Dharman    schedule 04.07.2020
comment
terima kasih @Dharman atas balasan Anda tetapi ,bind_param(str_repeat("s",count($params)), ...$params) kita dapat memiliki hal-hal lain seperti bilangan bulat, jadi kita memerlukan d alih-alih s dan untuk $params saya rasa kita memerlukan perulangan untuk memiliki semua parameter dimasukkan sebagai array di executeQuery methode - person Fares Ars; 05.07.2020
comment
@FaresArs 99,99% dari waktu Anda tidak memerlukan apa pun selain string. Namun jika Anda perlu menentukan jenisnya secara manual maka saya sarankan membaca artikel singkat ini: phpdelusions.net/mysqli/simple - person Dharman; 05.07.2020