การใช้งาน Query Result และข้อมูล Query ใน CodeIgniter 4

เขียนเมื่อ 3 ปีก่อน โดย Ninenik Narkdee
codeigniter 4 codeigniter query result

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ codeigniter 4 codeigniter query result

ดูแล้ว 6,103 ครั้ง


เนื้อหาตอนที่แล้ว เรารู้จักกับการตั้งค่า การเชื่อมต่อ
และการคิวรี่ข้อมูลโดยใช้รูปแบบกำหนด คำสั่ง SQL 
แบบกำหนดเองไปแล้ว ทบทวนได้ที่บทความ
    การเชื่อมต่อ และใช้งาน Database ใน CodeIgniter 4 http://niik.in/1001 
 
เนื้อหาตอนต่อไปนี้เราจะไปดูกรณีที่ทำการคิวรี่ข้อมูลแบบอ่านค่า เช่นการใช้คำสั่ง 
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']  เราจะได้ดูเพิ่มเติมในห้วข้อถัดไป


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ

  • 13 Aug
    2020
    การใช้งาน Query Builder ใน CodeIgniter 4  อ่าน 8,095
    พิเศษ เฉพาะสมาชิก ในสองบทความก่อนหน้า เราได้รู้จักวิธีการคิวรี่ ข้อมูลด้วยคำสั่ง SQL แบบกำห









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ