PHP CI MANIA - ตัวอย่างการเปลี่ยน Drop-down List ของจังหวัด เมื่อเลือก ภาค (Option List)

โดย SONGCHAI SAETERN
สำหรับการทำงานของโค้ดในตัวอย่างนี้ จะสามารถนำไปใช้ได้กับการเปลี่ยนแปลงรายการตัวเลือกใน Drop-down List ทุกตัวที่ต้องการให้มีผลกับ Drop-down List ตัวอื่นๆ เช่น

1. ในตัวอย่างนี้ เมื่อเลือกภาค ก็จะแสดงรายชื่อจังหวัด หรือ
2. นำไปดัดแปลงเป็น เมื่อเลือกจังหวัด ก็แสดงรายชื่อ อำเภอ หรือ
3. เมื่อเลือกอำเภอ ก็จะแสดงรายชื่อตำบล

หรือการเลือกตัวเลือกของข้อมูลต่างๆที่มีลำดับชั้น เช่น แผนก ฝ่าย เป็นต้น



ลำดับขั้นตอนการแก้ไขโค้ดหลังจากที่เราใช้ PHP CI MANIA ทำการ Generate ไฟล์หน้าเว็บออกมาเรียบร้อยแล้ว ให้แก้ส่วนต่างๆดังนี้

1. เพิ่ม action ใน javascript เพื่อส่ง AJAX ไปดึงข้อมูลจาก...
2. Controller เขียนฟังก์ชั่นเรียกข้อมูลจากตารางที่ต้องการ เช่น ส่งไอดีภาค เข้ามาก็ไปดึง ข้อมูลจังหวัดที่ตรงกับไอดีภาคนั้นๆ โดยเรียกจาก...
3. Model ซึ่งจะกำดึงข้อมูลตามเงื่อนไขโดยอ้างอิงฟังก์ชั่นใน MY_Model ก็จะไม่ได้เขียนอะไรมากเท่าไหร่ แค่ระบุชื่อตารางให้ตรงก็พอ




1. สร้าง Action ให้ทำงานเมื่อ <select> ของภาคเปลี่ยนแปลง ก่อนอื่นให้ตรวจสอบ id ที่ต้องการ


2. เมื่อได้ id ของ <select> ภาค มาแล้วก็เปิดไฟล์ JavaScript ที่เมื่อ Generate โค้ดออกมาจะอยู่ที่โฟลเดอร์ assets/js_modules/ตามด้วยชื่อที่ตั้งไว้  เขียนดักจับเหตุการณ์เมื่อเกิด On Change ให้เรียกใช้งานฟังก์ชั่น getProvinceOptionList(this.value) **หมายเหตุในภาพไม่ได้แก้ไข this.value**


3. ในคลาส AddressList ให้เพิ่มฟังก์ชั่น getProvinceOptionList() เข้าไป ซึ่งจะทำการส่งค่า geo_id ซึ่งเป็นไอดีของ ภาค ไปยังหน้าเว็บ (Controller) Address_list ฟังก์ชั่น get_province_list()


4. สร้างฟังก์ชั่น get_province_list() ไว้ในคอนโทรลเลอร์ Address_list โดยจะทำการส่ง geo_id ไปที่ Model เพื่อดึงข้อมูลจังหวัดตามไอดีภาคใน Address_list_model ฟังก์ชั่น province_list($geo_id)


5. สร้างฟังก์ชั่น province_list() ในไฟล์โมเดล Address_list_model เพื่อดึงข้อมูลที่ต้องการโดยมีคำสั่งดังนี้

    $this->set_table_name()   ระบุชื่อตารางที่ต้องการดึงข้อมูล
    $this->set_select_field()   เลือกฟิลด์ที่ต้องการ
    $this->set_where()            กำหนดเงื่อนไขที่ใช้ดึงข้อมูล
    $this->set_order_by()       กำหนดการจัดเรียงข้อมูล
    $this->list_record()          ดึงข้อมูลออกมาในรูปแบบ Array


6. ส่วนที่ต้องเพิ่มเติมขึ้นมาคือ การสร้างไฟล์ View สำหรับแสดง option list จากข้อมูล Array ที่ได้มา ซึ่งปกติ เราจะคุ้นชินกับการ echo '<option></option>';  แต่เนื่องจากไม่ต้องการให้มี HTML อยู่รวมใน View หรือไม่อยากให้ PHP ปนกับ HTML ผู้เขียนจึงได้ทำการแยกออกจากกัน
    ข้อสังเกต  parser-repeat="[province_list]"  ในวงเล็บ province_list จะต้องตรงกับคีย์ของ data ใน Controller ที่เราใช้รับค่าจาก Model นั่นคือ $data['province_list'] = $list;

    และ {PROVINCE_ID} และ {PROVINCE_NAME} ก็คือฟิลด์ที่เรา set_select_field() ในข้อ 5 นั่นเอง


7. ทดสอบการทำงาน จะได้ผลลัพธ์ดังในรูป



สรุปแล้ว เราจะแก้ไขไฟล์อยู่ด้วยกันทั้งหมด 3 ไฟล์ และสร้างใหม่ 1 ไฟล์

สำหรับไฟล์ซอร์สโค้ดตัวอย่าง สามารถเข้าไปดาวน์โหลดได้ ที่นี่

ดูวิดีโอเพิ่มเติมได้ที่ >> CodeIgniter : PHP CI MANIA


คำสั่ง SQL สำหรับสร้างฐานข้อมูลตัวอย่าง ระบบจัดการข้อมูลนักเรียนด้วย PHP CI MANIA

โดย SONGCHAI SAETERN

PHP CI MANIA - ระบบบริหารจัดการข้อมูลนักเรียน





[ SQL Code ]

-- Dumping database structure for demo_db_student
CREATE DATABASE IF NOT EXISTS `demo_db_student` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `demo_db_student`;

-- Dumping structure for table demo_db_student.ci_sessions
CREATE TABLE IF NOT EXISTS `ci_sessions` (
  `id` varchar(128) NOT NULL,
  `ip_address` varchar(45) NOT NULL,
  `timestamp` int(10) unsigned NOT NULL DEFAULT '0',
  `data` blob NOT NULL,
  PRIMARY KEY (`id`,`ip_address`),
  KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Dumping data for table demo_db_student.ci_sessions: ~12 rows (approximately)
/*!40000 ALTER TABLE `ci_sessions` DISABLE KEYS */;
INSERT INTO `ci_sessions` (`id`, `ip_address`, `timestamp`, `data`) VALUES
    ('0dss0kb4hds4iv653gk1lhbl9s1bcphf', '::1', 1544667484, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343636373434323B),
    ('25on4sifhap0p3a76rin46k57p7cb434', '::1', 1544371799, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343337313739393B),
    ('2fcq15t11b4j69bubuakhaigbfgkfdk2', '::1', 1544370351, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343337303136393B),
    ('agrknslnqdvnfjkrlpu54to45n093d5v', '127.0.0.1', 1545061313, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534353036313239383B),
    ('cpferosgqo1seo29fbqa9adfu1t44f1t', '::1', 1544452831, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343435323831363B),
    ('ervlbb3o7m65jhkm30mjlb0seld1qast', '127.0.0.1', 1545063860, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534353036333836303B),
    ('ggg7a804uhjfussbq4mdpg0021t0dsqr', '::1', 1544397791, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343339373739303B),
    ('k4m3opblnrtok0epdbke8q30vu002j8r', '::1', 1544664674, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343636343637343B),
    ('os664vl5sfq4ogap6avri4p6ba10tkm7', '::1', 1544452290, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343435323239303B),
    ('povhmujpfl0ijffja4odt2sgcmtnc0gu', '::1', 1544451876, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343435313634343B),
    ('r50fouq0628aftckjdjohadrf5atjtb3', '::1', 1544452289, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534343435313938393B),
    ('vdga6a46mj28r6ffppuih1i3j9t0e5q8', '127.0.0.1', 1545064106, _binary 0x5F5F63695F6C6173745F726567656E65726174657C693A313534353036333836303B);
/*!40000 ALTER TABLE `ci_sessions` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_academic_year
CREATE TABLE IF NOT EXISTS `tb_academic_year` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `thai_year` int(4) NOT NULL COMMENT 'ปีการศึกษา',
  `term` int(1) NOT NULL COMMENT 'เทอม',
  `ref_student_id` int(11) NOT NULL COMMENT 'รหัสอ้างอิง ตารางนักเรียน',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ตารางข้อมูลประจำปีการศึกษา';

-- Dumping data for table demo_db_student.tb_academic_year: ~0 rows (approximately)
/*!40000 ALTER TABLE `tb_academic_year` DISABLE KEYS */;
/*!40000 ALTER TABLE `tb_academic_year` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_ci_log_delete
CREATE TABLE IF NOT EXISTS `tb_ci_log_delete` (
  `log_id` int(11) NOT NULL AUTO_INCREMENT,
  `log_del_remark` varchar(50) DEFAULT NULL COMMENT 'หมายเหตุ',
  `log_table_name` varchar(70) DEFAULT NULL COMMENT 'ชื่อตารางที่ลบ',
  `log_table_pk_name` varchar(100) DEFAULT NULL COMMENT 'PK Field',
  `log_table_pk_value` varchar(100) DEFAULT NULL COMMENT 'PK Value',
  `log_del_condition` varchar(100) DEFAULT NULL COMMENT 'เงื่อนไขที่ใช้ลบ',
  `log_record_data` text COMMENT 'ข้อมูลเรคอร์ดที่ลบ',
  `create_user_id` int(11) DEFAULT NULL COMMENT 'รหัสผู้ทำรายการ',
  `create_datetime` datetime DEFAULT NULL COMMENT 'วันที่ทำรายการ',
  `log_login_id` int(11) DEFAULT NULL COMMENT 'อ้างอิงตารางล็อกอิน',
  PRIMARY KEY (`log_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='เก็บข้อมูลก่อนลบ';

-- Dumping data for table demo_db_student.tb_ci_log_delete: ~1 rows (approximately)
/*!40000 ALTER TABLE `tb_ci_log_delete` DISABLE KEYS */;
INSERT INTO `tb_ci_log_delete` (`log_id`, `log_del_remark`, `log_table_name`, `log_table_pk_name`, `log_table_pk_value`, `log_del_condition`, `log_record_data`, `create_user_id`, `create_datetime`, `log_login_id`) VALUES
    (14, 'ทดสอบการลบ', 'tb_student', 'id', '2', 'id = 2', '{"id":"2","student_code":"002","prefix_name":"2","firstname":"\\u0e21\\u0e32\\u0e19\\u0e35 555","lastname":"\\u0e43\\u0e08\\u0e14\\u0e35"}', 1, '2018-12-09 22:39:53', NULL);
/*!40000 ALTER TABLE `tb_ci_log_delete` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_ci_log_history
CREATE TABLE IF NOT EXISTS `tb_ci_log_history` (
  `log_id` int(11) NOT NULL AUTO_INCREMENT,
  `log_edit_user` varchar(30) DEFAULT NULL COMMENT 'อ้างอิงตาราง User',
  `log_edit_datetime` datetime DEFAULT NULL COMMENT 'เมื่อไหร่',
  `log_edit_remark` varchar(50) DEFAULT NULL COMMENT 'หมายเหตุ (ต้องระบุ)',
  `log_edit_table` varchar(50) DEFAULT NULL COMMENT 'ที่ตารางไหน',
  `log_edit_table_pk_name` varchar(50) DEFAULT NULL COMMENT 'PK ฟิลด์',
  `log_edit_table_pk_value` varchar(15) DEFAULT NULL COMMENT 'PK ข้อมูล',
  `log_edit_condition` varchar(100) DEFAULT NULL COMMENT 'เก็บเงื่อนไขการอัพเดต',
  `log_login_id` int(11) DEFAULT NULL COMMENT 'อ้างอิงการ ตาราง Login',
  PRIMARY KEY (`log_id`)
) ENGINE=MyISAM AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

-- Dumping data for table demo_db_student.tb_ci_log_history: 2 rows
/*!40000 ALTER TABLE `tb_ci_log_history` DISABLE KEYS */;
INSERT INTO `tb_ci_log_history` (`log_id`, `log_edit_user`, `log_edit_datetime`, `log_edit_remark`, `log_edit_table`, `log_edit_table_pk_name`, `log_edit_table_pk_value`, `log_edit_condition`, `log_login_id`) VALUES
    (31, '1', '2018-12-09 22:39:28', 'แก้ไขชื่อนะจ๊ะ', 'tb_student', 'id', '2', 'id = 2', NULL),
    (32, NULL, '2018-12-09 22:45:50', 'adfgadsf', 'tb_student', 'id', '1', 'id = 1', NULL);
/*!40000 ALTER TABLE `tb_ci_log_history` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_room
CREATE TABLE IF NOT EXISTS `tb_room` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `room_name` varchar(50) DEFAULT NULL COMMENT 'ชื่อห้องเรียน',
  `ref_teacher_id` int(11) DEFAULT NULL COMMENT 'ครูประจำชั้น',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='ตารางห้องเรียน';

-- Dumping data for table demo_db_student.tb_room: ~1 rows (approximately)
/*!40000 ALTER TABLE `tb_room` DISABLE KEYS */;
INSERT INTO `tb_room` (`id`, `room_name`, `ref_teacher_id`) VALUES
    (1, 'ม.2 ห้อง 1', 1);
/*!40000 ALTER TABLE `tb_room` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_student
CREATE TABLE IF NOT EXISTS `tb_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_code` varchar(5) DEFAULT NULL COMMENT 'รหัสประจำตัว',
  `prefix_name` varchar(10) DEFAULT NULL COMMENT 'คำนำหน้าชื่อ [1=เด็กชาย,2=เด็กหญิง,3=นาย,4=นางสาว]',
  `firstname` varchar(30) DEFAULT NULL COMMENT 'ชื่อ',
  `lastname` varchar(30) DEFAULT NULL COMMENT 'นามสกุล',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='ตารางนักเรียน';

-- Dumping data for table demo_db_student.tb_student: ~1 rows (approximately)
/*!40000 ALTER TABLE `tb_student` DISABLE KEYS */;
INSERT INTO `tb_student` (`id`, `student_code`, `prefix_name`, `firstname`, `lastname`) VALUES
    (1, '001', '1', 'มานะ 44', 'อุตสาหะ');
/*!40000 ALTER TABLE `tb_student` ENABLE KEYS */;

-- Dumping structure for table demo_db_student.tb_teacher
CREATE TABLE IF NOT EXISTS `tb_teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `prefix_name` varchar(30) DEFAULT NULL COMMENT 'คำนำหน้าชื่อ',
  `firstname` varchar(30) DEFAULT NULL COMMENT 'ชื่อ',
  `lastname` varchar(30) DEFAULT NULL COMMENT 'นามสกุล',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='ตารางอาจารย์';

-- Dumping data for table demo_db_student.tb_teacher: ~2 rows (approximately)
/*!40000 ALTER TABLE `tb_teacher` DISABLE KEYS */;
INSERT INTO `tb_teacher` (`id`, `prefix_name`, `firstname`, `lastname`) VALUES
    (1, '3', 'ชูใจ', 'ใจดี'),
    (2, '3', 'ปิติ', 'ยินดี');
/*!40000 ALTER TABLE `tb_teacher` ENABLE KEYS */;





HeidiSQL การ Import ฐานข้อมูลจากไฟล์ SQL

โดย SONGCHAI SAETERN
1. เลือกฐานข้อมูลที่ต้องการ


2. คลิกเมนู File > Run SQL file..






3. เปิดไปที่โฟลเดอร์เก็บไฟล์ .sql แล้วเลือกไฟลื จากนั้นคลิก Open


4. รอจนกว่าจะดำเนินการเรียบร้อย


5. หลังจากดำเนินการเสร็จ จะยังไม่ปรากฏตารางทั้งหมดออกมา ให้กด F5 เพื่อเรียกข้อมูลออกมา


เพียงเท่านี้ก็สามารถ Import ไฟล์ขนาดใหญ่เรียบร้อย

ดาวน์โหลดโปรแกรมจัดการฐานข้อมูล HeidiSQL ได้ที่
https://www.heidisql.com/



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP CI MANIA การกำหนดจำนวนรายการต่อหน้าใน Pagination

โดย SONGCHAI SAETERN
1. เปิดเข้าไปที่ modules ที่สร้าง Generate เรียบร้อย




2. แก้ไขตัวเลขที่ตัวแปร $this->per_page = 30;


#PHPCIMANIA - PHP Page Generator
http://fastcoding.phpcodemania.com

ดูวิดีโอเพิ่มเติมได้ที่ >> CodeIgniter : PHP CI MANIA

กด Start ตรง mysql ใน XAMPP ไม่ได้ แก้ไขยังไงดี?

โดย SONGCHAI SAETERN
ข้อความ Error ที่ปรากฏดังนี้

6:37:41  [mysql] This may be due to a blocked port, missing dependencies,
6:37:41  [mysql] improper privileges, a crash, or a shutdown by another method.
6:37:41  [mysql] Press the Logs button to view error logs and check
6:37:41  [mysql] the Windows Event Viewer for more clues
6:37:41  [mysql] If you need more help, copy and post this
6:37:41  [mysql] entire log window on the forums




ต้องบอกก่อนว่าเคสนี้เกิดขึ้นเมื่อผมรัน XAMPP แบบ Portable แล้วดันไปขยับสาย USB การเชื่อมต่อก็เลยหลุดไป หลังจากถอดสาย USB แล้วเสียบใหม่ XAMP ก็รันได้แค่ Apache อย่างที่เห็นในภาพ



หลังจากนั้นสิ่งที่ทำอย่างแรกก็คือ คัดลอก Error ไปค้นในเว็บแล้วลองทำไปเรื่อยๆ จนกว่าจะหาวิธีได้

xampp MySQL does not start
https://stackoverflow.com/questions/18177148/xampp-mysql-does-not-start

เว็บแรกทำให้รู้ว่าน่าจะเกี่ยวกับ Port

ก็เลยลองเปลี่ยนเป็นพอร์ตอื่นก็ Start ได้ทันที
You also need to change port 3306 to 3307 in xampp\php\php.ini


แต่...นี่ยังไม่ใช่ที่ต้องการ เพราะจะใช้พอร์ตเดิมอ่ะ ไม่อยากวุ่นวายไปเปลี่ยนซอร์สโค้ดส่วนของการเชื่อมต่อฐานข้อมูลอีก!!


ก็มาเจออีกเว็บนึง

XAMPP MySQL port 3306 keeps reseting itself
https://stackoverflow.com/questions/31614378/xampp-mysql-port-3306-keeps-reseting-itself

ก็ได้วิธีมาแล้ว แต่ขั้นตอนมันไม่เหมือนที่เขาบอกไว้เลยนะ อาจจะเพราะเป็น Windows 10 เลยไม่ตรงกับเวอร์ชั่นที่เขาแนะนำไว้

Ctrl + Alt + Delete




แต่ยังไม่ละความพยายามครับ กดมันไปเรื่อยๆทุกแท็ปให้ครบนั่นแหละ >O<

และสุดท้ายก็เจอสักที ^O^



มาถึงตรงนี้ก็ขอตัดจบตามรูปภาพด้านบนนี้เลยละกันครับ

จัดการ End Process รายการที่ชื่อ mysqld.exe ก็เป็นอันเสร็จพิธี




แก้ปัญหา Control Panel ของ Xampp เปิดไม่ขึ้น - Xampp control panel is not showing
https://phpcodemania.blogspot.com/2018/05/xampp-control-panel-is-not-showing.html



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

3 ขั้นตอน เพื่อการพัฒนาเว็บแอพพลิเคชั่นด้วย PHP ให้เสร็จเร็วยิ่งขึ้น

โดย SONGCHAI SAETERN
เขียนโปรแกรมเว็บแอพพลิเคชั่นด้วยภาษา PHP ด้วย PHP CI MANIA  เพียงแค่ 3 ขั้นตอนง่ายๆ


STEP 1 เลือกตารางที่ต้องการ


STEP 2 ตั้งค่าพาธเก็บไฟล์ ชื่อไฟล์ ชื่อช่องป้อนข้อมูล และ ฟังก์ชั่น PHP ที่เกี่ยวข้อง


STEP 3 สร้างไฟล์ MVC ทีละส่วนจนครบ และทดสอบได้ในลิงค์แท็ป Controller



มาดูขั้นตอนทั้งหมดอย่างละเอียดได้ที่คลิปนี้

วิธีเขียนโปรแกรม PHP ให้งานเสร็จเร็วขึ้นด้วย PHP CI MANIA - CodeIgniter Generator

โดย SONGCHAI SAETERN
เป็นคำถามที่เมื่อก่อนผมตอบค่อนข้างยากนะครับ

แต่เดี๋ยวนี้ถ้าใครถาม ผมก็จะบอกว่า ลองกดถูกใจและติดตามเพจของผมไว้นะครับ
แล้วจะเจอเครื่องมือใหม่ๆ ที่ทำให้งานคุณเสร็จเร็วขึ้นกว่าเดิมอย่างแน่นอน




และขั้นตอนการใช้งานเจ้าเครื่องมือที่ชื่อว่า "PHP CI MANIA" ก็มีดังต่อไปนี้

Download & Install


สนใจสั่งซื้อและดาวน์โหลดได้ที่ http://fastcoding.phpcodemania.com

PHP CI MANIA ตอนที่ 1 : ออกแบบฐานข้อมูลเพื่อการ Generate Code ที่ง่ายขึ้น




PHP CI MANIA ตอนที่ 2 : เริ่มต้นสร้างหน้าเว็บ การตั้งค่าส่วนต่างๆ ก่อน Generate




PHP CI MANIA ตอนที่ 3 : สร้างลิงค์เพื่อเปิดหน้าเว็บไปยัง Module ที่คัดลอกมา



ดูวิดีโอเพิ่มเติมได้ที่ >> CodeIgniter : PHP CI MANIA

 

PHP CI MANIA ตอนที่ 1 - ติดตั้งและใช้งาน PHP Code Generator โปรแกรมสร้างโค้ดอัตโนมัติ (PHP Web Generator)

โดย SONGCHAI SAETERN
PHP Code Generator ตอนที่ 1 - ติดตั้งและใช้งาน ตัว Generate โค้ดอัตโนมัติ PHP CI MANIA

แนะนำขั้นตอนการดาวน์โหลด และติดตั้งเพื่อเริ่มใช้งาน



วิธีติดตั้งและใช้งานเบื้องต้น

       (เวอร์ชั่น Premium)

1. คลายซิป จะได้โฟลเดอร์ดังนี้
    1.1 phpcimania_pro/advance/expert  สำหรับใช้ Generate Code
    1.2 create_db_ci_gen.sql   ไฟล์ SQL สำหรับสร้างฐานข้อมูลของระบบ PHP CI MANIA
    1.3 example_project  สำหรับทดสอบโค้ด หรือนำมาเป็นตัวอย่างเริ่มต้นโปรเจ็กต์ CodeIgniter 3 + SB Admin (Bootstrap template)
    1.4 create_demo_db_student.sql ฐานข้อมูลสำหรับ example_project

(เวอร์ชั่น Premium)
    1.5 example_expert  ระบบสมาชิกแบบมีอีเมล ระบบรีเซ็ตลืมรหัสผ่าน
    1.6 db_school_management_for_expert.sql ฐานข้อมูลตัวอย่าง example_expert  

2. นำโฟลเดอร์ที่ได้ไปวางใน Document root ของเว็บเซิร์ฟเวอร์ที่ใช้งาน (กรณีใช้ xampp ก็คือโฟลเดอร์ htdocs )

3. สร้างฐานข้อมูลด้วยการ Import ไฟล์ db_ci_gen.sql  (หรือจะเปิดเอาโค้ดไปรันในแท็ป SQL ก็ได้)

4. ตั้งค่าการเชื่อมต่อฐานข้อมูลที่ไฟล์ application/config/database.php
    $mysql_port = 3306;

    $host_name = 'localhost';

    $db_name = 'db_ci_gen';
    $db_user = 'root';

    $db_pass = '';

   แก้ไขค่าด้านบนนี้ให้ตรงกับเว็บเซิร์ฟเวอร์ที่ใช้งาน

5. เข้าใช้งานด้วย Username : phpcimania และ Password : fastcoding

6. หลังจากคลิกสร้างไฟล์ครบในแท็ป Controller จะแสดง PATH ที่เก็บไฟล์
    PHP จะเก็บไว้ใน application/modules/ชื่อ path ที่กำหนดตอนสร้างโค้ด
    JavaScript จะเก็บไว้ที่ assets/js_modules/ชื่อ path ที่กำหนดตอนสร้างโค้ด
   ในขั้นตอนนี้สามารถดูผลลัพธ์ได้โดยกดลิงค์ในแท็ป Controller

7. คัดลอกโฟลเดอร์ PHP และไฟล์ JavaScript ไปวางในโฟลเดอร์ example_project (ที่คลายซิปออกมาพร้อมกัน) ต้องวางใน PATH เดียวกันกับข้อที่ 6

8. ทดลองรันที่ http://localhost/example_project หรือระบุตามโฟลเดอร์ที่ท่านนำไปวางบนเว็บเซิร์ฟเวอร์



กรณีสร้าง Database ใหม่จะต้องมีตารางต่อไปนี้ด้วย
ซึ่งทั้งหมดจะอยู่ที่ไฟล์ create_require_table_new_system.sql

1. ci_sessions
2. tb_ci_log_delete
3. tb_ci_log_history
4. tb_uploads_filename
5. tb_department
6. tb_members
7. tb_members_level
8. tb_members_prefix



 




ปล. สำหรับวิดีโอสอนการใช้งานจะทยอยอัพเดตเรื่อยๆ
ติดตามได้ที่เพจ https://www.facebook.com/ToBeDeveloper

PHP วิธีการแทนที่ตัวเลข 4 ตัวท้ายของเบอร์โทรศัพท์

โดย SONGCHAI SAETERN
วิธีการแทนที่ตัวเลข 4 ตัวท้ายของเบอร์โทรศัพท์

INPUT
0801234567

ผลลัพธ์ที่ต้องการ

080123xxxx

ตัวอย่างโค้ด PHP

<?php
    $tel_number = '0801234567';
    $new_num = substr_replace($tel_number, 'xxxx', -4); //080123xxxx 

    echo '<h3>ผลลัพธ์</h3>';
    echo $new_num;
?>



นอกจากใช้แทนที่เบอร์โทรศัพท์แล้ว ยังสามารถใช้แทนที่ข้อความอื่นๆ โดยกำหนดตำแหน่งต่างๆ ได้โดยสามารถอ่านรายละเอียดเพิ่มเติมได้ดังนี้


คำอธิบายฟังก์ชั่น

substr_replace

(PHP 4, PHP 5, PHP 7)
substr_replace — Replace text within a portion of a string

Description ¶

mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )
substr_replace() replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement.

อ่านเพิ่มเติม
http://php.net/manual/en/function.substr-replace.php

ตัวอย่างการเข้ารหัส-ถอดรหัส ID ด้วย openssl_encrypt และ openssl_decrypt

โดย SONGCHAI SAETERN
บทความนี้จะนำเสนอวิธีเข้ารหัสไอดี ที่ส่งผ่านลิงค์รับค่าแบบ GET เพื่อป้องกันการสุ่มดูข้อมูลไอดีคนอื่น ที่ไม่ใช่ของตัวเองกันครับ


สังเกตว่าข้อมูลด้านบนนี้เป็นของ "พนักงานขาย คนที่ 1" เป็นการจำลอง SESSION ที่ LOGIN เข้ามา และในตารางนั้นก็คือข้อมูลลูกค้าของตนเอง เมื่อลองคลิกดู "รายละเอียด" ก็จะพบข้อมูลดังภาพด้านล่างนี้


การรับส่งข้อมูลแบบไม่ได้เข้ารหัส ID จะทำให้สามารถสุ่มเลขไอดีได้เรื่อย เพื่อดูข้อมูลของลูกค้าคนอื่นๆ ได้ ดังนั้นเรามาดูฟังก์ชั่นเข้ารหัสที่จะใช้ป้องกันปัญหานี้กัน


สังเกตว่าเมื่อสุ่มรหัสอื่นๆ จะเห็นข้อมูลของพนักงานคนอื่นได้ด้วย

ดังนั้น ก็ต้องเรียกใช้ฟังก์ชั่นเข้ารหัสข้อมูลก่อนส่งไปในหน้าอื่นๆ



เมื่อลองเอาเมาส์ไปชี้ที่ลิงค์ "รายละเอียด" บน Status bar จะแสดงให้เห็นว่าไอดี ถูกเข้ารหัสไว้แล้ว



เมื่อคลิกเข้าไปดูรายละเอียด จะสังเกตเห็นว่า URL ในส่วนของ id จะถูกเข้ารหัสไว้เรียบร้อย


หากลองสุ่มเปลี่ยน ID เป็นตัวเลขอื่น เมื่อเข้าสู่กระบวนการถอดรหัส จะไม่พบข้อมูล


และเพื่อให้ซับซ้อนอีกนิดหน่อย ผมได้ดัดแปลงให้แสดงการเข้ารหัสแบบสุ่ม คือเมื่อเปิดเข้ามาในแต่ละครั้ง ID ที่ถูกเข้ารหัสจะแสดงต่างกันไป



ท่านใดสนใจก็ลองนำไปใช้งานกันดูนะครับ ถ้าพบข้อผิดพลาดในส่วนหนึ่งส่วนใด รบกวนแจ้งผู้เขียนด้วยนะครับ เพื่อจะได้หาทางแก้ไขให้ใช้งานได้อย่างราบรื่นต่อไป

ตัวอย่างโค้ด PHP ทั้งหมดในบทความนี้


encrypt_function.php
<?php

function my_simple_crypt( $string, $action = 'e' ) {

    // you may change these values to your own

    $secret_key = 'my@simple#secret-key234';

    $secret_iv = 'my@simple#secret-iv345';

    $output = false;

    $encrypt_method = "AES-256-CBC";

    $key = hash( 'sha256', $secret_key );

    $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );

    if( $action == 'e' ) {

        $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );

    }

    else if( $action == 'd' ){

  $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );

    }

    return $output;

}

function encrypt($string){

 $salting = substr(md5(microtime()),-1) . $string;

 return my_simple_crypt( $salting, 'e' );

}

function decrypt($string){

 $encode = my_simple_crypt( $string, 'd' );

 return substr($encode, 1);

}

?>
list_data_encode.php
<?php

session_start();

include 'encrypt_function.php';



// Test session

$_SESSION['user_id'] = 1;

//Booking list from database of sale id #2

$tb_booking = array(

    array(

     "id" => 1,

     "booking_name" => "คุณสมหมาย สายเสมอ",

     "booking_amount" => 7,

     "booking_total_price" => 700,

     "booking_email" => "abcd@gmail.com",

     "booking_tel" => "0894567895",

     "sale_id" => 1,

    ),

    array(

     "id" => 2,

     "booking_name" => "คุณมีสุข สมหวัง",

     "booking_amount" => 2,

     "booking_total_price" => 1500,

     "booking_email" => "wxyz@gmail.com",

     "booking_tel" => "0801236547",

     "sale_id" => 1,

    )

);

$arr_sales = array(

    "1" => "พนักงานขาย คนที่ 1",

    "5" => "พนักงานขาย คนที่ 2",

    "9" => "พนักงานขาย คนที่ 3"

);

//FROM SESSION LOGIN

$user_id = $_SESSION['user_id'];

if(isset($arr_sales[$user_id])){

 $session_user_name = $arr_sales[$user_id];

}

?>

<!DOCTYPE html>

<html lang="th">

  <head>

    <meta charset="utf-8">

 <title>ทดสอบการเข้ารหัส-ถอดรหัส ID ก่อนจะนำไปใช้งาน</title>

 <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">

  </head>

  <body>

 <div class="container">

  <div class="panel panel-default">

   <div class="panel-heading">

    <h3>ทดสอบการเข้ารหัส-ถอดรหัส ID ก่อนจะนำไปใช้งาน</h3>

   </div>

   <div class="panel-body">

    <table class="table table-list-search">

      <thead>

       <tr>

        <th>#</th>

        <th>ชื่อลูกค้า</th>

        <th>จำนวน</th>

        <th>ราคา</th>

        <th>พนักงานขาย</th>

        <th>รายละเอียด</th>

       </tr>

      </thead>

      <tbody>

       <?php

       $no = 0;

       foreach($tb_booking as $row){

        $no++;

                if(isset($arr_sales[$row['sale_id']])){

         $sale_respon = $arr_sales[$row['sale_id']];

        }else{

         $sale_respon = $row['sale_id'];

        }

                $encode = urlencode(encrypt($row['id']));

                echo '<tr>

          <td>'.$no.'</td>

          <td>'.$row['booking_name'].'</td>

          <td>'.$row['booking_amount'].'</td>

          <td>'.$row['booking_total_price'].'</td>

          <td>'.$sale_respon.'</td>

          <td><a href="preview_data_encode.php?id='. $encode .'">รายละเอียด</a></td>

         </tr>';

       }

       ?>

      </tbody>

     </table>

   </div>

     </div>

  ผู้ใช้งานขณะนี้คือ : <b><font color="blue"><?php echo $session_user_name;?></font></b>

 </div>

   </body>

</html>

preview_data_encode.php
<?php

 session_start();

 include 'encrypt_function.php';

  //All Booking list from database

 $tb_booking = array(

    1 => array(

     "id" => 1,

     "booking_name" => "คุณสมหมาย สายเสมอ",

     "booking_amount" => 7,

     "booking_total_price" => 700,

     "booking_email" => "abcd@gmail.com",

     "booking_tel" => "0894567895",

     "sale_id" => 1,

    ),

    2 => array(

     "id" => 2,

     "booking_name" => "คุณมีสุข สมหวัง",

     "booking_amount" => 2,

     "booking_total_price" => 1500,

     "booking_email" => "wxyz@gmail.com",

     "booking_tel" => "0801236547",

     "sale_id" => 1,

    ),

    3 => array(

     "id" => 3,

     "booking_name" => "คุณจริงใจ แสนดี",

     "booking_amount" => 4,

     "booking_total_price" => 500,

     "booking_email" => "lmnop@gmail.com",

     "booking_tel" => "0502314569",

     "sale_id" => 5,

    ),

    4 => array(

     "id" => 4,

     "booking_name" => "คุณสุขกาย  สบายใจ",

     "booking_amount" => 6,

     "booking_total_price" => 600,

     "booking_email" => "qrstuv@gmail.com",

     "booking_tel" => "0951542365",

     "sale_id" => 9,

    ),

 );

  $arr_sales = array(

     "1" => "พนักงานขาย คนที่ 1",

     "5" => "พนักงานขาย คนที่ 2",

     "9" => "พนักงานขาย คนที่ 3"

 );

  $id = isset($_GET['id']) ? decrypt(urldecode($_GET['id'])) : '';

  $data = isset($tb_booking[$id]) ? $tb_booking[$id] : array();

  if(!empty($data)){

  if(isset($arr_sales[$data['sale_id']])){

   $sale_respon = $arr_sales[$data['sale_id']];

  }else{

   $sale_respon = $data['sale_id'];

  }

 }else{

  $sale_respon = '-';

 }

  //FROM SESSION LOGIN

 $user_id = $_SESSION['user_id'];

 if(isset($arr_sales[$user_id])){

  $session_user_name = $arr_sales[$user_id];

 }

  $font_color = '';

 if($sale_respon != $session_user_name){

  $font_color = 'red';

 }

?>

<!DOCTYPE html>

<html lang="th">

 <head>

  <meta charset="utf-8">

  <title>ทดสอบการเข้ารหัส-ถอดรหัส ID ก่อนจะนำไปใช้งาน</title>

  <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">

  <style>

  .glyphicon-lg

  {

   font-size:4em

  }

  .square-box

  {

   width:100px; min-height:110px;

   margin:10px;

   text-align:center!important;

   background-color:#676767;

   padding:20px 0

  }

  .square-box

  {

   background-color:#20819e;color:#FFF

  }

  </style>

 </head>

 <body>

  <div class="container">

   <div class="row">

    <div class="col-md-5 toppad  pull-left col-md-offset-3 ">

     <br/>

     <A href="#" >ผู้ใช้งานขณะนี้คือ : <b><font color="blue"><?php echo $session_user_name;?></font></b></A>

     <br>

     <p class=" text-info"><?php echo date('Y-m-d H:i:s');?></p>

    </div>

    <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6 col-xs-offset-0 col-sm-offset-0 col-md-offset-3 col-lg-offset-3 toppad" >

               <div class="panel panel-info">

      <?php

       if(!empty($data)){

       ?>

              <div class="panel-heading">

        <h3 class="panel-title"><b><?php echo $data['booking_name'];?></b></h3>

       </div>

       <div class="panel-body">

        <div class="row">

         <div class="col-md-3 col-lg-3 square-box " align="center">

          <span class="glyphicon glyphicon-user glyphicon-lg"></span>

         </div>

                  <div class=" col-md-9 col-lg-9 ">

          <table class="table table-user-information">

           <tbody>

            <tr>

             <td>จำนวน :</td>

             <td><?php echo $data['booking_amount'];?></td>

            </tr>

            <tr>

             <td>ราคารวม :</td>

             <td><?php echo number_format($data['booking_total_price'],2);?></td>

            </tr>

            <tr>

             <td>อีเมล :</td>

             <td><?php echo $data['booking_email'];?></td>

            </tr>

            <tr>

             <td>เบอร์โทร :</td>

             <td><?php echo $data['booking_tel'];?></td>

            </tr>

            <tr>

             <td>พนักงานขายผู้รับผิดชอบ</td>

             <td><font color="<?php echo $font_color;?>"><?php echo $sale_respon;?></font></td>

            </tr>

           </tbody>

          </table>

                    <a href="list_data_encode.php" class="btn btn-primary">กลับไปยังหน้ารายการ</a>

         </div>

        </div>

       </div>

      <?php

        }else{

       echo '<h3 style="color:red">ไม่พบข้อมูลไอดีตามไอดีที่ระบุ'.$id.'</h3>';

       echo '<a href="list_data_encode.php" class="btn btn-primary">กลับไปยังหน้ารายการ</a>';

        }

      ?>

     </div>

    </div>

   </div>

  </div>

 </body>

</html>

บทส่งท้าย

นอกจากการเข้ารหัส ID เพื่อป้องกันการสุ่มแล้ว ยังมีอีกวิธีที่ใช้ได้ผลอย่างดีนั่นก็คือ "การเช็คสิทธิ์การเข้าถึงข้อมูลของผู้ใช้ในหน้านั้นๆ"

เช่น การเปิดดูรายการใดๆ จะต้องเช็คว่า Record นั้นเป็นรายการที่อยู๋ในความรับผิดชอบหรือเปล่า คือ ต้องมีฟิลด์ไว้เก็บไอดีของ ตัวอย่างเช่น sale_id เราก็ทำการเพิ่มคำสั่ง WHERE อีกตัวเข้าไปคือ

WHERE id = xx AND sale_id = YOUR_SESSION_ID

และในกรณีที่มีผู้ใช้งานระดับหัว ที่สามารถดูของลูกน้องได้ ก็อาจจะใช้วิธี JOIN sale_id ไปยังข้อมูลผู้ขายรายนั้นเพื่อดูว่ามีหัวหน้าเป็นใคร เพื่อจะได้เพิ่มคำสั่ง WHERE ไอดีหัวหน้าผู้ขายเรคอร์ด ที่ตรงกับ SESSION ของหัวหน้าที่ล็อกอินใช้งาน

WHERE id = xx AND (sale_id = YOUR_SESSION_ID OR table_join.leader_id = YOUR_SESSION_ID )


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/




อ้างอิง
1. A simple two-way function to encrypt or decrypthttps://wppeople.net/blog/a-simple-two-way-function-to-encrypt-or-decrypt-a-string/
2. A simple two-way function to encrypt or decrypt a string
https://nazmulahsan.me/simple-two-way-function-encrypt-decrypt-string/
3. microtime — Return current Unix timestamp with
microsecondshttp://php.net/manual/en/function.microtime.php
4. md5 — Calculate the md5 hash of a string
http://php.net/manual/en/function.md5.php
5. substr — Return part of a string
http://php.net/manual/en/function.substr.php
6. base64_encode — Encodes data with MIME base64
http://php.net/manual/en/function.base64-encode.php
7. base64_decode — Decodes data encoded with MIME base64
http://php.net/manual/en/function.base64-decode.php
8. openssl_encrypt — Encrypts data
http://php.net/manual/en/function.openssl-encrypt.php
9. openssl_decrypt — Decrypts data
http://php.net/manual/en/function.openssl-decrypt.php
10. hash — Genera un valor cifrado con base a un string
http://php.net/manual/es/function.hash.php

การลิงค์เชื่อมโยง การเลื่อนสกอร์บาร์ หรือการกระโดดไปยังจุดต่างๆบนหน้าเว็บที่ต้องการด้วย JavaScript

โดย SONGCHAI SAETERN

สำหรับการเลื่อนหน้าจอไปยังจุดต่างๆนั้น จะเกี่ยวข้องกับ HTML Links ซึ่งปกติเราจะใช้แท็ก <a> และกำหนดแอตทริบิวต์ name="xxxx" ชื่อที่เราต้องการกำหนดจุดไว้


เช่น เราสร้าง <a name="top"></a> ไว้บนส่วนของหัวข้อ เมื่อเราอ่านบทความจนถึงหน้าท้าย เราสามารถสร้างลิงค์ หรือจุดเชื่อมโยงกลับขึ้นไปด้านบนที่หัวข้อได้ง่ายๆดังนี้

<a href="#top">กลับไปยังด้านบน</a>

ซึ่งเราสามารถสร้างฟังก์ชั่นด้วย JavaScript แบบง่ายๆได้ดังนี้

<script>
function jump(h){
    var url = location.href;               //Save down the URL without hash.
    location.href = "#"+h;                 //Go to the target element.
    history.replaceState(null,null,url);   //Don't like hashes. Changing it back.
}
</script>

การเรียกใช้งาน

<button onclick="jump('top')">กลับไปยังด้านบน</button>


แต่ถ้าอยากให้มีเลื่อนหน้าจอแบบหน่วงเวลา ไม่กระโดดครั้งเดียว ก็ลองเพิ่ม Animation เข้าไปดังนี้

<script>
$('a').click(function(){
    $('html, body').animate({
        scrollTop: $( $(this).attr('href') ).offset().top
    }, 500);
    return false;
});
</script>

สำหรับโค้ดด้านบนจะเป็นการกำหนดให้กับการคลิกลิงค์แท็ก <a> ทุกตัว ซึ่งหากต้องการนำไปใช้กับ <button> หรือแท็กอื่นๆ ก็เปลี่ยนในส่วนของ $('a') เป็นแท็กที่ต้องการได้เลย


ที่มา :
https://stackoverflow.com/questions/13735912/anchor-jumping-by-using-javascript
https://stackoverflow.com/questions/7717527/smooth-scrolling-when-clicking-an-anchor-link



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อราคาสุดคุ้ม

วิธีนำข้อมูลจาก Form รายละเอียด ไปรวมใน Form หลัก ก่อนจะ Submit ข้อมูลออกไป

โดย SONGCHAI SAETERN
วิธีนำข้อมูลจาก Form รายละเอียด ไปรวมใน Form หลัก ก่อนจะ Submit ข้อมูลออกไป




ตัวอย่างที่ใช้งานก็คือ
ในแบบฟอร์มหลักเมื่อป้อนข้อมูลเรียบร้อยกดปุ่ม Save
ก็จะแสดงป๊อบอัพ Modal ขึ้นมาเพื่อระบุเหตุผล และเมื่อ Submit ข้อมูลที่แยกกันก็จะไม่สามารถนำไปด้วย และ Modal เป็นป๊อบอัพที่ใช้รวม ไม่ได้แทรกไว้แบบฟอร์มใดแบบฟอร์มหนึ่ง ก็เลยต้องทำการเขียนโค้ดแทรกลงไปในแบบฟอร์มด้วย


jQuery Code

$("#form").submit( function(eventObj) {

  $('<input />').attr('type', 'hidden')

   .attr('name', "something")

   .attr('value', "something")

   .appendTo('#form');

  return true;

});

ที่มา : https://stackoverflow.com/questions/17809056/how-to-add-additional-fields-to-form-before-submit

มาปรับแต่งโค้ดให้ปลอดภัยด้วย rips-0.55 กันเถอะ

โดย SONGCHAI SAETERN



วิธีใช้คร่าวๆนะครับ

1.ดาวน์โหลด http://rips-scanner.sourceforge.net/
2. คลายซิปไว้ที่เว็บไดเรกทอรี่ตรงไหนก็ได้อ แอดมินสร้าง /labs/ ขึ้นมาอีกที เวลาเข้าใช้ก็ http://localhost/labs/rips-0.55
3. กำหนด path / file: ที่ต้องการทดสอบ แนะนำให้คัดลอกโปรเจ็กต์เรามาว่างใน /labs เช่นกัน แล้วก็เอา PATH เต็มๆมาใส่ เช่น D:/www/labs/myproject
4. กด scan รอดูผลลัพธ์



ในขั้นตอนที่ 3 ถ้าต้องการตรวจเฉพาะบางโฟลเดอร์ก็ / ชื่อโฟลเดอร์เพิ่มเข้าไป ก็จะ scan เร็วขึ้น

พอสรุปปัญหาแต่ละไฟล์แต่ละจุดออกมา ก็จำ Line ของไฟล์นั้นๆ ไปแก้ใน project จริงๆของเรา


ดาวน์โหลดโปรแกรม rips-0.55 ได้ที่
http://rips-scanner.sourceforge.net/

PHP การอัพเกรดเวอร์ชั่น 7.1 กับปัญหาของ Codeigniter + TCPDF + FPDI

โดย SONGCHAI SAETERN

ปัญหาหลังอัพเกรด PHP 7.1

Declaration of PdfTemplate::addPage()
Declaration of PdfTemplate::SetFont()
Declaration of PdfTemplate::Link()
Declaration of PdfTemplate::Image()

พอรันหน้ารายงาน PDF ปุ๊บ เจอ Error message มาเป็นกระบุง!!



แต่อย่าเพิ่งตกใจไป เข้าไปตาม File และ Line ที่ระบุเลย Let's Go++
เอาล่ะ ตรงดิ่งไปที่ บรรทัด 449

???????

ไม่พบอะไรเลย สุดซอย ก็ถอยออกมาก่อน


มาเริ่มจากฟังก์ชั่นแรก ก็คือ Declaration of PdfTemplate::addPage เอาไปค้นใน Google เลย แล้วมองหาเว็บ StackOverFlow

ก็ได้หน้านี้มา (หาอยู่นานมาก >_<)
https://stackoverflow.com/questions/19912591/fpdi-tcpdf-problems

หลังจากลองแก้ไขตามกระทู้นี้ก็พบว่า "ใช้ได้จริงด้วย"


ก็นั่งพินิจพิเคราะห์อยู่นานสองนาน จนแน่ใจว่า "แค่คัดลอกฟังก์ชั่นที่อยู่หลังคำอธิบาย Error มาวางแทนทีแค่นั้นเอง" (ตามรูปด้านบนนี้)

หลังจากครบทั้ง 4 ฟังก์ชั่น ก็จะเจอ Error ตัวใหม่ๆ O_o'


ก็ได้ใจความว่า ชื่อฟังก์ชั่นต้องไม่เป็นชื่อเดียวกับชื่อคลาสนั่นเอง
(เปล่าหรอก จริงๆผมไม่ได้แปล แค่ก๊อบ error message ไปค้นใน Google มา ^O^)



https://stackoverflow.com/questions/37100373/php-deprecated-methods-with-the-same-name

ตามลิงค์ด้านบนนี้ เข้าไปแก้ไขชื่อฟังก์ชั่นที่ซ้ำกับชื่อคลาสเป็น function __construct() ก็หมดเรื่อง แล้วก็ลองไปรันหน้าเว็บใหม่อีกครั้ง


ยัง ยังไม่หมด!!


ต้องตามไปแก้จุดที่เรียกใช้ฟังก์ชั่นที่มีชื่อเดียวกับคลาสเป็นเรียก __construct() แทนด้วย



และแล้ว ก็ผ่านไปอีก 1 งาน ตอนนี้ TCPDF + FPDI ก็สามารถใช้งานบน PHP 7.1 ได้แล้วล่ะ ^O^

อ่านเรื่องราวการอัพเดตเพิ่มเติมได้ที่