เราควรใช้วิธี fetch_assoc ที่ไหน

ฉันเริ่มโครงการบล็อกเล็กๆ นี้ และฉันคิดว่าฉันเพิ่งทำผิดพลาดโดยไม่รวมวิธี fetch_assoc นี่คือรหัส:

$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>

และนี่คือลักษณะวิธีการเลือก:

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;
     }
}

ฉันต้องการทราบว่าเหตุใดจึงใช้งานได้สำหรับฉัน (ชื่อของบล็อกแสดงอย่างถูกต้อง) แม้ว่าฉันจะลืมใส่เมธอด fetch_assoc ก็ตาม


person Fares Ars    schedule 04.07.2020    source แหล่งที่มา


คำตอบ (1)


คุณไม่จำเป็นต้องใช้ fetch_assoc() เกือบตลอดเวลา หากคุณกำลังเขียนคลาสนามธรรมบางประเภทรอบ ๆ mysqli คุณไม่จำเป็นต้องใช้ฟังก์ชัน mysqli ใด ๆ โดยตรง

mysqli:query() ส่งคืนออบเจ็กต์ประเภท mysqli_result ซึ่งสามารถทำซ้ำได้ ซึ่งหมายความว่าคุณสามารถใช้ foreach loop เพื่อวนซ้ำได้

ฉันต้องชี้ให้เห็นว่าคุณยังคงปฏิบัติตามหลักปฏิบัติด้านการเขียนโปรแกรมที่ไม่ดีอยู่ คุณไม่ควรใช้ or die($this->con->error.__LINE__) นี่เป็นการฝึกเขียนโค้ดที่แย่มากและไม่จำเป็นเลย คุณควรเปิดใช้งานการรายงานข้อผิดพลาดที่เหมาะสมแทน ดูวิธีรับข้อความแสดงข้อผิดพลาดใน MySQLi

วิธีการ select() ของคุณควรส่งคืนเฉพาะอาร์เรย์เท่านั้น สิ่งนี้จะทำให้โค้ดของคุณง่ายขึ้นมากและเกิดข้อผิดพลาดน้อยลง ดังนั้นให้เขียนฟังก์ชัน select() ของคุณใหม่เป็น:

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

อย่างที่คุณเห็นว่าฟังก์ชันทั้งหมดเป็นโค้ดบรรทัดเดียว ซึ่งหมายความว่าเมธอด select() ของคุณไม่มีประโยชน์มากนัก คุณสามารถแทนที่ด้วยคำที่กว้างกว่าแทนได้ วิธีนี้จะทำให้คุณหลีกเลี่ยงการใช้โค้ดซ้ำจำนวนมาก

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;
}

แน่นอนว่าวิธีนี้ไม่ควรเป็นส่วนหนึ่งของโมเดลของคุณ ควรเป็นส่วนหนึ่งของคลาสเฉพาะสำหรับการสื่อสารฐานข้อมูล จากนั้นคุณสามารถสร้างอินสแตนซ์เดียวในแอปพลิเคชันของคุณแล้วส่งต่อไปยังโมเดลของคุณ

person Dharman    schedule 04.07.2020
comment
ขอบคุณ @Dharman สำหรับการตอบกลับของคุณ แต่ bind_param(str_repeat("s",count($params)), ...$params) เราสามารถมีสิ่งอื่น ๆ เช่นจำนวนเต็มได้ ดังนั้นเราจึงต้องการ d แทนที่จะเป็น s และสำหรับ $params ฉันคิดว่าเราจำเป็นต้องมีการวนซ้ำเพื่อให้มีทั้งหมด พารามิเตอร์ที่ใส่เป็นอาร์เรย์ใน executeQuery methode - person Fares Ars; 05.07.2020
comment
@FaresArs 99.99% ของเวลาที่คุณไม่ต้องการอะไรอื่นนอกจากสตริง แต่หากคุณจำเป็นต้องระบุประเภทด้วยตนเอง ฉันขอแนะนำให้อ่านบทความสั้น ๆ นี้: phpdelusions.net/mysqli/simple< /ก> - person Dharman; 05.07.2020