ในเนื้อหาตอนนี้ จะมาดูเรื่องของการเพิ่มข้อมูล และการลบข้อมูล
กับฐานข้อมูล mysql ด้วย angularjs
อ่านเนื้อหาก่อนหน้าได้ที่
angularjs ลิสรายการ ค้นหา และเรียงข้อมูล กับฐานข้อมูล mysql ตอนที่ 10
https://www.ninenik.com/content.php?arti_id=533 via @ninenik
ไฟล์ที่เราจะมาดูในตอนนี้มี
tpl\detail.html ไฟล์ template สำหรับ เพิ่มและแก้ไขข้อมูล
data\model.php สำหรับ เพิ่มข้อมูลในฐานข้อมูล
app.js สำหรับกำหนดคำสั่ง เพิ่มเติม
1.ไฟล์ detail.html
มาดูโครงสร้างของไฟล์
<form role="form" name="myForm"> <div class="control-group" ng-class="{'has-error': myForm.name.$invalid && !myForm.name.$pristine}"> <label class="control-label">Name</label> <input type="text" class="form-control" name="name" ng-model="data.name" required> <span ng-show="myForm.name.$error.required && !myForm.name.$pristine" class="text-danger"> Required </span> </div> <div class="control-group" ng-class="{'has-error': myForm.tel.$invalid && !myForm.tel.$pristine}"> <label class="control-label">Tel</label> <input type="text" class="form-control" name="tel" ng-model="data.tel" number required> <span ng-show="myForm.tel.$error.required && !myForm.tel.$pristine" class="text-danger"> Required </span> </div> <div class="control-group"> <label>Address</label> <textarea name="address" class="form-control" rows="3" ng-model="data.address"></textarea> </div> <br> <a href="#/" class="btn btn-default">Back</a> <button ng-disabled="myForm.$invalid" ng-click="submitForm(data)" class="btn btn-primary">Save</button> <button ng-show="data.id" class="btn btn-danger" ng-click="deleteData(data.id)">Delete</button> </form>
name="myForm"
form สำหรับบันทึกข้อมูล ที่เราต้องการใช้งาน ต้องมีชื่อ form สำหรับอ้างอิง
ในที่นี้ชื่อ myForm
ng-model="data.name"
กำหนดค่าให้กับ input textarea ตามข้อมูลให้ตรงกัน data คือชื่อสำหรับอ้างอิงตัวแปร object
สำหรับการกำหนด css ต่างๆ ในการตรวจสอบ form ไม่ขออธิบาย มีเนื้อหาก่อนหน้าแล้ว
สามารถกลับไปอ่านเพิ่มเติมได้
ตรวจสอบ form ด้วย property formcontroller ใน angularjs ตอนที่ 8
https://www.ninenik.com/content.php?arti_id=530 via @ninenik
ng-click="submitForm(data)"
เมื่อคลิก ส่งข้อมูลในฟอร์ม ไปในฟังก์ชั่น submitForm(data) data คือข้อมูลแบบ object
ที่จะถูกส่งเข้าไปบันทึก
ng-show="data.id"
ปุ่มลบนี้ จะแสดงถ้ามีการส่งค่า id รายการที่ต้องการ มาด้วย
ng-click="deleteData(data.id)"
ปุ่มลบนี้ ถ้าคลิก จะส่ง id ค่ารายการที่ต้องการลบ ไปในฟังก์ชั่น deleteData()
2. ไฟล์ model.php
ไฟล์นี้จะมีเพิ่มเข้ามาสองส่วน คือ การเพิ่มข้อมูล และการ ลบข้อมูล
คำอธิบายแสดงในโค้ด เนื้อหาในโค้ด เป็นภาคต่อ จะมีโค้ดเก่าจากตอนก่อนหน้า
แสดงอยู่ก่อนแล้ว
<?php include("../db/db_connect.php"); // เรียกใช้ไฟล์ ตั้งค่า และฟังก์ชั่น เกี่ยวกับฐานข้อมูล $mysqli = connect(); // สร้าง ตัวแปร mysql instance สำหรับเรียกใช้งานฐานข้อมูล // ส่วนแรก คือสำหรับแสดงผลข้อมูล if(isset($_GET['viewFriend'])){ // ส่งตัวแปร GET ชื่อ viewFriend มากำหนดให้ทำงานในส่วนนี้ header("Content-type:application/json; charset=UTF-8"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); $more_sql=""; if(isset($_GET['Id']) && $_GET['Id']!=""){ // รับค่า กรณี แสดงรายการเดียวที่เลือก ตาม Id $more_sql=" AND id='".$_GET['Id']."' "; } // เนื้อหาส่วนล่างถัดจากนี้ เป็นการเรียกใช้งาน คำสั่ง php ดึงข้อมูล // มาเก็บในตัวแปร array แล้วนำไปสร้างเป็นรูปแบบ json object // เนื้อหาก่อนหน้ามีรายละเอียด ในที่นี้ไม่ขออธิบายเพิ่ม $sql="SELECT * FROM tbl_myfriend WHERE 1 $more_sql "; $result = $mysqli->query($sql); while($rs=$result->fetch_object()){ $json_data[]=array( "id"=>$rs->id, "name"=>$rs->name, "tel"=>$rs->tel, "address"=>$rs->address ); } $json= json_encode($json_data); if(isset($_GET['callback']) && $_GET['callback']!=""){ echo $_GET['callback']."(".$json.");"; }else{ echo $json; } exit; } // ส่วนสำหรับการเพิ่มข้อมูล if(isset($_GET['addFriend'])){ // ส่งตัวแปร GET ชื่อ addFriend มากำหนดให้ทำงานในส่วนนี้ // จะเห็นว่า การส่งค่าแบบ post มา จะไม่ได้รับค่าแบบตรงอ้างอิง $_POST['xxx'] ได้เลย // แต่เป็นการไปอ่านค่าจากไฟล์ ที่ถูกเขียน ไว้ด้วย php อีกทีหนึ่ง $data = json_decode(file_get_contents("php://input")); // ดึงข้อมูลจากไฟล์ มาใส่ตัวแปร object ชื่อ $data $name=$mysqli->real_escape_string($data->name); // เอาค่ามาเก็บในตัวแปรอีกทีหนึ่ง $tel=$mysqli->real_escape_string($data->tel); $address=$mysqli->real_escape_string($data->address); // ชุดข้อมูลและฟิลด์ที่จะบันทึก อันนี้เป็นฟังก์ชั่นเฉพาะที่่เราใช้งาน // ใครจะเขียนแบบ mysqli ปกติก็ได้ $data=array( "name"=>$name, "tel"=>$tel, "address"=>$address, ); insert("tbl_myfriend",$data); // ฟังชั่นบันทึกข้อมูล ง่ายๆ ไม่กี่บรรทัด exit; } // สำหรับการลบข้อมูล if(isset($_GET['deleteFriend'])){ delete("tbl_myfriend"," id='".$_GET['Id']."' "); // ลบข้อมูลตามตัวแปร Id ที่ส่งเข้ามา exit; } ?>
3. ไฟล์ app.js
ไฟล์คำสั่งการทำงาน จะมีเพิ่มเติมจากโค้ดเดิมคือ
ใน myFriend service จะมีการสร้างฟังก์ชั่น การเพิมข้อมูล และการลบข้อมูล
ใน CreateCtrl controller จะมีการสร้างฟังก์ชั่น ส่งค่าการเพิ่มข้อมูล
ใน ListCtrl controller จะมีการสร้างฟังก์ชั่น ส่งค่าการลบข้อมูล
คำอธิบายแสดงในโค้ด
// สร้าง module ชื่อ app และ inject ngRoute เข้าไป หมายถึง เรียกใช้งาน ngRoute service angular.module("app",["ngRoute"]) // กำหนดค่า url สำหรับเรียกไฟล์ php ด้านล่าง เป็นของ ที่ทดสอบ เปลี่ยนตามความเหมาะสม // โดยเรียก path ให้ถูกต้อง .value("urlData","http://localhost/ninenikc/demo/angularjs/ex7/data/model.php") // กำหนด object service ชื่อ myFriend .factory("myFriend",["$http","urlData", // inject ค่า $http กับ urlData ไปใช้งาน function($http,urlData){ // กำหนดตรงนี้ด้วย var factory = {}; // สร้างตัวแปร object // สร้างฟังก์ั่น ใน service myFriend ตัวนี้เป็น // ฟังก์ชั่น สำหรับแสดงข้อมูล มีการส่งค่า id ไปด้วย โดยจะเป็นค่าว่างก็ได้ factory.viewFriend = function(Id){ // ใช้ $http service ไปดึงข้อมูลมาแสด ส่งค่า get viewFriend กับ Id ที่เป็นตัวแปรไปด้วย return $http.get(urlData+"?viewFriend=&Id="+Id); // คืนค่าข้อมูลกลับ }; // สร้างฟังก์ั่น ใน service myFriend ตัวนี้เป็น // ฟังก์ชั่น บันทึกข้อมล ส่งค่าแบบ post ส่งค่า object ชุดข้อมูล objFriend factory.addFriend = function(objFriend){ // ใช้ $http service ส่งค่าแบบ post // และมีการส่งตัวแปรแบบ get ชื่อ addFriend ไปเป็นเงื่อนไขทำงานคำสั่ง เพิ่มข้อมูล return $http.post(urlData+"?addFriend",objFriend); }; // สร้างฟังก์ั่น ใน service myFriend ตัวนี้เป็น // ฟังก์ชั่น ลบข้อมูล โดยส่งค่า Id เข้าไปทำการลบข้อมูล factory.deleteFriend = function(Id){ // ใช้ $http service ส่งค่าแบบ get // และมีการส่งตัวแปรแบบ get ชื่อ deleteFriend // กับ Id สำหรัลใย้ในการลบข้อมูล return $http.get(urlData+"?deleteFriend&Id="+Id); }; return factory; // คืนค่า object ไปให้ myFriend service }]) // การ config ค่า provider service ในที่นี้เป็นการตั้งต่าการ // ลิ้งค์ไปมาระหว่างไฟล์ ด้วย $routeProvider .config(function($routeProvider) { $routeProvider .when('/', { // ถ้ามีค่าเท่ากับ / controller:'ListCtrl', // ให้กำหนด หรือสร้าง controller ชื่อ ListCtrl templateUrl:'tpl/list1.html' // โดยดึงจากไฟล์ templage ชื่อ list.html }) .when('/view/:Id', { // เหมือนด้านบน แค่เปลี่ยนคำ controller:'ViewCtrl', templateUrl:'tpl/view.html' }) .when('/edit/:Id', { controller:'EditCtrl', templateUrl:'tpl/detail1.html' }) .when('/new', { controller:'CreateCtrl', templateUrl:'tpl/detail1.html' }) .otherwise({ // กรณีอื่นๆ ที่่ไม่เข้าเงื่อนไข redirectTo:'/' // ให้ไปที่ ค่า / }); }) // พอเราเปิดมาครั้งแรก $routeProvider จะเท่ากับ / ตาม config ด้านลน // ทำให้มีการสร้าง ListCtrl controller ขึน เราจะมาใช้งานกันในส่วนหน้าแรกกัน ในส่วนนี้ // มีการ inject หรือใช้งาน $scope , $location (คล้าย window.location) และ myFriend service ที่เราสร้าง .controller("ListCtrl",["$scope","$location","myFriend", function($scope,$location,myFriend){ // กำหนดตรงนี้ด้วย แต่ไม่ต้องมี "" $scope.friends = {}; // กำหนด ตัวแปร object ที่เราจะไปเรียกใช้ ในหน้า list.html // พอแสดงหน้า list.html ให้ เรียกใช้งาน ฟังก์ชั่น ใน myFriend service ที่เราสร้าง myFriend.viewFriend('').success(function(result){ // ดึงข้อมูลสำเร็จ ส่งกลับมา $scope.friends = result; // เอาค่าข้อมูลที่ได้ กำหนดให้กับ ตัวแปร object }); $scope.predicate = "id"; // อันนี้กำหนดค่า สำหรับการเรียงข้อมูลเริ่มต้น ในตารางไฟล์ list.html // เรียงข้อมูลจาก id // กำหนดฟังก์ชัน ลบข้อมูล จากที่เรียกใช้ในหน้า template list.html $scope.deleteData = function(Id){ // ส่ง Id เข้ามา if(confirm("Confirm delete?")){ // ขึ้นแจ้งยืนยันการลบก่อน // ถ้ายืนยันการลบข้อมูลแล้ว ให้เรยกใช้งาน myFriend service ที่เราสร้าง เพื่อลบข้อมูล myFriend.deleteFriend(Id).success(function(){ // ถ้า ok ลบข้อมูล $location.path("#/"); // ลบแล้วให้รีเฟรส }); } }; }]) // ทำให้มีการสร้าง CreateCtrl controller ขึ้น // มีการ inject หรือใช้งาน $scope , $location (คล้าย window.location) และ myFriend service ที่เราสร้าง .controller("CreateCtrl",["$scope","$location","myFriend", function($scope,$location,myFriend){ // กำหนดตรงนี้ด้วย แต่ไม่ต้องมี "" // กำหนด ฟังก์ชั่น สำหรับรับค่า การ submit ฟอร์ม โดยส่ง object data เข้ามาด้วย $scope.submitForm = function(objFriend){ if($scope.myForm.$valid){ // ตรวจสอบฟอร์ม หากพร้อมให้ทำงาน // เรียกใช้งาน ฟังก์ชั่น ใน myFriend service ที่เราสร้าง ชื่อ addFriend // โดยจะส่งข้อมูล object เข้าไป myFriend.addFriend(objFriend).success(function(){ // หากทำการบันทึกข้อมูลสำเร็จ $scope.myForm.$setPristine(); // ล้างค่าข้อมูลในฟอร์ม พร้อมบันทึกใหม่ $scope.data = null; // ให้ object ชื่อ data เป็นค่าว่าง รอรับข้อมูลใหม่ }); } }; }]) // controller หน้า index.html หลัก .controller("appController",["$scope", function($scope){ }]);
ดูผลลัพธ์
ตัวอย่างนี้ จะเป็นการจำลองการทำงาน ให้ทดสอบเพิ่มและลบช้อมูลดูได้
ติดตามเนื้อหาตอนหน้า ตอนสุดท้ายเกี่ยวกับการจัดการฐานข้อมูลได้