เนื้อหาตอนที่แล้ว เรารู้จักกับการตั้งค่า การเชื่อมต่อ
และการคิวรี่ข้อมูลโดยใช้รูปแบบกำหนด คำสั่ง SQL
แบบกำหนดเองไปแล้ว ทบทวนได้ที่บทความ
การเชื่อมต่อ และใช้งาน Database ใน CodeIgniter 4 http://niik.in/1001
https://www.ninenik.com/content.php?arti_id=1001 via @ninenik
เนื้อหาตอนต่อไปนี้เราจะไปดูกรณีที่ทำการคิวรี่ข้อมูลแบบอ่านค่า เช่นการใช้คำสั่ง
SELECT เป็นต้น แล้วเราได้ผลลัพธ์กลับมาเป็น Query Result จะสามารถนำไปจัดการ
หรือใช้งานต่อไปได้อย่างไรบ้าง เนื้อหานี้เราจะใช้ตารางฐานข้อมูล จังหวัดในประเทศไทน
มาประกอบ ดูโครงสร้างตารางได้ที่ลิ้งค์ตามนี้ http://niik.in/que_2398_6277
การใช้งาน Query Result
ในกรณีเราทำคำสั่งคิวรี่ข้อมูลแบบอ่านค่า ปกติแล้วเราจได้ผลลัพธ์เป็น Query Result ในรูปแบบ Array ของ
Object หรือ Object สำพหรับถ้าคำสั่งคิวรี่นั้นมีข้อมูล แต่ถ้าคำสั่งคิวรี่นั้นไม่มีข้อมูล ก็จะคืนค่ากลับมาเป็น
array ค่าว่าง ([]) หรือ NULL
กรณีมีข้อมูล ตัว Query Result จะสามารถแสดงข้อมูลได้ใน 2 ลักษณะคือ
1. แบบดึงรายการทั้งหมดมาแสดง
2. แบบแสดงรายการเดียว
ถ้าเราคุ้นเคยกับการคิวรี่เราก็พอจะนึกภาพออก เช่นว่า กรณีดังข้อมูลมาทั้งหมด ก็จะเป็นในลักษณะแรก
แต่ถ้าเป็นการดึงข้อมูลบางรายการมาแสดงในลักษณะแสดงรายละเอียดของรายการนั้น ก็จะเป็น
การแสดงในลักษณะที่สอง แบบนี้เป็นตัน้
คำสั่งสำหรับแสดงรายการทั้งหมด
ประกอบด้วยคำสั่งดังนี้
$query = $db->query("SELECT * FROM tbl_provinces "); // แบบผลลัพธ์เป็น object สองบรรทัดนี้ให้ค่าเหมือนกัน $result = $query->getResult(); $result = $query->getResultObject(); // แบบผลลัพธ์เป็นแบบ array $result = $query->getResult('array'); $result = $query->getResultArray();
ทั้งสองรูปแบบต่างกันในขึ้นตอนการเรียกใช้ข้อมูลมาแสดงดังนี้
สมมติฟิลด์ที่จะใช้งานชื่อว่า province_name จะได้เป็น
echo $row->province_name; // แบบ object ฟิลด์จะเป็น property หนึ่งของ object echo $row['province_name']; // แบบ array ฟิลด์จะเป็น key หนึ่งของ array
ดูตัวอย่างการเรียกใช้แบบเต็ม
$query = $db->query("SELECT * FROM tbl_provinces "); $result = $query->getResultArray(); if($result){ // ถ้ามีข้อมูล ไม่เป็น array ค่าว่าง foreach($result as $row){ echo $row['province_name']."<br>"; } }
ส่วนใหญ่แล้วมักจะใช้รูปแแบบ array
คำสั่งแสดงรายการเดียว
กรณีนี้ถ้าไม่มีข้อมูลจะคืนค่าเป็น NULL
ประกอบด้วยคำสั่งดังนี้
$query = $db->query("SELECT * FROM tbl_provinces WHERE province_id=1 "); // แบบผลลัพธ์เป็น object $row = $query->getRow(); // แบบผลลัพธ์เป็นแบบ array $row = $query->getRowArray();
ดูตัวอย่างการเรียกใช้แบบเต็ม
$query = $db->query("SELECT * FROM tbl_provinces WHERE province_id=1 "); $row = $query->getRowArray(); if(isset($row)){ // ถ้าไม่เป็น null หรือคือมีข้อมูล echo $row['province_name']; }
คำสั่ง SQL ที่ใช้คิวรี่ข้างต้น เราพอจะเดาได้ว่า ถ้ามีข้อมูลก็จะมีแค่ข้อมูลเดียว แต่ถ้าไม่มีข้อมูลก็จะเป็น null
สังเกตการตรวจสอบกรณีข้อมูล $result เราจะใช้เป็น if($result){ กรณี $row เราจะใช้เป็น if(isset($row)){
เพื่อตรวจสอบว่ามีข้อมูลหรือไม่
ถ้าเรากำหนดคำสั่ง SQL ที่สามารถเดาได้ว่า จะได้ผลลัพธ์ข้อมูลหลายรายการ เช่นคำสั่ง
SELECT * FROM tbl_provinces
อย่างน้อยเราก็พอเดาได้ว่าข้อมูลทั้งหมด 77 รายการ การใช้คำสั่ง getRow() หรือ getRowArray() จะได้เฉพาะข้อมูล
แรกของตารางมาแสดง
เราสามารถระบุแถวของรายการที่ไม่ใช้แถวแรก ได้โดยกำหนดตัวเลข ตั้ง 0 เป็นต้นไป เป็น parameter แรกของคำสั่ง
getRow() หรือ getRowArray() นั่นคือ 0 คือแถวแรก และก็ไล่ลำดับไปเรือยๆ ตามแถวที่ต้องการ สมมติต้องการข้อมูล
แถวที่ 5 ก็จะเป็นดังนี้
$query = $db->query("SELECT * FROM tbl_provinces"); $row = $query->getRowArray(4); if(isset($row)){ echo $row['province_name']; }
นอกจากนั้นเรายังสามารถใช้คำสั่ง สำหรับไปยังแถวแรก แถวก่อนหน้า แถวถัดไป และแถวสุดท้ายด้วยคำสังดังนี้ได้
$row = $query->getFirstRow(‘array’) $row = $query->getPreviousRow(‘array’) $row = $query->getNextRow(‘array’) $row = $query->getLastRow(‘array’)
กรณีต้องการค่าเป็น object ก็ไม่ต้องมีคำว่าง array ด้านใน เช่น getLastRow() เป็นต้น
ตัวอย่างการใช้งาน
$query = $db->query("SELECT * FROM tbl_provinces "); $row = $query->getRowArray(4); if(isset($row)){ echo $row['province_name']; } $rowPrev = $query->getPreviousRow('array'); if(isset($rowPrev)){ echo $rowPrev['province_name']; }
คำสั่งที่ใช้จัดการ Query Result ข้างบนทั้งหมด ที่กล่าวไป จะเป็นลักษณะของการโหลดข้อมูลทั้งหมดมาเก็บไว้
ในหน่วยความจำหรือตัวแปร จากนั้นทำการวนลูปค่าของตัวแปรมาแสดงอีกที เพื่อแก้ปัญหาสำหรับกรณีข้อมูลที่มี
จำนวนมากๆ เราสามารถวนลูปข้อมูลแสดงโดยไม่ต้องเก็บในหน่วนความจำ ด้วยคำสั่ง getUnbufferedRow()
โดยใช้รูปแบบ ตามข้อมูลที่ต้องการได้ดังนี้
$query->getUnbufferedRow(); // แบบ object $query->getUnbufferedRow('object'); // แบบ object เหมือนแบบแรก $query->getUnbufferedRow('array'); // แบบ array
ตัวอย่างรูปแบบการใช้งาน
$query = $db->query("SELECT * FROM tbl_provinces"); while ($row = $query->getUnbufferedRow('array')) { echo $row['province_name']."<br/>"; }
จะวนลูปแสดงข้อมูลตั้งแต่ข้อมูลแรก ไปจนถึงข้อมูลสุดท้าย ถ้ามีมากกว่า 1 รายการ โดยไม่เก็บในหน่วยความจำ เหมาะ
กับการแสดงข้อมูลที่มีจำนวนมากๆ
เพื่อลดการใช้งานหน่วยความจำ กรณีเราทำคำสั่งที่มีการใช้หน่วยความจำนวนมากๆ ช่น คิวรี่หลายๆ คำสั่ง เราสามารถทำการ
ยกเลิกหรือคืนค่าหน่วยความจำที่ไม่ใช้แล้วได้เลย โดยไม่ต้องรอให้การทำงานสุดท้ายของ PHP สิ้นสุดลง ได้ดังนี้เช่น
$query = $db->query("SELECT * FROM tbl_provinces"); $result = $query->getResultArray(); if($result){ // ถ้ามีข้อมูล ไม่เป็น array ค่าว่าง foreach ($result as $row) { echo $row['province_name']."<br>"; } } $query->freeResult(); // คืนค่าหน่วยความจำ // จะไม่สามารถใช้คำสั่งด้านล่างได้เพราะตัวปร $query ที่ Result Object ถูกลบออกไปแล้ว echo $query->getFieldCount(); // คำสั่งนี้ error
เราสามารถดูได้ว่าฟิลด์ที่เราทำการ SELECT หรืออ่านค่ามานั้นมีทั้งหมดกี่ฟิลด์ได้ด้วยคำสั่ง
$query->getFieldCount(); // คืนค่าเป็นตัวเลข จำนวนฟิลด์
และสามารถดูว่ามีชื่อฟิลด์อะไรบ้างด้วยคำสั่ง
$query->getFieldNames(); // คืนค่าเป็น array ชื่อไฟล์
มาดูตัวอย่างการใช้งาน และผลลัพธ์
$query = $db->query("SELECT * FROM tbl_provinces"); echo $query->getFieldCount(); echo "<pre>"; print_r($query->getFieldNames());
ผลลัพธ์ที่ได้
6 Array ( [0] => province_id [1] => province_code [2] => province_name [3] => province_name_eng [4] => geo_id [5] => last_update )
การที่จะใช้คำสั่ง หรือ method นี้ได้ ต้องการอ่านค่าข้อมูล ที่คืนค่าเป็น Query Result object
เราสามารถข้ามแถวรายการข้อมูล เพื่อไปเริ่มต้นแถวที่ต้องการแสดง สมมติเช่น เราจะให้แสดงจังหวัดที่ 77 เราก็สามารถ
ข้ามรายการลำดับที่ 1-76 ไปด้วยคำสั่ง
$query->dataSeek(76);
ดูตัวอย่างโค้ดแบบเต็ม
$query = $db->query("SELECT * FROM tbl_provinces"); $query->dataSeek(76); $result = $query->getResultArray(); if($result){ // ถ้ามีข้อมูล ไม่เป็น array ค่าว่าง foreach ($result as $row) { echo $row['province_name']."<br>"; } }
ซึ่งถ้าเราคำสั่งนี้ร่วมกับ คำสั่ง getUnbufferedRow() ก็จะได้ประโยชน์มากกว่า สามารถปรับใช้ได้เป็นดังนี้
$query = $db->query("SELECT * FROM tbl_provinces"); $query->dataSeek(76); $row = $query->getUnbufferedRow('array'); if(isset($row)){ echo $row['province_name']; }
ข้อมูล Query และ Database
นอกจากข้อมูลที่ผลลัพธ์การคิวรี่ที่เป็น Result Object ได้ที่จากการอ่านข้อมูลแล้ว ยังยังมีข้อมูลการคิวรี่กรณีการเขียนข้อมูล
จากการ ใช้คำสั่ง INSERT, UPDATE ที่เราสามารถใช้คำสั่งเพื่อจัดการเพิ่มเติมได้
ค่า ID ของ Autoincrement ฟิลด์
จะคืนค่า ID ของฟิลด์ข้อมูลที่เพิ่มล่าสุด สามารถใช้คำสั่งดังนี้
$db->insertID()
ตัวอย่างเช่น
$sql = "INSERT INTO news (title, slug, body) VALUES (?, ?, ?)"; $query = $db->query($sql, [ 'Prepare title test', 'Prepare-title-test', 'Body Here', ]); // มี ID ข้อมูลก่อนหน้าเป็น 3 echo $db->insertID(); // ID ของข้มอูลที่เพิ่มล่าสุด จะเป็น 4
ดูจำนวนแถวที่มีการแก้ไข
เราสามารถดูค่าจำนวนแถวของข้อมูลที่เกิดจากคำสั่งคิวรี่ที่เป็นการเขียนข้อมูลเช่น INSERT , UPDATE เป็นต้น
โดยสามารถใช้คำสั่งดังนี้
$db->affectedRows()
ดูตัวอย่างการใช้งาน
$sql = "INSERT INTO news (title, slug, body) VALUES (?, ?, ?)"; $query = $db->query($sql, [ 'Title test', 'title-test', 'Body Here', ]); // มี ID ข้อมูลก่อนหน้าเป็น 4 echo $db->insertID();// ID ของข้มอูลที่เพิ่มล่าสุด จะเป็น 5 echo $db->affectedRows(); // จะได้ค่าเป็น 1 เพราะมีแถวที่อัพเดท จากการเพิ่มใหม่ 1 รายการ
สามารถใช้ได้เช่นเดียวกับการแก้ไข แต่กรณีการแก้ไข หรืออัพเดท ค่าจำนวนแถวที่อัพเดท จะต้องเปลี่ยการ
แก้ไขข้อมูลจริงๆ นั่นคือค่าข้อมูลต้องเปลี่pนแปลงด้วย ไม่ใช่แค่ทำคำสั่งคิวรี่แต่เป็นการอัพเดทด้วยค่าเดิม แบบนี้
จำนวนแถวจะไม่นับ
$sql = "UPDATE news SET title = ? WHERE id = ? "; $query = $db->query($sql, [ 'Title test edit', 5 ]); // อัพเดทรายการ ID เท่ากับ 5 echo $db->affectedRows(); // จะได้ค่าเป็น 1 เพราะมีแถวที่อัพเท จากการแก้ไขข้อมูล
สำหรับกรณีการลบข้อมูลด้วยคำสั่ง DELETE จะคืนค่าเป็น 0 หรือก็คือไม่มีผลในการนำไปใช้งาน
ดูคำสั่ง SQL ที่ทำการคิวรี่ล่าสุด
คำสั่งนี้พูดถึงไปแล้วในตอนที่ผ่านมา ใช้คำสั่ง
$db->getLastQuery()
ดูตัวอย่างการใช้งาน
$sql = "UPDATE news SET title = ? WHERE id = ? "; $query = $db->query($sql, [ 'Title test edit', 5 ]); // อัพเดทรายการ ID เท่ากับ 5 echo $db->getLastQuery(); // จะได้ค่าเป็น UPDATE news SET title = 'Title test edit' WHERE id = 5
สามารถเอาไว้ debug ดูการทำงาน หรือตรวจสอบความถูกต้องของรูปแบบคำสั่ง ที่ถูกคิวรี่ได้
นอกจากนี้ก็มีคำสั้งเพื่อดูข้อมูลของ Database ตามนี้
echo $db->table('news')->countAll(); // ดูจำนวนรายการของตาราง news ว่ามีกี่รายการ ได้ 5 รายการ echo "<br>"; echo $db->getPlatform(); // MySQLi echo "<br>"; echo $db->getVersion(); // 5.5.5-10.3.15-MariaDB
สังเกตคำสั่งข้างต้น มีการเรียกใช้งาน Query Builder ในคำสั่ง $db->table('news'] เราจะได้ดูเพิ่มเติมในห้วข้อถัดไป