สวัสดีครับในวันนี้เราจะมาแนะนำการใข้งาน Data Tables ซึ่งเป็น plug-in สำหรับ จัดการการแสดงข้อมูลในรูปแบบตาราง ซึ่งใช้งานง่าย มาก ๆ ครับ
รายละเอียดเพิ่มเติม https://datatables.net/
มาติดตั้งแบบเริ่มต้นกันเลย
1.สร้างไฟล์ demo.html ดังนี้
<!DOCTYPE html> <html> <head> <title>Data Table</title> <!--นำเข้าไฟล์ Css --> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.24/css/jquery.dataTables.min.css"/> <!--นำเข้าไฟล์ Jquery --> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--นำเข้าไฟล์ plug-in DataTable --> <script src="https://cdn.datatables.net/1.10.24/js/jquery.dataTables.min.js"></script> <script> $(document).ready( function () { //คำสั่ง Javascript สำหรับเรียกใช้งาน Datatable $('#example').DataTable(); } ); </script> </head> <body> <table id="example" class="display" style="width:100%"> <thead> <tr> <th>Name</th> <th>Position</th> <th>Office</th> <th>Age</th> <th>Start date</th> <th>Salary</th> </tr> </thead> <tbody> <tr> <td>Tiger Nixon</td> <td>System Architect</td> <td>Edinburgh</td> <td>61</td> <td>2011/04/25</td> <td>$320,800</td> </tr> <tr> <td>Garrett Winters</td> <td>Accountant</td> <td>Tokyo</td> <td>63</td> <td>2011/07/25</td> <td>$170,750</td> </tr> <tr> <td>Ashton Cox</td> <td>Junior Technical Author</td> <td>San Francisco</td> <td>66</td> <td>2009/01/12</td> <td>$86,000</td> </tr> <tr> <td>Cedric Kelly</td> <td>Senior Javascript Developer</td> <td>Edinburgh</td> <td>22</td> <td>2012/03/29</td> <td>$433,060</td> </tr> <tr> <td>Airi Satou</td> <td>Accountant</td> <td>Tokyo</td> <td>33</td> <td>2008/11/28</td> <td>$162,700</td> </tr> <tr> <td>Brielle Williamson</td> <td>Integration Specialist</td> <td>New York</td> <td>61</td> <td>2012/12/02</td> <td>$372,000</td> </tr> <tr> <td>Herrod Chandler</td> <td>Sales Assistant</td> <td>San Francisco</td> <td>59</td> <td>2012/08/06</td> <td>$137,500</td> </tr> <tr> <td>Rhona Davidson</td> <td>Integration Specialist</td> <td>Tokyo</td> <td>55</td> <td>2010/10/14</td> <td>$327,900</td> </tr> <tr> <td>Colleen Hurst</td> <td>Javascript Developer</td> <td>San Francisco</td> <td>39</td> <td>2009/09/15</td> <td>$205,500</td> </tr> <tr> <td>Sonya Frost</td> <td>Software Engineer</td> <td>Edinburgh</td> <td>23</td> <td>2008/12/13</td> <td>$103,600</td> </tr> <tr> <td>Jena Gaines</td> <td>Office Manager</td> <td>London</td> <td>30</td> <td>2008/12/19</td> <td>$90,560</td> </tr> <tr> <td>Quinn Flynn</td> <td>Support Lead</td> <td>Edinburgh</td> <td>22</td> <td>2013/03/03</td> <td>$342,000</td> </tr> <tr> <td>Charde Marshall</td> <td>Regional Director</td> <td>San Francisco</td> <td>36</td> <td>2008/10/16</td> <td>$470,600</td> </tr> <tr> <td>Haley Kennedy</td> <td>Senior Marketing Designer</td> <td>London</td> <td>43</td> <td>2012/12/18</td> <td>$313,500</td> </tr> <tr> <td>Tatyana Fitzpatrick</td> <td>Regional Director</td> <td>London</td> <td>19</td> <td>2010/03/17</td> <td>$385,750</td> </tr> <tr> <td>Michael Silva</td> <td>Marketing Designer</td> <td>London</td> <td>66</td> <td>2012/11/27</td> <td>$198,500</td> </tr> <tr> <td>Paul Byrd</td> <td>Chief Financial Officer (CFO)</td> <td>New York</td> <td>64</td> <td>2010/06/09</td> <td>$725,000</td> </tr> <tr> <td>Gloria Little</td> <td>Systems Administrator</td> <td>New York</td> <td>59</td> <td>2009/04/10</td> <td>$237,500</td> </tr> <tr> <td>Bradley Greer</td> <td>Software Engineer</td> <td>London</td> <td>41</td> <td>2012/10/13</td> <td>$132,000</td> </tr> <tr> <td>Dai Rios</td> <td>Personnel Lead</td> <td>Edinburgh</td> <td>35</td> <td>2012/09/26</td> <td>$217,500</td> </tr> </tbody> </table> </body> </html>
ตัวอย่างการทำงาน
DataTables จะทำการแบ่งหน้าให้อัตโนมัติ และ มีช่อง Search สามารถค้นหาข้อมูลได้ทันที แต่จากตัวอย่างนี้จะเป็นการแสดงข้อมูลแบบ Static ที่อยู่ใน Html จะเหมาะกับตารางที่ไม่ค่อยมีข้อมูลเปลี่ยนแปลง
การใช้งาน DataTables Server-side processing แสดง และ ค้นหาข้อมูลด้วย PHP/MySQL
สำหรับต้วอย่างต่อไปนี้ เราจะใช้ความสามารถ Server-side processing ของ DataTables ในการแสดง และ ค้นหาข้อมูลจาก ฐานข้อมูล MySQL ด้วย PHP ครับ
ใน MySQL สร้างฐานข้อมูล Database ชื่อ test และ สร้างตารางชื่อ datatable ดังนี้
CREATE TABLE `datatable` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL, `last_name` varchar(50) CHARACTER SET utf8 DEFAULT NULL, `email` varchar(50) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; INSERT INTO `datatable` (`id`, `first_name`, `last_name`, `email`) VALUES (1, 'Wendi', 'Drackford', 'wdrackford0@hp.com'), (2, 'Ugo', 'Boundy', 'uboundy1@uol.com.br'), (3, 'Porter', 'Henryson', 'phenryson2@biblegateway.com'), (4, 'Karim', 'Koppens', 'kkoppens3@kickstarter.com'), (5, 'Nicko', 'Bamford', 'nbamford4@quantcast.com'), (6, 'Coop', 'Landrick', 'clandrick5@wired.com'), (7, 'Kessia', 'Clemson', 'kclemson6@answers.com'), (8, 'Shelley', 'Stanners', 'sstanners7@oakley.com'), (9, 'Collete', 'Whelpdale', 'cwhelpdale8@chronoengine.com'), (10, 'Arthur', 'Cowle', 'acowle9@gov.uk'), (11, 'Marty', 'MacCrosson', 'mmaccrossona@dedecms.com'), (12, 'Falkner', 'Chazotte', 'fchazotteb@upenn.edu'), (13, 'Nina', 'Cowx', 'ncowxc@soundcloud.com'), (14, 'Diane-marie', 'Keiley', 'dkeileyd@usnews.com'), (15, 'Antonie', 'Petrenko', 'apetrenkoe@craigslist.org'), (16, 'Elliott', 'Donnison', 'edonnisonf@accuweather.com'), (17, 'Rube', 'Farmiloe', 'rfarmiloeg@geocities.jp'), (18, 'Xavier', 'Earney', 'xearneyh@mail.ru'), (19, 'Goran', 'Swarbrigg', 'gswarbriggi@phoca.cz'), (20, 'Lavena', 'Repper', 'lrepperj@storify.com'), (21, 'Sheila', 'Crank', 'scrankk@adobe.com'), (22, 'Tillie', 'McGowran', 'tmcgowranl@wix.com'), (23, 'Kirbie', 'Colisbe', 'kcolisbem@xing.com'), (24, 'Kiley', 'Tinkham', 'ktinkhamn@opera.com'), (25, 'Alvin', 'Hammon', 'ahammono@twitter.com'), (26, 'Debora', 'Rodinger', 'drodingerp@ameblo.jp'), (27, 'Cyndie', 'Myrick', 'cmyrickq@go.com'), (28, 'Nichols', 'Baggarley', 'nbaggarleyr@hp.com'), (29, 'Ramona', 'Clow', 'rclows@shutterfly.com'), (30, 'Margaux', 'Golding', 'mgoldingt@google.cn'), (31, 'Juditha', 'Lemasney', 'jlemasneyu@tripod.com'), (32, 'Debora', 'Bonifazio', 'dbonifaziov@youtube.com'), (33, 'Jennee', 'Dearle', 'jdearlew@jalbum.net'), (34, 'Valentino', 'Thorouggood', 'vthorouggoodx@msn.com'), (35, 'Ferdy', 'Horwell', 'fhorwelly@fda.gov'), (36, 'Lodovico', 'Staniland', 'lstanilandz@foxnews.com'), (37, 'Eben', 'Olijve', 'eolijve10@mozilla.com'), (38, 'Gretta', 'Cullip', 'gcullip11@pagesperso-orange.fr'), (39, 'Tedra', 'Blockey', 'tblockey12@biblegateway.com'), (40, 'Carena', 'Bartlosz', 'cbartlosz13@independent.co.uk'), (41, 'Garwood', 'Chipchase', 'gchipchase14@nps.gov'), (42, 'Cybill', 'Klimkov', 'cklimkov15@oracle.com'), (43, 'Marieann', 'Kimmings', 'mkimmings16@plala.or.jp'), (44, 'Guglielmo', 'Alderton', 'galderton17@dailymotion.com'), (45, 'Chad', 'Altree', 'caltree18@statcounter.com'), (46, 'Tansy', 'Crumbleholme', 'tcrumbleholme19@constantcontact.com'), (47, 'Casey', 'Simison', 'csimison1a@quantcast.com'), (48, 'Hadley', 'Jaulme', 'hjaulme1b@about.me'), (49, 'Gearalt', 'Chaffin', 'gchaffin1c@drupal.org'), (50, 'Clim', 'Spary', 'cspary1d@bandcamp.com');
สร้างไฟล์ server_processing.php สำหรับประมวลผลข้อมูลจาก Server
โดยไฟล์นี้จะเป็นการรับข้อมูล เลขหน้าที่แสดง และ ข้อมูลการค้นหา จาก Datatable
จากนั้น PHP ส่งผลการค้นหาที่ได้ กลับไป แสดงผล ยัง Datatable
<?php if(isset($_POST['start'])){ $start = $_POST['start'];//รับข้อมูล เลขหน้าที่จะแสดง $length = $_POST['length']; //รับข้อมูล จำนวนที่แสดงต่อหน้า ค่าเริ่มต้นคือ 10 $searchData = $_POST['search']['value'];//รับข้อมูล ช่อง Search $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test";//ชื่อฐานข้อมูล // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $searchValueResult = ""; $searchValueData = mysqli_real_escape_string($conn,$searchData); // Search value //Query กรณีมีการค้นหาข้อมูล if($searchValueData != ''){ $searchValueResult = " WHERE first_name LIKE '%".$searchValueData."%' OR last_name LIKE '%".$searchValueData."%' OR email LIKE '%".$searchValueData."%' "; } //Query นับจำนวนข้อมูลทั้งหมด $t = mysqli_query($conn,"SELECT COUNT(*) as total FROM datatable"); $records = mysqli_fetch_assoc($t); $totalRecords = $records['total']; //Query ข้อมูลที่จะแสดงใน DataTable $sql = "SELECT * FROM datatable $searchValueResult LIMIT $start , $length"; $result = mysqli_query($conn, $sql); $data = array(); if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { $data[] = array( 'first_name'=> $row['first_name'], 'last_name'=> $row['last_name'], 'email'=> $row['email'], ); } } mysqli_close($conn); $json_data = array( "draw" => intval( $_REQUEST['draw'] ), "recordsTotal" => intval($totalRecords ), "recordsFiltered" => intval($totalRecords), "data" => $data // total data array ); echo json_encode($json_data); } ?>
สร้างไฟล์ index.php
โดยไฟล์นี้จะเป็นการแสดงข้อมูลที่ได้รับจากไฟล์ server_processing.php
<!DOCTYPE html> <html> <head> <title>Data Table</title> <!--นำเข้าไฟล์ Css --> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.24/css/jquery.dataTables.min.css"/> <!--นำเข้าไฟล์ Jquery --> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <!--นำเข้าไฟล์ plug-in DataTable --> <script src="https://cdn.datatables.net/1.10.24/js/jquery.dataTables.min.js"></script> <script> $(document).ready(function() { //คำสั่ง Javascript สำหรับเรียกใช้งาน Datatable $('#example').DataTable( { "processing": true, "serverSide": true, 'serverMethod': 'post', "ajax": "server_processing.php", 'columns': [ { data: 'first_name' }, { data: 'last_name' }, { data: 'email' }, ] } ); } ); </script> </head> <body> <table id="example" class="display" style="width:100%"> <thead> <tr> <th>First name</th> <th>Last name</th> <th>Email</th> </tr> </thead> </table> </body> </html>
ตัวอย่างการทำงาน
เมื่อมีการเลือกเปลี่ยนหน้า หรือ ค้นหาข้อมูลในช่อง Search Datatable จะส่งข้อมูลไปยังไฟล์ server_processing.php เพื่อ Query ข้อมูลจาก Database และส่งข้อมูลกลับมาแสดงผลในตาราง Datatable