เนื้อหาตอนที่แล้ว เรารู้จักกับการตั้งค่า การเชื่อมต่อ
และการคิวรี่ข้อมูลโดยใช้รูปแบบกำหนด คำสั่ง 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. แบบแสดงรายการเดียว
ถ้าเราคุ้นเคยกับการคิวรี่เราก็พอจะนึกภาพออก เช่นว่า กรณีดังข้อมูลมาทั้งหมด ก็จะเป็นในลักษณะแรก
แต่ถ้าเป็นการดึงข้อมูลบางรายการมาแสดงในลักษณะแสดงรายละเอียดของรายการนั้น ก็จะเป็น
การแสดงในลักษณะที่สอง แบบนี้เป็นตัน้
คำสั่งสำหรับแสดงรายการทั้งหมด
ประกอบด้วยคำสั่งดังนี้
1 2 3 4 5 6 7 8 | $query = $db ->query( "SELECT * FROM tbl_provinces " ); // แบบผลลัพธ์เป็น object สองบรรทัดนี้ให้ค่าเหมือนกัน $result = $query ->getResult(); $result = $query ->getResultObject(); // แบบผลลัพธ์เป็นแบบ array $result = $query ->getResult( 'array' ); $result = $query ->getResultArray(); |
ทั้งสองรูปแบบต่างกันในขึ้นตอนการเรียกใช้ข้อมูลมาแสดงดังนี้
สมมติฟิลด์ที่จะใช้งานชื่อว่า province_name จะได้เป็น
1 2 | echo $row ->province_name; // แบบ object ฟิลด์จะเป็น property หนึ่งของ object echo $row [ 'province_name' ]; // แบบ array ฟิลด์จะเป็น key หนึ่งของ array |
ดูตัวอย่างการเรียกใช้แบบเต็ม
1 2 3 4 5 6 7 | $query = $db ->query( "SELECT * FROM tbl_provinces " ); $result = $query ->getResultArray(); if ( $result ){ // ถ้ามีข้อมูล ไม่เป็น array ค่าว่าง foreach ( $result as $row ){ echo $row [ 'province_name' ]. "<br>" ; } } |
ส่วนใหญ่แล้วมักจะใช้รูปแแบบ array
คำสั่งแสดงรายการเดียว
กรณีนี้ถ้าไม่มีข้อมูลจะคืนค่าเป็น NULL
ประกอบด้วยคำสั่งดังนี้
1 2 3 4 5 6 | $query = $db ->query( "SELECT * FROM tbl_provinces WHERE province_id=1 " ); // แบบผลลัพธ์เป็น object $row = $query ->getRow(); // แบบผลลัพธ์เป็นแบบ array $row = $query ->getRowArray(); |
ดูตัวอย่างการเรียกใช้แบบเต็ม
1 2 3 4 5 | $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 ก็จะเป็นดังนี้
1 2 3 4 5 | $query = $db ->query( "SELECT * FROM tbl_provinces" ); $row = $query ->getRowArray(4); if (isset( $row )){ echo $row [ 'province_name' ]; } |
นอกจากนั้นเรายังสามารถใช้คำสั่ง สำหรับไปยังแถวแรก แถวก่อนหน้า แถวถัดไป และแถวสุดท้ายด้วยคำสังดังนี้ได้
1 2 3 4 | $row = $query ->getFirstRow(‘ array ’) $row = $query ->getPreviousRow(‘ array ’) $row = $query ->getNextRow(‘ array ’) $row = $query ->getLastRow(‘ array ’) |
กรณีต้องการค่าเป็น object ก็ไม่ต้องมีคำว่าง array ด้านใน เช่น getLastRow() เป็นต้น
ตัวอย่างการใช้งาน
1 2 3 4 5 6 7 8 9 | $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()
โดยใช้รูปแบบ ตามข้อมูลที่ต้องการได้ดังนี้
1 2 3 | $query ->getUnbufferedRow(); // แบบ object $query ->getUnbufferedRow( 'object' ); // แบบ object เหมือนแบบแรก $query ->getUnbufferedRow( 'array' ); // แบบ array |
ตัวอย่างรูปแบบการใช้งาน
1 2 3 4 5 | $query = $db ->query( "SELECT * FROM tbl_provinces" ); while ( $row = $query ->getUnbufferedRow( 'array' )) { echo $row [ 'province_name' ]. "<br/>" ; } |
จะวนลูปแสดงข้อมูลตั้งแต่ข้อมูลแรก ไปจนถึงข้อมูลสุดท้าย ถ้ามีมากกว่า 1 รายการ โดยไม่เก็บในหน่วยความจำ เหมาะ
กับการแสดงข้อมูลที่มีจำนวนมากๆ
เพื่อลดการใช้งานหน่วยความจำ กรณีเราทำคำสั่งที่มีการใช้หน่วยความจำนวนมากๆ ช่น คิวรี่หลายๆ คำสั่ง เราสามารถทำการ
ยกเลิกหรือคืนค่าหน่วยความจำที่ไม่ใช้แล้วได้เลย โดยไม่ต้องรอให้การทำงานสุดท้ายของ PHP สิ้นสุดลง ได้ดังนี้เช่น
1 2 3 4 5 6 7 8 9 10 11 | $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 หรืออ่านค่ามานั้นมีทั้งหมดกี่ฟิลด์ได้ด้วยคำสั่ง
1 | $query ->getFieldCount(); // คืนค่าเป็นตัวเลข จำนวนฟิลด์ |
และสามารถดูว่ามีชื่อฟิลด์อะไรบ้างด้วยคำสั่ง
1 | $query ->getFieldNames(); // คืนค่าเป็น array ชื่อไฟล์ |
มาดูตัวอย่างการใช้งาน และผลลัพธ์
1 2 3 4 | $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 ไปด้วยคำสั่ง
1 | $query ->dataSeek(76); |
ดูตัวอย่างโค้ดแบบเต็ม
1 2 3 4 5 6 7 8 9 | $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() ก็จะได้ประโยชน์มากกว่า สามารถปรับใช้ได้เป็นดังนี้
1 2 3 4 5 6 | $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 ของฟิลด์ข้อมูลที่เพิ่มล่าสุด สามารถใช้คำสั่งดังนี้
1 | $db ->insertID() |
ตัวอย่างเช่น
1 2 3 4 5 6 7 8 | $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 เป็นต้น
โดยสามารถใช้คำสั่งดังนี้
1 | $db ->affectedRows() |
ดูตัวอย่างการใช้งาน
1 2 3 4 5 6 7 8 9 | $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นแปลงด้วย ไม่ใช่แค่ทำคำสั่งคิวรี่แต่เป็นการอัพเดทด้วยค่าเดิม แบบนี้
จำนวนแถวจะไม่นับ
1 2 3 4 5 6 7 | $sql = "UPDATE news SET title = ? WHERE id = ? " ; $query = $db ->query( $sql , [ 'Title test edit' , 5 ]); // อัพเดทรายการ ID เท่ากับ 5 echo $db ->affectedRows(); // จะได้ค่าเป็น 1 เพราะมีแถวที่อัพเท จากการแก้ไขข้อมูล |
สำหรับกรณีการลบข้อมูลด้วยคำสั่ง DELETE จะคืนค่าเป็น 0 หรือก็คือไม่มีผลในการนำไปใช้งาน
ดูคำสั่ง SQL ที่ทำการคิวรี่ล่าสุด
คำสั่งนี้พูดถึงไปแล้วในตอนที่ผ่านมา ใช้คำสั่ง
1 | $db ->getLastQuery() |
ดูตัวอย่างการใช้งาน
1 2 3 4 5 6 7 | $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 ตามนี้
1 2 3 4 5 | 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'] เราจะได้ดูเพิ่มเติมในห้วข้อถัดไป