thaiall logomy background

ภาษาพีเอชพี (PHP) สำหรับ Dynamic Website

my town
Northwind | Login | Traing49 | Training492 | PHP5 | HTML | Responsive | Web2 | Kahoot | PHP7 | Assignment | API:UStoThai |
หน่วยที่ 1 : ความรู้เบื้องต้น

าษาพีเอชพี (PHP Language) # คือ ภาษาคอมพิวเตอร์ประเภทโอเพนท์ซอร์ท (Open Source Computer Language) สำหรับพัฒนาเว็บเพจแบบไดนามิก เมื่อเครื่องบริการได้รับคำร้องจากผู้ใช้ก็จะส่งให้กับ ตัวแปลภาษา ทำหน้าที่ประมวลผลและส่งข้อมูลกลับไปยังเครื่องของผู้ใช้ที่ร้องขอ ในรูปเอชทีเอ็มแอล ภาพ หรือแฟ้มดิจิทอลอื่นใด ลักษณะของภาษามีรากฐานคำสั่งมาจากภาษาซี เป็นภาษาที่สามารถพัฒนาให้ใช้งานแบบโต้ตอบกับผู้ใช้ได้

PHP มีการทำงานแบบเซอร์ฟเวอร์ไซต์สคริปต์ (Server-Side Script) จึงต้องมีเครื่องบริการ (Server) ที่ทำหน้าที่บริการการแปลภาษา และส่งผลให้กับเครื่องผู้ใช้ (Client) ที่ร้องขอด้วยการส่งคำร้องเข้ามายังเครื่องบริการ คำว่า PHP ย่อมาจาก Personal Home Page แต่พัฒนาให้มีประสิทธิภาพยิ่งขึ้น จึงเปลี่ยนเป็น Professional Home Page

Wiki : Compare webserver
Webserver : XAMPP, Web Platform Installer, IIS, Apache, # Appserv , Thaiabc, Palapa, NGINX, /omni

PDF
นังสือ บันทึกย่อภาษาพีเอชพีสำหรับมืออาชีพ (PHP Notes for Professionals) ถูกรวบรวมจาก Stack Overflow สำหรับจุดประสงค์ทางการศึกษาที่ไม่เกี่ยวข้องโดยตรงกับองค์กรใดที่มุ่งหวังผลทางธุรกิจ ซึ่งมีรูปแบบการเล่าเรื่องที่ไม่ซับซ้อน อ่านเข้าใจได้ง่าย พัฒนาสู่การเป็นมืออาชีพได้จริง (ถ้าอ่านจริง) เรียบเรียงไว้ 105 บทใน 481 หน้า
kahoot: php
ประวัติความเป็นมา
php ระวัติของภาษาพีเอชพี (PHP Language History) ภาษาพีเอชพีถูกคิดค้นขึ้นในปีค.ศ.1994 (พ.ศ.2537) โดย Mr.Rasmus Lerdorf เพื่อใช้ตรวจสอบสถิติการเข้าชมเว็บของตนเอง ต่อมาในปีค.ศ.1995 มีการเผยแพร่ภาษานี้สู่สาธารณะ และพัฒนาเป็น PHP/FI หรือพีเอชพีรุ่น 2 จนกระทั่งกลางปีค.ศ.1996 เริ่มมีทีมพัฒนาอย่างจริงจังโดยมี Mr.Zeev Suraski และ Mr.Andi Gutmans ร่วมทีม และพัฒนาเป็นพีเอชพีรุ่น 3
ความหมาย (Meaning)
เซสชัน (Session) คือ ข้อมูลที่ถูกสร้างขึ้น เมื่อใช้บราวเซอร์ ติดต่อเข้าเครื่องบริการ และถูกทำลายเมื่อบราวเซอร์ถูกปิดลง ข้อมูลนี้ถูกจัดเก็บในเครื่องบริการ
คุกกี้ (Cookie) คือ ข้อมูลขนาดเล็กที่เป็น HTTP Header แบบหนึ่ง ถูกส่งจากเครื่องบริการไปเก็บไว้ในเครื่องของผู้ใช้ตามที่บราวเซอร์กำหนด เพื่อบันทึกข้อมูลการเข้าเยี่ยมชม เมื่อผู้ใช้เข้าไปเยี่ยมชมเว็บไซต์อีกครั้ง เครื่องบริการจะใช้ข้อมูลคุกกี้ที่มีอยู่ในเครื่องของผู้ใช้ได้ทันที
หมายเหตุ
- ข้อมูลใน .mdb เก็บแบบ single เมื่อส่ง 1.23 เข้าไปเก็บจะเก็บเป็น 1.2299999 เรียกใช้ด้วย substr(x,0,6) แล้วจะไม่ได้ 1.23 ต้องใช้ round(x,2) สำหรับทศนิยม 2 ตำแหน่ง
- fopen คือ ฟังก์ชันเปิดแฟ้ม ถ้าเปิดตาม URL ต้องแก้ php.ini ให้ allow_url_fopen = on ?
- รหัสต้นฉบับ (Source Code) ของตัวแปลภาษา (Compiler) (museum # # v1)
- เอกสารอ้างอิง หรือตัวแปลภาษา (Compiler) มีที่ Quick Reference ซึ่งสมบูรณ์ที่สุด
- การทำให้ Windows เป็น Web server และบริการ PHP
- Free Webhosting หลายแห่งไม่บริการ GD Support Graphic จึงใช้ imagecreate ไม่ได้
- สามารถใช้ phpinfo(); ตรวจสอบได้ว่า Host ให้ GD Support graphic หรือไม่
- แผนการสอน PHP + MySQL เบื้องต้น และ training49.txt
- แผนการสอน PHP + MySQL ระดับกลาง
- แผนการสอน PHP สำหรับครูโรงเรียน (ควรเข้าใจ PHP + MySQL + HTML + Server มาก่อน)
- ตัวอย่างสร้าง batch file short cut บน desktop เช่น php.bat
แฟ้มที่ต้องใช้มี 2 แฟ้ม คือ php.exe และ php5ts.dll สำหรับประมวลผลบน DOS
สร้าง shortcut บน desktop
d:
cd d:/home
cmd /k
x.php (DOS> php x.php a b c)
foreach($argv as $v) echo $v."\n";
- Script php ไม่ทำงาน ต้องเปลี่ยน Encoding type เป็น Plain Text (ขนาดแฟ้มลดลงครึ่งหนึ่ง)
เอกสารปี 2549
พื้นฐาน SQL S0-S7

เอกสารปี 2549
Text, Image, Upload

เอกสารปี 2555 (อาชีวะ)
เอกสารเตรียมสอน PHP5
พิศิษฐ์ บวรเลิศสุธี เป็น ฟรีแลนซ์ ที่มีผลงานมากมาย พบว่า เขียน blog บน wordpress ได้น่าอ่านมาก โดยเฉพาะหัวข้อ "แจกตัวอย่าง Code PHP PDO CRUD ระบบเพิ่ม ลบ แก้ไข แสดงข้อมูล เบื้องต้น" ซึ่งในหัวข้อ "มารู้จักกัน" มีผลงานเป็นทั้งระบบและโดเมนเนม มีมากถึง 27 รายการ และอื่น ๆ อีกมากกว่า 150 ระบบ ซึ่งเว็บไซต์ของอาจารย์มีเนื้อหาเกี่ยวกับ สอนทำเว็บฟรี สอนทำระบบอีคอมเมิร์ช ระบบหนังสือเวียน ระบยืมคืนครุภัณฑ์ ระบบคลังข้อสอบ ระบบแจ้งซ่อม ซึ่งพิศิษฐ์ เขียนเล่าเรื่องใน สมาคมโปรแกรมเมอร์ไทย และแชร์ blog ที่น่าสนใจหลายครั้ง
Download :
  + ตัวแปลภาษา php.net
  + PHP Manual(html)
  + PHP Manual(html)

รหัสต้นฉบับ (Source Code)
+ ปรับปรุงฟอร์มตามรหัสผู้ใช้ ***
+ icon.php ?
+ รายงานการประเมินตนเอง (zip)
+ Webboard (Sample)
+ SuperModel (Sample)
+ บริการพื้นที่เว็บฟรี (Sample)
+ รับสมาชิก และตรวจ (admin:p)
+ ต.ย.Source 2548 (.doc)
+ แปลงสระปัญหาของ PDF
+ https://thaiall.github.io
+ https://github.com/php
+ http://alterebro.github.io
+ /php/infinityfree # #
+ โค้ดอื่น ๆ ที่รวมไว้ ...
Syntax Error
ความผิดพลาดทางไวยากรณ์ คือ เขียนโค้ดไม่ตรงรูปแบบของภาษา อาจเขียนผิด ไม่ครบ หรือเกินไป
Runtime Error
ความผิดพลาดทางการประมวลผล คือ เรียกใช้สิ่งที่ไม่มีอยู่ เปิดแฟ้มผิด ข้อมูลไม่เข้ากัน ฟังก์ชันเก่า
Logic Error
ความผิดพลาดทางตรรก คือ กำหนดเงื่อนไขผิดพลาด ในการควบคุมทางตรรกะ มักรู้เมื่อพบปัญหา
บริการเทียบคำค้นบน Google Trends ริการของ Google Trends รองรับคำค้นไม่เกิน 5 คำ คือ บริการที่ช่วยเปรียบเทียบแนวโน้มตามคำค้น เช่น python , php , laravel , wordpress , react โดยมีการจัดเรียงความนิยมตามภูมิภาค (Region) หรือเมือง (City) แล้วยังเลือกช่วงเวลา (Time range) และตามกลุ่ม (Category) ได้ ซึ่งผลการเลือกกลุ่ม พบว่า อันดับเปลี่ยนไปอย่างชัดเจนเมื่อเปลี่ยนกลุ่ม เช่น ข้อมูลเมื่อต้นเดือนสิงหาคม 2564 พบว่า กลุ่ม All categories พบว่า Python ลดเล็กน้อย ส่วน PHP เพิ่มขึ้นชัดเจน กลุ่ม Internet & Telecom พบว่า Wordpress นำโด่ง และมีแนวโน้มเพิ่มขึ้น กลุ่ม Computers & Electronics พบว่า PHP ขึ้นมาแซง Python กลุ่ม Job & Education พบว่า Python นำโด่ง แต่ PHP ไล่ขึ้นพร้อมตัวอื่น กลุ่ม Science พบว่า PHP นำโด่ง แต่ Python มีแนวโน้มลดลง
แหล่งสำรวจแล้วจัดอันดับที่น่าสนใจ
w3techs.com/
webtechsurvey.com/technology-type
Free webpage : มาสร้างเพจใน github แบบชิลชิลกันดีกว่า ปัจุบัน พบว่า นิสิตนักศึกษา มีเวทีเพื่อนำเสนอผลงานผ่านสื่อสังคมได้ง่าย ที่ github.com เปิดให้นักพัฒนาได้มี webpage เป็นของตนเองสำหรับเผยแพร่ผลงาน มีขั้นตอนการสมัคร และใช้คอนฟิกง่ายแบบชิลชิล ดังนี้ 1) เข้าเว็บไซต์ github.com แล้ว Sign up ผมใช้อีเมลหลักในการสมัครจะได้ไม่ลืม และกำหนด account เป็น thaiall ทำให้ต่อไปเข้าดูผลงานได้ที่ https://github.com/thaiall/ [keon] 2) สมัครเสร็จก็เข้าระบบผ่าน Sign in 3) เลือก New repository คือ [n.] ที่เก็บ ที่รองรับ, ที่บรรจุ 4) ตั้งชื่อ Repository name เช่น Tech100 แล้วกดปุ่ม Create repository เลย 5) จะสร้าง page ก็เลือกคลิ๊ก Settings ใน Tab menu แล้วลงมาจะพบ Github Pages 6) พบหัวข้อ Theme Chooser กดปุ่ม Choose a Theme แล้วผมเลือก Modernist 7) เข้าสู่การสร้าง index.md ซึ่งเป็นหน้าแรกของ Page อยู่ใต้หัวข้อ code ซึ่งทำการเปลี่ยนแปลงตอนนี้ หรือกลับมาแก้ไขได้ เมื่อกดปุ่ม Commit Change จะพบแฟ้ม _config.yml และ index.md และค่าใน Source ใต้หัวข้อ Github Pages จะเป็น master branch โดยอัตโนมัติ 8) ต่อไปก็สามารถแก้ไข index.md ซึ่งเป็นหน้าแรก สร้าง folder ที่มีแฟ้ม index.md แล้วเรียกใช้ได้ อาทิ /css หรือ /php 9) สร้างแฟ้มใน Master branch อาทิ aboutme.htm 10) ปรับแก้แฟ้ม _config.yml แล้วกำหนดค่าให้ตัวแปร อาทิ theme, title, description, exclude และ include หากไม่ได้เข้าไปแก้ไขก็จะมีเพียง theme: jekyll-theme-modernist 11) เพจของ github ไม่ประมวลผลฝั่งเครื่องบริการ จึงไม่รองรับ php หรือ python แต่ใช้ javascript ได้ จึงสร้าง และดึงโค้ดจาก menu.js ให้แฟ้มอื่นเรียกไปใช้ และรองรับ module จากภายนอก เช่น การแสดงรหัสต้นฉบับให้สวยงาม (Source code) ก็ใช้ SyntaxHighlighter จาก CDN ซึ่งผมใช้กับ /css 12) แฟ้มที่อยู่ใน root directory หรือ sub directory หากไม่เรียกใช้ theme อันโนมัติ ผ่าน index.md ก็ต้อง copy source code ไปวางเหมือนแฟ้ม aboutme.htm
ทดสอบ Free web hosting ที่บริการ PHP กับ MySQL มาหนึ่งโหล
หน่วยที่ 2 : รหัสต้นฉบับ อย่างสั้น
รวม Short Source Code อย่างง่าย [ phpinfo() ]
ต.ย. 1 : ส่งเมลเป็นเอชทีในแบบเอชทีเอ็มแอล (Send mail by HTML format)
ต.ย. 2 : เขียนภาพกราฟฟิก (Write image in JPEG format by GD JPEG supporting)
ต.ย. 3 : แสดงภาพเล็กแล้วลิงค์ภาพใหญ่ (Listing of thumbnail and click to enlarge)
ต.ย. 4 : เก็บข้อมูลด้วยอาร์เรย์ (Array database of course description)
ต.ย. 5 : ใช้ภาพประกอบความปลอดภัย (Security by word in image putting)
ต.ย. 6 : เชื่อมต่อกับแอคเซส (2 connection method of PHP+MDB in Windows)
ต.ย. 7 : เปิดเว็บเพจจากอินเทอร์เน็ต (Open File From Internet)
ต.ย. 8 : ดูดบางส่วนของเว็บ โดยเลือกจาก keyword มาเท่าจำนวนบรรทัดที่ต้องการ
ต.ย. 9 : ดูด Directory และเปลี่ยน Link ของ Google.com
ต.ย. 10 : โปรแกรม upload แฟ้มข้อมูลเข้า server อย่างง่าย 4 แบบ
ต.ย. 11 : โปรแกรม 3 โปรแกรม แสดงการทำงานของ cookie
ต.ย. 12 : โปรแกรม counter อย่างง่าย ด้วย session
ต.ย. 13 : โปรแกรมจัดตารางสอบอย่างง่าย
ต.ย. 14 : วาดกราฟอย่างง่าย จากข้อมูลผ่าน querystring หรือ get
ต.ย. 15 : การเชื่อมต่อกับ MSSQL server
ต.ย. 16 : ตัวนับแบบแฟ้มอักษร (Online User Counter and no mysql)
ต.ย. 17 : สุ่มไม่ซ้ำ แบบใช้ in_array
ต.ย. 18 : ลบคำไม่ดีออก (Bad Word Blockinging)
ต.ย. 19 : เปลี่ยนเว็บเพจ (Redirection Header)
ต.ย. 20 : เข้ารหัส และถอดรหัส (Encode and Decode)
ต.ย. 21 : ตัวแปรระบบ (Each _SESSION, _SERVER, _ENV)
ต.ย. 22 : จัดการข้อมูลในมายเอสคิวแอล แบบรวม (insert, delete, update, select)
ต.ย. 23 : แก้ปัญหาภาษาไทยเป็น ??? เมื่ออ่านข้อมูลจาก MySQL
ต.ย. 24 : ตรวจ link ในเว็บเพจที่ต้องการ
ต.ย. 25 : ฟังก์ชัน สำหรับการจับเวลาทำงานของเว็บเพจ
ต.ย. 26 : จัดการข้อมูลในมายเอสคิวแอล แบบแยก (my01.htm, my01.php)
ต.ย. 27 : คลายแฟ้ม .zip ด้วย php (Zip Management with PHP)
ต.ย. 28 : คำสั่งบนลีนุกซ์ (Shell Command) หรือ shell_exec()
ต.ย. 29 : เพิ่ม Linux User ผ่าน shell_exec
ต.ย. 30 : webservices แบบ REST จาก amazon.com
ต.ย. 31 : crop or resize image
ต.ย. 32 : การทำงานของ PHP ที่นำไปใช้ใน WAP
ต.ย. 33 : อ่าน .dat แบบมีรูปแบบ ไปเป็น .txt
ต.ย. 34 : อ่านข้อมูลจากเครื่องอ่านลายนิ้วมือ Bravo
ต.ย. 35 : ตรวจรหัสผู้ใช้ และรหัสผ่าน
ต.ย. 36 : ค้นหาที่ตั้งประเทศตามหมายเลขไอพี
ต.ย. 37 : เข้ารหัส และถอดรหัส base64
ต.ย. 38 : ระบุชื่อเว็บเพจสำหรับใช้บริการตัวนับ
ต.ย. 39 : การกำหนด ini_set และ ini_get
ต.ย. 40 : ใช้ ping ตรวจเครื่อง และตอบกลับเป็นภาพ
ต.ย. 41 : เขียนข้อมูลออกไปเป็น Microsoft Word
ต.ย. 42 : อ่านข้อมูลจาก excel ใน windows server
ต.ย. 43 : เขียนข้อมูลออก Word สำหรับ A4 และวันที่ไทย
ต.ย. 44 : สร้างแฟ้ม สร้างห้อง อัพโหลด เตรียมห้องข่าว
ต.ย. 45 : ระบบช่วย sign on ชั้นที่ 2 หลังผ่านชั้นแรก
ต.ย. 46 : การเขียนอักษรไทยลงไปในแฟ้มภาพ
ต.ย. 47 : หาจำนวนหน้าจากจำนวนระเบียน
ต.ย. 48 : รับ _SESSION แล้วไปหน้าที่ต้องการ
ต.ย. 49 : first PHP5
ต.ย. 50 : split one line to multi line
ต.ย. 51 : การทำตารางหลายบรรทัดใน PDF ด้วย FPDF module
ต.ย. 52 : การแสดงเวลาของประเทศไทย
ต.ย. 53 : ฟังก์ชันสร้างอาร์เรย์ไว้ตอบการเรียกข้อมูลตาม index
ต.ย. 54 : การ insert ข้อมูลเข้า DB ด้วย PHP5 1000 ระเบียน
ต.ย. 55 : การใช้ html ใน FPDF
ต.ย. 56 : การใช้ preg_split แทน split
ต.ย. 57 : การใช้ curl แทน file เพื่อโหลด external file
ต.ย. 58 : การเข้ารหัสตัวอักษรภาษาจีนเพื่อใช้ในเว็บเพจ และส่งอีเมล
ต.ย. 59 : โค้ดทดสอบการทำงานของ SQL lnjecti0n แบบรับ user & password
ต.ย. 60 : โค้ดทดสอบการป้องกันการใช้ SQL lnjecti0n ผ่าน id=0
ต.ย. 61 : โค้ดทดสอบการป้องกันการใช้ SQL lnjecti0n ผ่าน multi insert
ต.ย. 62 : อ่านสารสนเทศของข้อมูลด้วย decode json จาก data.go.th
ต.ย. 63 : ตรวจ IP ณ ปัจจุบันของเครื่องเรา
ต.ย. 64 : วาดวงรี อาศัย cos กับ sin
ต.ย. 65 : PHP CLI คือ Command Line
ต.ย. 66 : อ่านแฟ้ม utf-8 มาแสดงใน tis-620
ต.ย. 67 : Unicode json_encode
ต.ย. 68 : Get a part : handbill
ต.ย. 69 : function each() deprecated in php7.2.0
ต.ย. 70 : function ชื่อเดียวกับคลาส คือ __construct
ต.ย. 71 : ทดสอบ SQL แบบใช้ union และ into out file
ต.ย. 72 : ทำให้ process ทำงานแบบ infinity
ต.ย. 73 : สร้างหมื่นแฟ้มใช้เวลา 10 วินาที
ต.ย. 74 : อ่าน .docx เป็น text
ต.ย. 75 : อ่านข้อมูล API อัตราแลกเปลี่ยนจาก ธนาคาร
ต.ย. 76 : default_charset เป็น utf8
ต.ย. 77 : นับตัวอักษร หรือคำในข้อความ
ต.ย. 78 : ลบแฟ้มจากระบบที่มีชื่อแฟ้มเป็นอักษรพิเศษ
ต.ย. 79 : การสร้าง sitemap.xml
ต.ย. 80 : curl ดึง url ใน sitemap.xml
เอกสาร Power Point
Intro. to HTML27
Intro. to Web Application18
PHP
php: echo & remark8
php: Structure Programming13
php: Text File #18
php: Text File #215
php: Cookie & Session8
php: File Uploading & Shell8
ASP
asp: Structure Programming9
asp: GET, POST, Session8
asp: Data Selecting6
asp: Data Updating6
แนะนำคลิ๊ป
หน่วยที่ 3 : บทเรียน
  1. miniboard มี php 5 แฟ้ม ติดต่อ MySQL อย่างง่ายมาก รุ่น 1 2549-08-18 [ test ]
    Case at www.se-ed.net/thaiall (บทเรียนยังอยู่ แต่ตัวอย่างภาคปฏิบัติใช้ไม่ได้แล้ว)
  2. การประมวลผลแฟ้มแบบ text (เพิ่ม ลบ แสดงได้ แต่ไม่มีแก้ไข เพราะอยากให้ท่านแก้โปรแกรมเอง)
  3. ข้อสอบสุ่มไม่ซ้ำ.javascript (ใช้หลักการสุ่มไม่ซ้ำที่ได้ตัวเลขที่กระจาย และการใช้ javascript ตรวจคำตอบอย่างง่าย)
  4. การใช้ cookie เก็บข้อมูล (โปรแกรมง่าย ๆ เพื่อเพิ่ม ลบ หรือ restore)
    Case at www.domaindlx.com/thaiall (บทเรียนยังอยู่ แต่ตัวอย่างภาคปฏิบัติใช้ไม่ได้แล้ว)
  5. การสุ่มเลขมาพิมพ์อย่างง่าย (ทดสอบการใช้คำสั่ง for, if, random)
  6. การทำ form ส่ง mail (วิธีที่ใช้ง่ายกว่า perl, asp จนน่าใจหาย)
    Case at www.worldzone.net/internet/thaiall (บทเรียนยังอยู่ แต่ตัวอย่างภาคปฏิบัติใช้ไม่ได้แล้ว)
  7. การสุ่มเลขมาพิมพ์อย่างง่าย (ทดสอบการใช้คำสั่ง for, if, random)
  8. การทำ form ส่ง mail (วิธีที่ใช้ง่ายกว่า perl, asp จนน่าใจหาย)
  9. การวาดนาฬิกาเข็มในรูปแบบ gif (ธรรมดา แต่ใช้ imagecreate ได้)

CMS + LMS
txt2gift.php ช่วยให้อาจารย์ที่มีข้อสอบนำ ข้อสอบจาก excel หรือ text file ไป import เข้า moodle 1.5 โดยใช้โปรแกรมของผมสร้างแฟ้มแบบ GIFT ให้ โปรแกรมนี้รับ text ที่มาจาก excel แล้วแปลงเป็น text แบบ GIFT ให้ท่าน copy ข้อมูลข้อสอบที่ได้จากการแปลง ไปสร้าง text file ใหม่ โปรแกรม moodle ก็จะนำไปใช้ได้ มีรายละเอียดอีกไม่มากนักที่ thaiall.com/e-learning/moodle.htm
หน่วยที่ 4 : รหัสต้นฉบับ จาก PERLPHPASP.COM
 PHP from book
1301.intro/index.php
1302.intro/intro01.php
1303.intro/intro02.php
1304.intro/intro03.php
1305.intro/intro04.php
1306.intro/intro05.php
1307.intro/intro06.php
1402.textupdate/index.php
1403.textupdate/create5.php
1404.textupdate/listfile.php
1405.textupdate/addnew.php
1406.textupdate/deldata.php
1407.textupdate/editdata.php
1408.textupdate/delfile.php
 PHP from book
1501.mysqlupdate/index.php
1502.mysqlupdate/step1connect.php
1503.mysqlupdate/step2crtdb.php
1504.mysqlupdate/step3select.php
1505.mysqlupdate/step4insert.php
1506.mysqlupdate/step5delete.php
1507.mysqlupdate/step6update.php
1508.mysqlupdate/step7drop.php
1601.phpgallery/gal.php
1602.phpgallery/galf.php





 PHP from book
1701.entrance/index.php
1702.entrance/connect.php
1703.entrance/entstdrestore.php
1704.entrance/enttyperestore.php
1705.entrance/entchkidstd.php
1706.entrance/entchkidtype.php
1707.entrance/entjoin.php
1708.entrance/entputmany.php
1709.entrance/crtqrydrp.php
1801.cartbasic/cartbasic.php
1802.cartbasic/cartbasicsave.php
1901.vdo/connect.php
1902.vdo/checkeid.php
1903.vdo/createvdo.php
1904.vdo/displayvdo.php
1905.vdo/reportvdo.php
1906.vdo/borrowvdo.php
2001.sticker/index.php
2002.sticker/putpic.php
2003.sticker/puttxt.php
หน่วยที่ 5 : รหัสต้นฉบับที่ขยายจากหน่วยที่ 2
ต.ย.1 Send mail by HTML format
# version 2 in html format : ! http://www.yonok.ac.th/burin/mailhtml.php
# version 1 in text : ! http://www.isinthai.com/isinthai/sndform.php
if (!isset($_POST{"mfrom"})) $_POST{"mfrom"} = "";
if (!isset($_POST{"mto"})) $_POST{"mto"} = "";
if (!isset($_POST{"msubj"})) $_POST{"msubj"} = "";
if (!isset($_POST{"message"})) $_POST{"message"} = "";
if (!isset($_POST{"redirect"})) $_POST{"redirect"} = "";
if (!isset($_GET{"mfrom"})) $_GET{"mfrom"} = "";
if (!isset($_GET{"mto"})) $_GET{"mto"} = "";
if (!isset($_GET{"msubj"})) $_GET{"msubj"} = "";
if (!isset($_GET{"message"})) $_GET{"message"} = "";
if (!isset($_GET{"redirect"})) $_GET{"redirect"} = "";
$mfrom = $_POST{"mfrom"} . $_GET{"mfrom"};
$mto = $_POST{"mto"} . $_GET{"mto"};
$msubj = $_POST{"msubj"} . $_GET{"msubj"};
$message = $_POST{"message"} . $_GET{"message"};
$redirect = $_POST{"redirect"} . $_GET{"redirect"};
if (empty($redirect)) { $redirect = "http://www.yonok.ac.th"; }
if (empty($message)) { $message = "<html><body bgcolor=red>
<a href=http://www.thaiall.com>thaiall.com</a>
<hr color=white>hello</body></html>"; }
if (empty($mto) || empty($msubj) || empty($mfrom)) {
  echo "<font face='courier new'>";
  echo "<form action=mailhtml.php method=post>";
  echo ".. From : <input name=mfrom value='$mfrom' size=30><br>";
  echo ".... To : <input name=mto value='$mto' size=30><br>";
  echo "Subject : <input name=msubj value='$msubj' size=50><br>";
  echo "Messages:<br><textarea name=message rows=10 cols=80>$message";
  echo "</textarea> <input type=submit value='Send mail'>";
  echo "<br><input name=redirect type=hidden value=$redirect>";
  echo "</form>";
} else {
  $msubj = "Subject _ ".$msubj;
  mail("$mto,burin@yonok.ac.th","$msubj",$message,"From: $mfrom\r\n"
  ."Reply-To: $mfrom\r\n"
  ."MIME-Version: 1.0\r\n"
  ."Content-Type: text/html;charset=windows-874\r\n"
  ."Content-Transfer-Encoding: 7bit\r\n"
  ."X-Priority: 1\r\n"
  ."X-Mailer: PHP/" . phpversion());
  // mail("$mto","$msubj",$message,"From: $mfrom\nX-Mailer: PHP/" . phpversion());
  echo "<html><head><meta http-equiv=Refresh content='50; URL=$redirect'>";
  echo "</head><body><font face='courier new'><pre>";
  echo "From    : $mfrom \n";
  echo "To      : $mto \n";
  echo "Subject : $msubj \n";
  echo "Message :<ul><font color=gray>" . htmlentities($message);
  echo "</ul></font><hr color=red>Your message sending : <b>Completely</b>\n";
  echo "Script developer : webmaster@thaiall.com\n";
}
ต.ย.2 Write image in JPEG format by GD JPEG supporting
ตัวอย่าง : http://www.thaiall.com/php/testjpg.php
# some server do not support GD GIF but support GD JPEG.
# you can check by phpinfo();
header("Content-type: image/jpeg");
$imagesize = 80;
$myImage = ImageCreate($imagesize, $imagesize);
$white = ImageColorAllocate($myImage, 255, 255, 255);
$red = ImageColorAllocate($myImage, 255, 0, 0);
ImageFill($myImage, 0, 0, $red);
Imageinterlace($myImage, 1);
Imagearc($myImage, 40, 30, 20, 10, 0, 359, $white);
ImageLine($myImage, 5, 5, 70, 60, $white);
Imagestring($myImage, 3, 5, 40, ("This กขค."), $white);
Imagejpeg($myImage);
Imagedestroy($myImage);
######## securecode.php ###########
$FILE=file("topic.htm") ;
$key=count($FILE);
$key=ord(substr(crypt($key,$key),6,1)) * 100;
$key=$key + (ord(substr(crypt($key,$key),7,1)));
header("Content-type: image/jpeg");
$myImage = ImageCreate(80, 20);
$white = ImageColorAllocate($myImage, 255, 255, 255);
$red = ImageColorAllocate($myImage, 255, 0, 0);
ImageFill($myImage, 0, 0, $red);
Imagestring($myImage, 5, 5, 5, "$key", $white);
Imagejpeg($myImage);
Imagedestroy($myImage);
######## image.php ###########
// https://fonts.google.com/specimen/Kanit
$folder = '/home/public_html/quiz/';
class setfont {
  function imagestring($im, $myfont, $x, $y, $s, $color){
    $myfont = '/home/public_html/quiz/kanitregular.ttf';
    imagettftext($im, 16, 0, $x, $y, $color, $myfont, $s);
  }
}
header("Content-type: image/png");
$myImage = ImageCreate(1024,768);
$white = ImageColorAllocate($myImage, 255, 255, 255);
$blackblue = ImageColorAllocate($myImage, 0, 0, 64);
ImageFill($myImage, 0, 0, ImageColorAllocate($myImage, 0, 0, 255));
ImageFilledRectangle($myImage, 1, 1, 1022, 766, $blackblue); 
$myfont = $folder . 'rsp_tlwgtypewriter.ttf';
$txt = "QUIZ";
$x_pos = (1024 / 2) - (strlen($txt) * 40 / 2);  
Imagettftext($myImage, 40, 0, $x_pos , 80, $white, $myfont ,$txt);
$myfont = $folder . 'kanitregular.ttf'; // rsp_sawasdee.ttf
Imagettftext($myImage, 20, 0, 50, 150, $white, $myfont ,'ข้อใดไม่ใช่ภาษาโปรแกรม');
ImageLine($myImage, 20, 240, 1000, 240, $white);
ImageLine($myImage, 950, 20, 950, 700, $white);
$mygd  = new setfont;
$mygd->imagestring($myImage, $myfont, 50, 300, "ก. ภาษาไพทอน", $white);
$myfont = $folder . 'kanitregular.ttf'; // rsp_thchakrapetch.ttf
Imagettftext($myImage, 16, 0, 50, 380, $white, $myfont ,'ข. ภาษาเอสคิวแอล'); 
Imagettftext($myImage, 16, 0, 50, 460, $white, $myfont ,'ค. ภาษาพีเอชพี'); 
Imagettftext($myImage, 16, 0, 50, 540, $white, $myfont ,'ง. ภาษาซี'); 
Imagettftext($myImage, 16, 0, 50, 620, $white, $myfont ,'จ. ภาษาจาวา'); 
Imagestring($myImage, 10, 700, 740, ("http://thainame.net/quiz/image.php"), $white);
Imagepng($myImage);
Imagedestroy($myImage);
// คำสั่งนี้ใช้ไทยไม่ได้ Imagestring($myImage, 16, 50, 300, ("This กขค."), $white);
http://www.thainame.net/quiz/image.php
http://www.thainame.net/quiz/image_bak.php
ต.ย.3 Listing of thumbnail and click to enlarge
ตัวอย่าง : http://www.thaiall.com/lovelampang/nw/index.php
ตัวอย่าง : http://www.thaiall.com/win/openphotodir.php
// Thumbnail listing
if (!isset($_GET["p"])) $_GET["p"] = 1;
$i = 0;
$dir_handle = opendir(".");
while ($list = readdir($dir_handle)) {
  if (strtolower(substr($list,-5)) == "t.jpg") {
   $ar[$i]  = "<td><a href=../nw/".substr($list,0,6).".jpg>";
   $ar[$i] .= "<img src=$list border=0></a></td>";
   $last_modified = filemtime($list);  // Ex. Monday, 27th October, 2003 @ 02:59pm
   $ar[$i] .= " Last modified " . date("l, dS F, Y @ h:ia", $last_modified);
   $i = $i + 1;
  }
}
closedir($dir_handle);
srand(time());
$pp = 10;
$end = $_GET["p"] * $pp;
print "<table width=100%>";
for ($k=($end - $pp);$k<$end;$k++) {
  // $j = rand() % $i;
  // print $ar[$j];
  print $ar[$k];
}
// echo (sprintf("%03d", 5) . strlen(sprintf("%03d", 5))); // 0053
print "</table>";
for ($c=1;$c<=($i / $pp);$c++) {
  print "<a href=?p=$c>$c</a> | ";
}
<?php 
// openphotodir.php
// <meta http-equiv=refresh content="1;url=openphotodir.php">
$h = "";
$w = "";
$b = "bgcolor=#400000";
if (isset($_GET['height']))  $h = " height=".$_GET['height'];
if (isset($_GET['width']))   $w = " width=".$_GET['width'];		
if (!isset($_GET['height']) && !isset($_GET['width'])) $w = " height=120";		
if (isset($_GET['bgcolor'])) $b = " bgcolor=".$_GET['bgcolor'];	
?>		
<body <?php echo $b;?>><font face='courier new' size=6 color=yellow>Open Photo Dir
<br>Type :<a href=?>1</a> | <a href=?type=thumb&height=150>2</a> |
<a href=?type=thumb&width=150>3</a> | <a href=?type=thumb&bgcolor=black>4</a> |
<br><base target=_blank><font color=#dddddd>
<?php
if (!isset($_GET['type'])) echo "<ol>";
$d = opendir(".");
while ($list = readdir($d)) {
  if (strtolower(substr($list,-4)) == ".jpg" || strtolower(substr($list,-4)) == ".gif") {
    if (!isset($_GET['type'])) {
      echo "<li><a href=$list>$list</a> ". filesize($list) ." byte\n";
    } else {
      echo "<a href=$list><img src=$list border=1 $h $w></a>\n";
    }
  }
}
if (!isset($_GET['type'])) echo "</ol>";
?>
</body>
// ตัวอย่าง: แสดงเวลาปรับปรุงของแฟ้มล่าสุด
$d = opendir('F:\IT\doc\burin\.');
while ($list = readdir($d)) { 
  $recs[date("Y m d G i", filemtime("../doc/burin/$list"))] = $list; 
}
ksort($recs);
foreach ($recs as $k => $v) { 
$lar = preg_split('/\s+/', $k); // split(" ",$k);
$lk = "$lar[2] $lar[1] $lar[0] $lar[3]:$lar[4]";
$lv = $v; 
} 
echo "<a title=$lv>$lk</a>";
// ตัวอย่าง: การเปิดรายชื่อแฟ้มให้ download
// ที่ http://www.thaiall.com/pdf/ohec/ (ติด user authen ไว้)
include("ihead.php");
echo "<table align=center width=600 border=1><tr><td bgcolor=white><ol>";
$i = 0;
$dir_handle = opendir(".");
while ($list = readdir($dir_handle)) {
if (strlen($list) > 10) echo "<li><a href=$list>$list</a></li>";
}
closedir($dir_handle);
echo "</ol></td><td width=100 bgcolor=gray> </td></tr></table>";
include("ifoot.php");
ต.ย.4 Array database of course description
ตัวอย่าง : ! http://yn1.yonok.ac.th/catalog/subjdesc.php
<html><head><title>Course description database</title></head>
<body bgcolor=#ffffdd><font face="microsoft sans serif" size=0>
<form action=subjdesc.php>
แสดงรายวิชาทั้งหมด [<a href=subjdesc.php>แบบรายชื่อ</a>,
<a href=subjdesc.php?codes=csv>แบบ CSV</a>]
หรือค้นหาตามรหัสวิชา หรือคำอธิบายรายวิชา
<br><input name=codes><input type=submit><br>
</form>
<?php
$d{'ACCT 100'}="การบัญชีทั่วไป~3(3-0)~~ศึกษา...";
$d{'ACCT 201'}="หลักการบัญชี 1~3(3-0)~~ศึกษาเกี่ยว...";
$d{'ACCT 202'}="หลักการบัญชี 2~3(3-0)~หลักการบัญชี 1 (ACCT 201)~ศึกษา...";
if (isset($_GET['codes'])) { $c = $_GET['codes']; }
if (isset($_POST['codes'])) { $c = $_POST['codes']; }
if (strlen($c) == 0) { $c = "list"; }
if (strlen($d{$c}) > 1) {
  $ds = explode("~",$d{$c});
  echo "<b>$c</b> : $ds[0] $ds[1]";
  echo "<ul><b>วิชาบังคับก่อน</b> : $ds[2]";
  echo "<dd>$ds[3]</ul>";
} else {
  if ($c == "csv") {
    echo "<pre>";
    while( list ($k,$v) = each($d)) {
      $ds = explode("~",$d{$k});
      echo "$k,$ds[0],$ds[1],$ds[2],$ds[3]<br>";
    }
    echo "</pre>";
  } else {
    echo "<ul><ol>";
    while( list ($k,$v) = each($d)) {
      if ((strpos(strtolower($d{$k}),strtolower($c)) > 0) || _
         (strlen($c) == 0) || ($c == "list")) {
         $ds = explode("~",$d{$k});
         echo "<li><a href='?codes=$k'>$k</a> : $ds[0] $ds[1]";
      }
    }
    echo "</ol></ul>";
  }
}
?>
</body></html>
// Code เพิ่มเติมเกี่ยวกับอาร์เรย์
$arr = array("thai", "siam", "lampang");
sort($arr);
reset($arr);
while (list($key, $value) = each($arr)) {
  echo "Key: $key; Value: $value<br>";
}
foreach ($arr as $key => $value) {
  echo "Key: $key; Value: $value<br>";
}
ต.ย.5 Security by word in image putting
ตัวอย่าง : http://www.thaiall.com/php/secure.php
<body><?php
$ft = $_POST['keept']  % 5;
if (($_POST['u'] == "a" && $_POST['p'] == "b")  && (
($ft == "0" && $_POST['w'] == "abc") ||
($ft == "1" && $_POST['w'] == "def") ||
($ft == "2" && $_POST['w'] == "oho") ||
($ft == "3" && $_POST['w'] == "love") ||
($ft == "4" && $_POST['w'] == "wow") ))
{ echo "ok : pass"; } else {
$t = microtime() * 1000000;
$img = $t % 5;
echo "<img src=secure". $img .".jpg>";
?>
<form action=secure.php method=post>
Word in picture : <input name=w><br>
User : <input name=u value="a"><br>
Password : <input name=p value="b"><br>
<input type=hidden name=keept value=<?php echo $t;?>><br>
<input type=submit value="Check password">
</form>
<?php } ?>
</body>
ต.ย.6 2 connection method of PHP+MDB in Windows
DB : empl.mdb 68 KB
empl :emplid as double,emplname as text,emplsalary as double
เพราะนักศึกษาคนหนึ่งที่ผมเคยสอนคอมพิวเตอร์เบื้องต้น ถามเรื่องนี้
ทำให้ผมต้องศึกษาเพิ่มเติม แล้วนำมาเขียนไว้ที่นี่ เพราะเดิมผมไม่สนใจเรื่อง php+mdb
<body>Connection method of PHP+MDB in Windows<br/>
<a href=?connect=DSNLess&action=List>DSNLess+List</a> |
<a href=?connect=DSNLess&action=Add1>DSNLess+Add1</a> |
<a href=?connect=DSNLess&action=Delete99>DSNLess+Delete99</a>
<br/>
<a href=?connect=OdbcDSN&action=List>OdbcDNS+List</a> |
<a href=?connect=OdbcDSN&action=Add1>OdbcDNS+Add1</a> |
<a href=?connect=OdbcDSN&action=Delete99>OdbcDNS+Delete99</a><br/>
<?php
if(!isset($_GET{'action'})) {
  $_GET["connect"] = "DSNLess";
  $_GET["action"] = "List";
} else {
  $_GET["connect"] = $_GET{'connect'};
  $_GET["action"] = $_GET{'action'};
}
// DNSLess connection method
if($_GET["connect"] == "DSNLess" ) {
  // วิธีนี้ไม่ต้องเข้าไปใน ODBC Data Sources
  $db_connection = new COM("ADODB.Connection");
  $db_connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".realpath("empl.mdb").";";
  $db_connection->open($db_connstr);
  if ($_GET["action"] == "List") {
    $rs = $db_connection->execute("select * from empl");
    $rs_fld0 = $rs->Fields(0);
    $rs_fld1 = $rs->Fields(1);
    while (!$rs->EOF) {
      print "$rs_fld0->value $rs_fld1->value <br>\n";
      $rs->MoveNext();
    }
    $rs->Close();
  }
  if ($_GET["action"] == "Add1") {
    $rs = $db_connection->execute("insert into empl(emplid,emplname)values(99,'abc')");
    print "Add1 : complete";
  }
  if ($_GET["action"] == "Delete99") {
    $rs = $db_connection->execute("delete from empl where emplid =99");
    print "Delete99 : complete (all where emplid=99)";
  }
  $db_connection->Close();
}
// OdbcDNS connection method
// (Open DataBase connectivity & Data source name)
// ต้องมี ODBC driver ในเครื่องนะครับ ปกติเครื่องที่ลง office น่าจะมี
// Control panel, ODBC Data Sources, System DSN, Add, Access, empldsn, select, ...
if($_GET["connect"] == "OdbcDSN" ) {
  $cnx = odbc_connect('empldsn','','');
  if ($_GET["action"] == "List") {
    $SQL_Exec_String =  "select * from empl";
    $cur= odbc_exec( $cnx, $SQL_Exec_String );
    while( odbc_fetch_row( $cur ) ) {
      $field1= odbc_result( $cur, 1 );
      $field2= odbc_result( $cur, 2 );
      echo  "$field1 $field2 <br>\n";
    }
  }
  if ($_GET["action"] == "Add1") {
    $SQL_Exec_String =  "insert into empl(emplid,emplname)values(99,'abc')";
    $cur= odbc_exec( $cnx, $SQL_Exec_String );
    print "Add1 : complete";
  }
  if ($_GET["action"] == "Delete99") {
    $SQL_Exec_String =  "delete from empl where emplid =99";
    $cur= odbc_exec( $cnx, $SQL_Exec_String );
    print "Delete99 : complete (all where emplid=99)";
  }
}
?>
ต.ย.7 Open File From Internet (ดูดเว็บอื่นมาใช้งานเป็นเว็บเพจของเรา)
บาง Server ไม่ยอมให้ใช้ file() ดูดข้อมูลจากเว็บเพจนอกเครื่อง (Using remote files) เช่น thaiall.com
เพราะใน php.ini กำหนด allow_url_fopen เป็น off ถ้าเป็น on ก็จะไม่พบปัญหานี้ สามารถตรวจสอบด้วย phpinfo()
ตัวอย่างนี้แสดงการดูดเว็บ http://www.youtube.com
มาแสดงเป็นเว็บของเรา ถ้าจะ split หรือนับ line ก็ต้องเขียนโปรแกรมเพิ่ม เช่น $lines = split("\n", $multi-line-input);
<base href=http://www.youtube.com/>
<?php
$ar = file("http://www.youtube.com");
foreach ($ar as $value) {
   echo $value;
}
?>
ต.ย.8 ดูดบางส่วนของเว็บ โดยเลือกจาก keyword มาเท่าจำนวนบรรทัดที่ต้องการ
ตัวอย่างนี้แสดงการดูดเว็บ http://www.manager.co.th เพียงบางส่วน
โปรแกรมนี้ใช้กับบาง server ไม่ได้ เพราะเขาไม่ยอมให้ใช้ฟังก์ชัน file() เช่น thcity.com เป็นต้น
ปล. manager.co.th มี hit rate เยอะเกินไป Response Time ต่ำ ไม่เหมาะที่จะดูด
$x = '<table cellspacing=0 cellpadding=2 width="100%" border=0>';
$a = file("http://www.manager.co.th/Home/default.html");
$xl = strlen($x);
$found = 0;
$l = 0;
echo "คำที่ค้นหามีขนาด $xl ตัวอักษร\n";
for($i=0;$i<count($a);$i++) {
 if (stristr($a[$i],$x)) {
   $found = 1;
 }
 if ($l <= 26 && $found == 1) {
   echo $a[$i]."\n";
   $l = $l + 1;
 }
}
ต.ย.9 ดูด Directory และเปลี่ยน Link ของ Google.com
ตัวอย่าง : http://www.thaiall.com/php/load_phpbb.php
ตัวอย่าง : http://www.thaiall.com/php/google.php
ตัวอย่าง : http://www.thaiall.com/listen/_cut.php (9.3)
ตัวอย่าง : http://www.thaiall.com/itinlife/article.php (9.4)
ตัวอย่าง : http://www.thaiall.com/php/load_phpbb.php (9.5)
9.1 ดูด Directory ของ google (ปรับปรุง 2552-08-24)
<?php
$web = file("http://www.google.co.th/dirhp?hl=th&tab=gd&q=");
$chk1 = '<table align=center border=0 cellpadding=0 cellspacing=7 width=1%>';
$chk2 = "</table>";
$found = 0;
$first = 1;
$l = 0;
if (!isset($_GET['url'])) { 
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">';
echo "<body bgcolor=#ffffdd><b>My Directory</b>\n";
for($i=0;$i<count($web);$i++) {
  if ($found == 0) {
    $r = preg_split("/$chk1/", $web[$i]); // split($chk1,$web[$i]);
    if (count($r) > 1) { 
      $found = 1;
      echo $chk1;  # พิมพ์คำที่ค้นหาเป็นคำแรก
    }  
  } else {
    $r = preg_split("/$chk2/", $web[$i]); 
    if (count($r) > 1) $found = 2;
    $u = $web[$i];
    echo str_replace("/Top/World/Thai/","?url=",$u); 
  }  
  if ($found == 2) break;
} # end for
} else {
echo "<frameset><frame src=http://www.google.co.th/Top/World/Thai/" . 
urlencode($_GET['url']) . "></frameset>";
} # end if
?>
9.2 ดูดจาก lovelampang.com มาไว้ใน thaiall.com
<?php
$a = file("http://www.lovelampang.com/iblog.php");
for($i=0;$i<count($a);$i++) {
  echo str_replace("<body","<base href=http://www.lovelampang.com/><body",$a[$i]);
  echo "\n";
}
?>
9.3 ดูด url ของ mp3 จากเว็บไซต์ของ encarta
<font size=6><b>โปรแกรมช่วยจับชื่อแฟ้มเสียงจากผลการสืบค้น
<br>http://encarta.msn.com</b></font>
<form action=_cut.php method=post>
<input name=url size=90 value='http://encarta.msn.com/dictionary_1861582869/a.html'>
<input type=submit>
</form><br>
<?php
if (isset($_POST['url'])) {
  $chk1 = "http://images.encarta.msn.com";
  $chk2 = ".mp3";
  $r = file($_POST['url']);
  $found = 0;
  for($i=0;$i<count($r);$i++) {
    $r1 = preg_split("/$chk1/", $r[$i]); // split($chk1,$r[$i]);
    if (count($r1) > 1) {
      $found = 1;
      $r2 = preg_split("/$chk2/", $r1[1]); 
      $r3 = $r2[0];
    }
  }
  echo "<a href=".$chk1.$r3.$chk2.">mp3</a>";
}
?>
9.4 ดูดเว็บเพจของ ไอทีในชีวิตประจำวัน
<table width=760 align=center><td bgcolor=#ffffdd>
<?php
$web = file("http://www.thaiall.com/opinion/readonly.php?view=".$id);
$chk1 = "<td bgcolor=white>";
$chk2 = "</td></tr><tr><td align=right bgcolor=black>";
$found = 0;
$first = 1;
$stop = 0;
$l = 0;
for($i=0;$i<count($web);$i++) {
 $r1 = preg_split("/$chk1/", $web[$i]); // split($chk1,$web[$i]);
 $r2 = preg_split("/$chk2/", $web[$i]); 
 if (count($r1) > 1) $found = 1;
 if ($found == 1 && $stop == 0) {
   if ($first == 1) {
     echo "<dd>$r1[1]"; // พิมพ์ครั้งแรก เมื่อพบคำแรก
     $first = 0;
   } else {
     if (count($r2) > 1) $stop = 1;
     echo "<dd>$r2[0]"; // พิมพ์ที่เหลือ ก่อน $stop = 1
   }
 }
}
?>
</td></table>
9.5 ดูดเว็บเพจของ phpbb
<?php // load_phpbb.php
$web = file("http://www.yonok.ac.th/webboard/viewforum.php?f=14");
$base = "http://www.yonok.ac.th/webboard/";
$startpoint = '<ul class="topiclist">';
$stoppoint = '<form method="post" action="./';
$checkline = 'topictitle';
$startlink = '<a href=';
$sign = '+ ';
$found = 0;
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">';
echo "<base href='$base'>";
echo "<body>\n";
for($i=0;$i<count($web);$i++) {
  if ($found == 0) {
    $r = preg_split("/$startpoint/", $web[$i]); // split($startpoint,$web[$i]);
    if (count($r) > 1) $found = 1;  
  } else {
    $r = preg_split("/$stoppoint/", $web[$i]);  
    if (count($r) > 1) break;
    $r = preg_split("/$checkline/", $web[$i]); 
    if (count($r) > 1) {
       $r = preg_split("/$startlink/", $web[$i]); 
       echo $sign . $startlink . remove_tag($r[1]) ."<br />";
    }
  }  
} 
function remove_tag($txt) {
  $txt = str_replace('class="topictitle"','target="_blank"',$txt);  
  return $txt;
}
?>
ต.ย.10 โปรแกรม upload แฟ้มข้อมูลเข้า server อย่างง่าย 3 แบบ
โปรแกรมเกี่ยวกับการ upload แฟ้ม
// up.php : โปรแกรม upload แฟ้มข้อมูลเข้าไปในเครื่องบริการ
<form action=up.php enctype="multipart/form-data" method=post>
<input type=file name=uploadfile>
<input type=submit>
</form>
<?php
if (isset($_FILES["uploadfile"]["name"])) {
  if(copy($_FILES["uploadfile"]["tmp_name"],"./".$_FILES["uploadfile"]["name"]))
    echo "upload : process";
  else
    echo "upload : error";
}
?>
// upmany.php : สัจจามาถามว่า ทำอย่างไร up หลายแฟ้ม ถ้ารับคำสั่งมาจากอาร์เรย์
<form action=upmany.php method=post enctype="multipart/form-data">
<input name=x value='a'><br>
<?php
$tot = 3;
for($i=1;$i<=$tot;$i++) { echo "<input type=file name=uploadfile$i><br>"; }
?>
<input type=submit>
</form>
<?php
if (!empty($_FILES["uploadfile1"]["name"])) {
  echo $_POST{'x'}."<br>";
  for($i=1;$i<=$tot;$i++) {
    echo "<br>Upload : " . $_FILES["uploadfile$i"]["name"];
    if(copy($_FILES["uploadfile$i"]["tmp_name"],"./".$_FILES["uploadfile$i"]["name"]))
      echo " ok";
    else
      echo " error";
  }
}
?>
// upn.php : ส่งแฟ้มเข้าแบบกำหนดชื่อ
<form action=upn.php enctype="multipart/form-data" method=post>
<input name=new value="new.jpg">
<input type=file name=uploadfile>
<input type=submit>
</form>
<?php
if (isset($_POST["new"]))
if (copy($_FILES["uploadfile"]["tmp_name"],"./".$_POST["new"]))
echo "upload : completely";
?>
// uploadbanner.php : ส่งแฟ้มเข้าแบบกำหนดชื่อตายตัว และกำหนด redirect
<?php
if (isset($_FILES["uploadfile"]) && $_POST["pass"] == "thailand") {
if (copy($_FILES["uploadfile"]["tmp_name"],"./banner.jpg"))
header("Location: http://www.thaiabc.com");
else echo "upload : fail<br/><a href=uploadbanner.php>back</a>"; 
} else { ?>
<form action="uploadbanner.php" enctype="multipart/form-data" method="post">
Password : <input name="pass">
<br/>File in jpg format : <input type="file" name="uploadfile">
<input type="submit"></form>
<?php }  ?>
ต.ย.11 โปรแกรม 3 โปรแกรม แสดงการทำงานของ cookie
โปรแกรมแสดงการทำงานกับ cookie
// x.php : โปรแกรมที่มีฟอร์มรับค่าเข้าตัวแปร uname แล้วส่งให้ y.php แบบ get
<body>
<form action=y.php method=get>
<input name=uname size=40><br>
<input type=submit>
</form>
</body>
// y.php : โปรแกรมนำค่าที่รับมาจาก get เก็บลง cookie ไว้ 1 ชั่วโมง
// keep in c:\windows\temporary internet files\
<?php
if (isset($_GET["uname"])) {
  setcookie("uname",$_GET['uname'],time() + 3600);
  echo "keep ok";
}
?>
<body>
<a href=z.php>z.php</a>
</body>
// z.php : โปรแกรมนำค่าจาก cookie มาแสดงทางจอภาพ
<body>
<?php echo $_COOKIE['uname']; ?>
</body>
ต.ย.12 โปรแกรม counter อย่างง่าย ด้วย session
:: เป็นการนับแยก ของผู้เข้าชมแต่ละคน เพราะผมเข้าคนละเครื่อง ก็นับกันคนละเลข ไม่ได้นับต่อของคนอื่น ๆ
:: หากไม่กำหนดอะไรเพิ่มเติมค่าของ session จะหมดอายุตามค่า session.cache_expire ที่แสดงใน phpinfo( )
:: พบ server 2 ตัวที่ต้องกำหนด session_save_path ไม่งั้น error คือ hypermart.net กับ sahapat.co.th
:: ตัวอย่างมากมายเรื่อง authentication ที่ http://www.tutorialized.com/tutorials/PHP/User-Authentication/1
ตัวอย่าง : ! http://www.yonok.ac.th/burin/countersession.php
:: เพราะผมเคยใช้ session ใน hypermart.net ไม่ได้ และต.ค.48 อ.ถนอมก็บ่นว่า server เขาไม่รับ
:: พอสืบค้นก็พบข้อมูลจาก http://www.hypermart.net/knowledgebase/read_article.bml?kbid=600
:: ทำให้รู้ว่าบาง server ต้องกำหนดห้องเก็บ session เอง เพื่อ Security
:: ถ้าใช้ session ไม่ได้ ก็ให้กำหนด session_save_path ตาม $_ENV["DOCUMENT_ROOT"]
:: เช่น session_save_path("/home/users/web/[bucket]/[home dir]/cgi-bin/tmp"); ก่อน session_start();
<body>
<?php
# http://th2.php.net/manual/en/ref.session.php
# http://th2.php.net/manual/en/function.session-cache-expire.php
# session_start() ต้องมีในทุกเว็บเพจที่ต้องการใช้ตัวแปรแบบ session
# session_save_path("/var/www/cgi-bin/tmp"); สร้างห้อง tmp ไว้เก็บ session สำหรับ Linux
# session_save_path("f:/203.130.156/sahapat/tmp"); ตัวอย่างสำหรับ windows
session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 1;
} else {
  $_SESSION['count']++;
}
# for delete the session variable
# session_unregister('count');
?>
<br>
Hello visitor, you have seen this page <?php echo $_SESSION['count']; ?> times.
</body>
ต.ย.13 โปรแกรมจัดตารางสอบอย่างง่าย ()
:: นักเรียนลงทะเบียนคนละ 3 วิชา แต่หลังจัดตารางสอบจะมีชั่วโมงสอบ 3 Hrs คือ ac, be, d
:: อาจารย์หญิงท่านหนึ่งที่ผมรู้จักใช้ theory การจัดตารางสอบที่มีการทำ generation พร้อมกับ constrain อีกมากมาย
:: ผมลองเขียนดู แต่เอาแบบง่าย ๆ ไม่มีเงื่อนไข จัดให้ลง block ที่เตรียมไว้ ก็ถือว่าใช้ได้แล้ว
Source Code : http://www.thaiall.com/php/timetabling.php
<?php
if (!isset($_POST['regist'])) {
echo "ระบบจัดตารางสอบอย่างง่าย ของนักเรียน 3 คนที่ลงทะเบียนคนละ 3 วิชา";
echo "<form action=timetabling.php method=post>";
echo "<textarea name=regist rows=10 cols=60>
1,a,b,d,
2,a,d,e,
3,b,c,d,
</textarea><br><input type=submit value='Timetabling'>";
echo "</form>";
exit;
}
// แสดงข้อมูลที่รับมาจาก form
echo "<pre>แสดงรายวิชาที่นักเรียนแต่ละคนลงทะเบียนเรียน \n";
$student = preg_split("/\n/", $_POST['regist']); // split("\n",$_POST['regist']);
foreach($student as $one) {
  $subj = preg_split("/,/",$one);
  for($i=0;$i<count($subj);$i++)  echo $subj[$i];
}
// นำข้อมูลแต่ละคน มาแยกเก็บแยกวิชา เช่น a,1,2 ลงตัวแปร $s เพื่อใช้ในการจัดตารางสอบ
foreach($student as $one) {
  $subj = preg_split("/,/",$one);
  for($i=1;$i<count($subj)-1;$i++)  {
    if (!isset($s[$subj[$i]])) $s[$subj[$i]] = $subj[$i] . ",";
    $s[$subj[$i]] = $s[$subj[$i]] . $subj[0] . ",";
  }
}
// อ่าน $s มาจัดลงตัวแปร $sub เพื่อใช้อ้างวิชาที่ได้ เช่น $sub[0] หมายถึงวิชา "a"
echo "<hr>แสดงชื่อนักเรียนที่ลงทะเบียนในแต่ละวิชา";
$i = 0;
foreach($s as $sepsubj) {
  $sepagain = preg_split("/,/",$sepsubj);
  $sub[$i] = $sepagain[0];
  $i = $i + 1;
  echo $sepsubj . "\n";             // $sepsubj เก็บรหัสนักศึกษาในแต่ละวิชา
}
// จัดกลุ่มตามวัน โดยใช้ while ซ้อน for และตรวจสอบความซ้ำซ้อน
$end = 0;
$i = 0;
while ($end == 0) {
  $outday = 0;
  for($j=0;$j<count($sub);$j++)  {
    if (strlen($s[$sub[$j]]) > 2 && $outday == 0) {
      $day[$i] = $sub[$j].",";
      $base = $s[$sub[$j]];
      $s[$sub[$j]] = "";
	  $outday = 1;
    }
  }
  for($j=1;$j<count($sub);$j++)  {
     $sbase = $s[$sub[$j]];
     $ssubj = preg_split("/,/",$sbase); 	
     $found = 0;
	 for($k=1;$k<count($ssubj)-1;$k++)  {
      if (stristr($base,$ssubj[$k])) $found = 1;
     }
	 if ($found == 0 && count($ssubj) > 1) {
       $s[$sub[$j]] = "";
	   $day[$i] = $day[$i] . $sub[$j] . ",";
	 }
  }
  $i++;
  $end = 1;
  foreach ($s as $checksubj) {
    if (strlen($checksubj) > 2 ) $end = 0;
  }
}
echo "<hr>";
// แสดงผลการจัดตารางแล้ว
for($i=0;$i<count($day);$i++)  {
  echo "ชั่วโมงที่ ";
  echo $i + 1;
  echo " สอบวิชา " . $day[$i] . "\n";
}
?>
ต.ย.14 วาดกราฟอย่างง่าย จากข้อมูลผ่าน querystring หรือ get
:: ศูนย์ข้อมูลจังหวัด ต้องการเขียนกราฟใน webpage ผมจึงเขียนโปรแกรมง่าย ๆ ขึ้นมาให้นำไปปรับปรุง
ตัวอย่างที่ : http://www.thaiall.com/php/barchart.php?b1=50&b2=100&b3=120&b4=30
// 14.1 เขียน barchart.php (ปรับปรุง : 5 กรกฎาคม 2548 เพราะเดิมลืมเครื่องหมาย $)
<?php
if (!isset($_GET{'b1'})) {
$sample = "barchart.php?b1=50&b2=100&b3=120&b4=30";
echo "<a href=$sample>$sample</a>";
echo "<br>or <iframe src=$sample height=200 width=200></iframe>";
echo "<br>or <img src=$sample>";
echo "<br>Can test at http://www.thaiall.com/php/$sample";
} else {
header("Content-type: image/png");
$width = 200;
$height = 150;
$bw = 20; // barwidth
$im = @imagecreate ($width,$height);
$white = ImageColorAllocate($im, 255, 255, 255);
$red = ImageColorAllocate($im, 255, 0, 0);
$yellow = ImageColorAllocate($im, 255, 255, 0);
$black = ImageColorAllocate($im, 0, 0, 0);
imagefill($im, 0, 0, $red);
imagefilledrectangle($im, 5, 5, $width - 5, $height - 5, $black);
imageline($im, 5, $height - 3, $width - 5, $height - 3, $yellow);
imagestring ($im, 4, 5, 5, "only in english", $white);
for ($i=1;$i<=10;$i++) {
if (isset($_GET{"b".$i})) {
 imagerectangle($im,$bw * $i,$height - $_GET{"b".$i},$bw * $i + 8,$height - 20,$white);
 imagestring ($im, 0, $bw * $i, $height - 18,  $_GET{"b".$i}, $yellow);
}
}
imagepng ($im);
imagedestroy($im);
}
?>
// 14.2 ทดสอบเขียนภาพอีกแบบหนึ่ง
<?php
header("Content-type: image/png");
if (!isset($_GET{"string"})) $string = "?string=none"; else $string = $_GET{"string"};
$font  = 4;
$width = 200;
$height = 150;
$im = @imagecreate ($width,$height);
//white background
$background_color = imagecolorallocate($im, 255, 255, 255);
//black text
$text_color = imagecolorallocate ($im, 0, 0, 0);
$white = ImageColorAllocate($im, 255, 255, 255);
$red = ImageColorAllocate($im, 255, 0, 0);
imagefill($im, 0, 0, $red);
imagestring ($im, $font, 0, 0,  $string, $text_color);
imageinterlace($im, 1);
imagearc($im, 40, 30, 20, 10, 0, 359, $white);
imageline($im, 5, 5, 70, 60, $white);
imagepng ($im);
imagedestroy($im);
?>
// 14.3 ทดสอบเรื่องใช้ php อ่านแฟ้ม .gif มาแสดง
<?php
  header("Content-Type: image/gif");
  $fn=fopen("ta5.gif","r");
  fpassthru($fn);
?>
14.4 อ่านแฟ้มภาพภาษาไทยใน linux เพราะใช้ชื่อแฟ้มภาษาไทยตรง ๆ ไม่ได้
// http://www.thaiall.com/lampangmap/img.php?f=ลำปาง1
<?php
$f = "ta6.jpg";
if(isset($_GET["f"]) && file_exists($_GET["f"].".jpg")) { $f = $_GET["f"].".jpg"; }
if($fn=fopen($f,"rb")) {
if(filesize($f) < 200000) {
	header("Content-Type: image/png");
	header("Content-Length: " . filesize($f));
	while(!feof($fn)){
	  print(fread($fn, 1024));
	  flush();
	}
	fclose($fn);
} else echo "over limit of file size";
} 
?>
// 14.5 สำหรับเปิดแฟ้ม .pdf ที่มีชื่อไทยใน fedora เพื่อแก้ปัญหาการมีชื่อแฟ้มเป็นภาษาไทย
<?php
if(!isset($_GET["file"])) {
    $f = "ทดสอบ.pdf";
    echo "<a href=openpdf.php?file=". urlencode($f) . " target="_blank">$f</a>";	
    echo "<form action=openpdf.php method=get target="_blank">
    <input name=file size=60 value=$f><br><input type=submit></form>";
    exit;
}
$filename = $_GET["file"];
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="foo.pdf"');
readfile($filename); 
?>
// 14.6 ซ้อนภาพแบบ Transparent
<?php
$dest = imagecreatefromgif('d.gif');
$src = imagecreatefromgif('s.gif');
$bg_color = imagecolorat($src, 1,1);
imagecolortransparent($src, $bg_color);
imagecopymerge($dest, $src, 50, 80, 0, 0, 100, 200, 300);
header('Content-Type: image/gif');
imagegif($dest);
imagedestroy($dest);
imagedestroy($src);
?>
// 14.7 การแสดง icon เป็นผลจากการตรวจสอบแฟ้ม
// ตัวอย่างที่ : http://www.thaiall.com/me/lyric.htm
<?php
header("Content-Type: image/png");
if (isset($_GET["name"]) && file_exists($_GET["name"] . ".mid")) 
  $fn=fopen("1.png","r");
else
  $fn=fopen("0.png","r");
fpassthru($fn);
?>
ต.ย.15 การเชื่อมต่อกับ MsSQL server
:: http://www.php.net/manual/en/function.mssql-connect.php
// $msconnect = mssql_connect("172.16.20.81:1433","sa","");
$msconnect = mssql_connect("MyServer70","sa","");
$msdb=mssql_select_db("Northwind",$msconnect);
$msquery = "select firstname,lastname from employees";
$msresults= mssql_query($msquery);
echo "<ol>";
while ($row = mssql_fetch_array($msresults)) {
  echo "<li>" . $row['firstname'] . " " . $row['lastname'] . "\n";
}
echo "</ol>";
ต.ย.16 Online User Counter (no mysql)
:: โปรแกรมนับผู้ใช้ที่กำลัง online อยู่ แบบใช้ mysql มีมากมาย แต่ของผมใช้ text file ทดสอบแล้วใน thaiabc3e.exe
ขณะนี้ online : <?php
$gap = 60; // 60 seconds
$t   = $_SERVER["REMOTE_ADDR"].",".time()."\n";
$f   = "countuser.txt";
$c   = 0;
$new = 1; // ตั้งไว้ก่อนว่าเป็นคนใหม่
if (file_exists($f)) {
  $fr=file($f);
  $fw=fopen ($f,"w");
  foreach ($fr as $value) {
     $ft = preg_split("/,/",$value);
     if ($ft[0] == $_SERVER["REMOTE_ADDR"]) {
       fputs ($fw,$_SERVER["REMOTE_ADDR"].",".time()."\n");
       $c = $c + 1;
       $new = 0;
     } else {
       if ((time() - $gap) < $ft[1]) {
         fputs ($fw,$value);
         $c = $c + 1;
       }
     }
  }
  if ($new == 1) {
    fputs ($fw,$t);
    $c = $c + 1;
  }
  echo $c;
  fclose ($fw);
} else {
  $fw=fopen ($f,"w");
  fputs ($fw,$t);
  fclose ($fw);
  echo "1";
}
?> คน
ต.ย.17 สุ่มเลขไม่ซ้ำ แบบใช้ in_array
:: วิธีสุ่มเลขไม่ซ้ำให้ได้เลข 10 ตัวคือ 0 - 9
:: ถ้าไม่ใช้ in_array จะมี loop อีกตัวหนึ่ง สำหรับเช็คซ้ำ .. ซึ่งเป็นวิธีที่ผมใช้ตามปกติ
srand(time());
$num = 10;
$a = array();
while (count($a) < $num) {
  $n = rand() % $num;
  if (!in_array($n, $a)) array_push($a,$n);
}
for ($i=0;$i<$num;$i++) echo $a[$i]."<br>";
ต.ย.18 Bad Word Blockinging (หาคำที่ไม่สุภาพ แล้วเปลี่ยน)
<body>
<form action=bad.php method=post>
<textarea name=word rows=5 cols=50>
แดงบอย น้อย ขาวดำ ก็มี
ดาว ดำ ดีดี สุภาพดำนะไม่ดี
</textarea><input type=submit></form>
<?php
$bi=-1;
$bi++; $bad[$bi]="ทอง";
$bi++; $bad[$bi]="ขาว";
$bi++; $bad[$bi]="ดำ";
for($b=0;$b<=$bi;$b++)
$_POST["word"] = str_replace($bad[$b],"..",$_POST["word"]);
echo $_POST["word"];
?>
</body>
ต.ย.19 Redirection Header (จาก www.yonok.ac.th)
if (isset($_GET['codes']))
header("Location: http://yn1.yonok.ac.th/catalog/subjdesc.php?codes=" . $_GET['codes']);
else
header("Location: http://yn1.yonok.ac.th/catalog/subjdesc.php");
ต.ย.20 Encode and Decode
:: เข้ารหัส URL แก้ปัญหา Internal Server Error ในบางกรณีได้
<pre><?php
if (!isset($_POST["ch"])) $a = "<a title=test>ทดสอบ/aaa</a> // \\ // \\";
else $a = $_POST["ch"];
// Normal Output
  echo $a."\n";
  # Output: ทดสอบ/aaa // \ // \
// Un-quote string quoted with addslashes()
  echo stripslashes($a)."\n";
  # Output: ทดสอบ/aaa //  //
// Quote string with slashes
  echo addslashes($a)."\n";
  # Output: ทดสอบ/aaa // \\ // \\
// URL-encodes string
  echo urlencode($a)."\n";
  # Output: %3Ca+title%3Dtest%3E%B7%B4%CA%CD%BA%2Faaa%3C%2Fa%3E+%2F%2F+%5C+%2F%2F+%5C
// Decodes URL-encoded string
  echo urldecode(urlencode($a))."\n";
  # Output: ทดสอบ/aaa // \ // \
// Convert special characters to HTML entities
  echo htmlspecialchars($a)."\n";
  # Output: <a title=test>ทดสอบ/aaa</a> // \ // \
// Convert all applicable characters to HTML entities
  echo htmlentities($a)."\n";
  # Output: <a title=test>?????/aaa</a> // \ // \
// Encodes data with MIME base64
  echo base64_encode($a)."\n";
  # Output: PGEgdGl0bGU9dGVzdD63tMrNui9hYWE8L2E+IC8vIFwgLy8gXA==
// Decodes data encoded with MIME base64
  echo base64_decode(base64_encode($a))."\n";
  # Output: ทดสอบ/aaa // \ // \
// One-way string encryption (hashing) (ผลไม่ซ้ำกัน)
  echo crypt($a)."\n";
  # Output: $1$RL..GJ..$HzbDnURKr6iBOL1txhwk2/
  # EX. if (crypt($user_input, $passwd) == $passwd) echo "OK";
  # EX. if (crypt($_GET["p"],"$1$01..Hv/") == "$1$01..Hv/") { }
?>
<form action="" method=post><input name=ch><input type=submit></form>
</pre>
// โปรแกรมแปลงภาษาไทยเป็นตัวเลข
<?php
if (isset($_REQUEST["t"])) {
$txt = $_REQUEST["t"];
for($i = 0;$i<strlen($txt);$i++) {echo sprintf("%03d",ord(substr($txt,$i,1)));}
}
?>
<form action="">แปลงภาษาไทยเป็นรหัส ascii 3 หลัก 
<input name=t value="<?php
if (isset($_REQUEST["t"])) echo $_REQUEST["t"]; else echo "กขค";
?>"> <input type=submit value=convert>
</form>
// โปรแกรมแปลงตัวเลข Ascii กลับเป็นภาษาไทย
$str = "161162163";
$countletter = strlen($str); // กขค
$countword = $countletter / 3;
for ($i = 0;$i < $countword;$i++) {
  $pt = ($i * 3);
  $getascii=(substr($str,$pt,1) *100)+(substr($str,$pt +1,1) *10)+(substr($str,$pt +2,1));
  echo chr($getascii);
}
// ตัวอย่างการเปลี่ยน img url จาก http ภายนอก มาใช้ใน https (gallery.pl)
$crypt_char = 2; /* จำนวนตัวอักษร ผมเลือกใช้เพื่อเข้ารหัสเพียง 2 ตำแหน่งแรก เช่น id เหมือน idt */
$i = preg_split("/\//",$_GET["img"]); /* ตัด url ด้วย / เพื่อเลือกใช้เฉพาะชื่อ folder */
if (isset($_GET["c"]) && (crypt(substr($i[1],0,$crypt_char), $_GET["c"]) != $_GET["c"])) {
  echo die(crypt(substr($i[1],0,$crypt_char)));
}
/* ตรวจสอบว่ามีตัวแปร c หรือไม่ */
if (!isset($_GET["c"])) die("c parameter required");
/* เริ่มต้นแสดงภาพ */
header("Content-type: image/jpeg");
if (isset($_GET["img"])) { echo curl_load('http://yourdomain.com' . $_GET["img"]); }
function curl_load($url){
    curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
	/* CURLOPT_RETURNTRANSFER = คุณสมบัติ true=1 คือเปิดให้ curl_exec สามารถ return ค่าได้ */
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
ต.ย.21 Each _SESSION, _SERVER, _ENV
:: แสดงข้อมูลทั้งหมดในตัวแปร Session หรือตัวแปร Server
:: ใช้ session_save_path ในกรณีที่ server บังคับให้ใช้ เช่น hypermart.net
:: session_save_path("/var/www/cgi-bin/tmp"); สร้างห้อง tmp ไว้เก็บ session เป็นต้น
<?php
session_start();
$_SESSION["a"] = 5;
foreach ($_SESSION as $k=>$v) {
  echo $_SESSION["$k"];
}
foreach ($_SERVER as $k=>$v) {
  echo $k . $_SERVER["$k"];
}
foreach ($_ENV as $k=>$v) echo $k." = ".$v."<br>";
phpinfo();
?>
// Testing of ! http://www.yonok.ac.th/burin/boardx/session.php
<?php
session_start();
if (isset($_SESSION["aaa"])) {
  echo $_SESSION["aaa"] . "<br>";
  if (isset($_GET["delete"])) {
    session_unset();
    session_destroy();
    header("location: session.php");
  }
}
if (isset($_GET["create"])) {
  $_SESSION["aaa"] = "aaa";
  header("location: session.php");
}
?>
<a href='?create=yes'>?create=yes</a>
<a href='?delete=yes'>?delete=yes</a>
ต.ย.22 MySQL Manage (insert, delete, update, select)
:: ถ้าพบปัญหา ?? ต้องใช้ set names tis620 ทั้งตอน insert และ select
<?php
$host     = "localhost";
$db       = "test";
$tb       = "testtb";
$user     = "root";
$password = "";
###########################
if (isset($_POST["action"])) {
 if ($_POST["action"] == "insert") {
  $query = "insert into $tb (id,name) values (". $_POST["id"] .",'". $_POST["name"] ."')";
 }
 if ($_POST["action"] == "delete") {
  $query = "delete from $tb where id =". $_POST["id"];
 }
 if ($_POST["action"] == "update") {
  $query = "update $tb set name='".$_POST["name"] ."' where id =". $_POST["id"];
 }
 $connect = mysql_connect("$host","$user","$password");
 mysql_query("set names tis620"); // การเพิ่มบรรทัดนี้ ทำให้ข้อมูลใน mysql เก็บถูกต้อง
 $result = mysql_db_query($db,$query);
 if ($result) echo "<br>". $_POST["action"] ." OK<br>"; else exit;
 mysql_close($connect);
}
###########################
$query    = "select * from $tb";
$connect = mysql_connect("$host","$user","$password");
mysql_query("set names tis620"); // การเพิ่มบรรทัดนี้ ทำให้ดึงข้อมูลมาแสดงอย่างถูกต้อง
$result = mysql_db_query($db,$query);
if ($result) echo "<br>OK<br>"; else exit;
while ($object = mysql_fetch_object($result)) {
  foreach ($object as $o) echo $o." ";
  # echo $object->cust . "  " . $object->custname;
  echo "<br>";
}
echo "Total records : ".mysql_num_rows($result);
mysql_close($connect);
###########################
?>
<form action=? method=post>
<b>Insert</b><br>id : <input name=id><br>name : <input name=name><br>
<input type=submit value=insert name=action>
</form>
<form action=? method=post>
<b>Update</b><br>id : <input name=id><br>name : <input name=name><br>
<input type=submit value=update name=action>
</form>
<form action=? method=post>
<b>Delete</b><br>id : <input name=id><br>
<input type=submit value=delete name=action>
</form>
ต.ย.23 แก้ปัญหาภาษาไทยเป็น ??? เมื่ออ่านข้อมูลจาก MySQL
:: ทุกครั้งที่อ่านข้อมูล จึงต้องเพิ่ม mysql_query .. เพื่อกำหนดภาษาเป็น tis620 (ทราบจาก phpconcept.com)
:: คัดลอก SQL ใน Notepad ไปใส่ใน MySQL-Front เป็น ??? พอเปลี่ยนเป็น wordpad ไม่มีปัญหาเรื่อง ??? (w2003)
:: Microsoft-IIS/8.5 php-5.6 mysql-5.1 phpmyadmin-4.0.10.20
:: ! http://www.phpconcept.com/content/view/21/28/
+ แก้ปัญหาภาษาไทย เมื่อพิมพ์ภาษาไทยใน phpmyadmin แล้วออกเป็น ???
- ให้ทำตอนเริ่มต้นสร้างตาราง หรือ backup ข้อมูลไว้ก่อน เพราะถ้ามีข้อมูลมาก ๆ อาจมีปัญหา
- เปลี่ยน การเรียงลำดับในแต่ละ field จาก latin1_swedish_ci เป็น tis620_thai_ci
- ใน php script ต้องเพิ่ม mysql_query("set names tis620"); ต่อจาก mysql_connect( .. );
- วิธีนี้ไม่ได้แก้ปัญหาภาษาไทยในข้อมูลเดิม แต่จะไม่มีปัญหากับข้อมูลใหม่ที่เพิ่ม หรือแก้ไข
// Sample 1 : set names tis620
<?php
$host     = "localhost";
$db       = "test";
$tb       = "test";
$user     = "root";
$password = "song:letitbe";
$query    = "select * from $tb";
//
$connect = mysql_connect("$host","$user","$password");
// $charset = "set character_set_results=tis620";
$charset = "set names tis620";
mysql_query($charset) or die('Invalid query: ' . mysql_error());
//
$result = mysql_db_query($db,$query);
while ($object = mysql_fetch_object($result)) {
   echo $object->test . "<br/>";
}
mysql_close($connect);
?>
// Sample 2 : set names utf8
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<?php
$host     = "localhost";
$db       = "test";
$tb       = "testutf8";
$user     = "root";
$password = "song:letitbe";
$query    = "select * from $tb";
###########################
$connect = mysql_connect("$host","$user","$password");
$charset = "set names utf8";
mysql_query($charset) or die('Invalid query: ' . mysql_error());
$result = mysql_db_query($db,$query);
while ($object = mysql_fetch_object($result)) {
   echo $object->test . "<br/>";
}
mysql_close($connect);
?>

ต.ย.24 ตรวจ Link ในเว็บเพจที่ต้องการ
:: รุ่นนี้ยังไม่เช็ค link ปลายทาง เพียงแต่บอกว่า เว็บเพจนั้นมี link อะไรบ้าง
:: ลองทดสอบดูได้ ที่ http://www.thaiall.com/php/linkchk1.php
$url = "http://lampang.thcity.com/face/indexo.html";
if (isset($_POST["url"])) {
  $url = strtolower($_POST["url"]);
  $web = file($url);
  echo "<ol>";
  for($i=0;$i<count($web);$i++) {
   $web[$i] = strtolower($web[$i]);
   $found = 0;
   $r1 = preg_split("/href=/",$web[$i]);
   if (count($r1) > 1) $found = 1;
   if ($found == 1) {
     $r2 = preg_split("/>/",$r1[1]);
     $tag = $r2[0];
     echo "<li>";
     if (substr($r2[0],0,4) != "http")
       echo "<font color=red>$tag</font>\n"; else  echo $tag."\n";
   }
  }
  echo "</ol>Total Line : ". count($web);
}
echo "<form action='' method=post><input name=url value='$url' size=60>
<input type=submit></form>";
ต.ย.25 ฟังก์ชัน สำหรับการจับเวลาทำงานของเว็บเพจ
โปรแกรมสำหรับบันทึกเวลา เก็บไว้เมื่อส่งค่า start และหยุดเมื่อส่งค่า stop แล้วหาช่องว่างของเวลา หรือ gap ซึ่งตัวอย่างนี้มี 3 ตัวอย่างย่อย 1) จับเวลาการ delay 5 วินาทีผ่านคำสั่ง for 2) เทียบระหว่าง for กับ while 3) ปรับเพิ่มการใช้ functionให้อ่านโปรแกรมได้ง่ายขึ้น ผลการทดสอบเปรียบเทียบระหว่าง for กับ while พบว่า รอบแรก process ไม่ว่า for หรือ while จะใช้เวลานานกว่า แต่ถ้าเพิ่มคู่ต่อไป อาจเท่ากัน หรือสลับกันมากกว่า สรุปว่าไม่แน่นอน แต่ใกล้เคียงกัน คาดว่า มีปัจจัยอื่นส่งผลต่อการทำงาน เมื่อทดสอบบนเครื่องบริการ Run PHP แบบ Online ทั้ง 4 อาทิ phptester.net หรือ onlinephpfunctions.com พบว่าให้ผลในการทดสอบของคำสั่ง for และ while ใกล้เคียงกันมาก จึงสรุปได้ว่า ไม่แตกต่างกันตามผลการทดสอบในตัวอย่างที่ 3 แต่ต้องเปลี่ยน <br> เป็น \n เพราะแสดงผลเป็น text ธรรมดา

<?php
$gap = 0;
xTime("start"); // start process
for($i=1;$i<=5;$i++) sleep(1); // Delay 5 seconds
xtime("stop"); // stop process
echo number_format($gap,9) . " seconds"; // 9
// function for [start] and [stop]
function xTime ($action) {
  global $gap;
  list($microsecond,$second) = preg_split('/ /',microtime());  
  // echo $microsecond; // 0.61209100
  if ($action == "start") 
    $gap = $second + $microsecond;  
  else 
    $gap = $second + $microsecond - $gap;
}
?>
Test on PHP 5.6, 7.0 at http://phptester.net/
Gap = 5.000725985 seconds

<?php
srand(time());
/* 1: Main Loop (test for [while] and [for] that swap 100 times) */
$gap = 0; 
$gap1 = 0; $gap2 = 0; $gap3 = 0;
$cnt1 = 0; $cnt2 = 0; $cnt3 = 0;
for($num=1;$num<=3000000;$num++){
	$option = rand() % 3;
	switch($option){
		case 0:
			// Process #1 : for
			xTime("start"); 
			pro1();
			$gap1 += number_format(xTime("stop"),9); // ทศนิยม 9 ตำแหน่ง
			$cnt1++;
		break;
		case 1:
			// Process #2 : while () {}
			xTime("start");
			pro2();
			$gap2 += number_format(xTime("stop"),9);
			$cnt2++;
		break;
		case 2:
			// Process #3 : do {} while();
			xTime("start");
			pro3();
			$gap3 += number_format(xTime("stop"),9);		
			$cnt3++;
		break;
	}
}	
/* 2: Result Display */
echo "Time of for(){} : $gap1 seconds with $cnt1 times<br/>";
echo "Time of while(){} : $gap2 seconds with $cnt2 times<br/>";
echo "Time of do{} while() : $gap3 seconds with $cnt3 times<br/>";
/* 3: Function area */
function xTime ($action) {
  global $gap;
  list($microsecond,$second) = preg_split("/[ ]/",microtime());  
  if ($action == "start") 
    $gap = $second + $microsecond;  
  else
    $gap = $second + $microsecond - $gap;
  return $gap;
}
/* 3: Function area */
function pro1(){ for($i=1;$i<=10;$i++) { } }
function pro2(){ $j=0; while($j < 10) { $j++; }	}
function pro3(){ $k=0; do { $k++; } while ($k < 10);
}
?>

<?php
srand(time());
$gap1=0; $gap2=0;
$cnt1=0; $cnt2=0;
for($num=1;$num<=1000000;$num++){
	if(rand() % 2 == 0)
		$gap1 += xTime(process1(start()));
	else		
		$gap2 += xTime(process2(start()));
}
//
echo "Time of for :  $gap1 microseconds with $cnt1 times<br/>";
echo "Time of while :  $gap2  microseconds with $cnt2 times<br/>";
//		
function process1 ($start) {
  	global $cnt1;	
	$cnt1++;
	for($i=1;$i<=100;$i++) { }
	return $start; 
}
function process2 ($start) {
	global $cnt2;	
	$cnt2++;
	$j=0; while($j < 100) { $j++; }
 	return $start;
}
function start() {  
  list($microsecond,$second) = preg_split("/[ ]/",microtime());  
  $start = $second + $microsecond;  
  return $start;
}
function xTime ($start) {  
  list($microsecond,$second) = preg_split("/[ ]/",microtime());  
  return number_format($second + $microsecond - $start,9);
}
?>

<?php
srand(time());
$gap1=0; $gap2=0;
for($num=1;$num<=1000000;$num++){
	if(rand() % 2 == 0)
		$gap1 += process1(start());
	else		
		$gap2 += process2(start());
}
//
echo "Time of '' :  $gap1 microseconds<br/>";
echo 'Time of "" :'."  $gap2  microseconds<br/>";
//		
function process1 ($start) {
	$x = '0 ' . $start . ' 1';
	// $x = '0  1'; // this is different
	list($microsecond,$second) = preg_split("/[ ]/",microtime());  
	return number_format($second + $microsecond - $start,9);	
}
function process2 ($start) {
	$x = "0 $start 1";
	list($microsecond,$second) = preg_split("/[ ]/",microtime());  
	return number_format($second + $microsecond - $start,9);	
}
function start() {  
	list($microsecond,$second) = preg_split("/[ ]/",microtime());  
	$start = $second + $microsecond;  
	return $start;
}
?>
ต.ย.26 จัดการข้อมูลในมายเอสคิวแอล แบบแยก (my01.htm, my01.php)
:: mysql> use test;
:: mysql> create table abc(a1 int,a2 varchar(10));
// my01.htm
<form action=my01.php method=post>
<input name=a><input name=b><br>
<input type=radio value=i name=c>insert<br>
<input type=radio value=d name=c>delete<br>
<input type=radio value=u name=c>update<br>
<input type=radio value=s name=c>select<br>
<input type=submit>
</form>
// my01.php
<?
$c = mysql_connect("127.0.0.1:3306","root","");
if ($_POST["c"] == "i")
 $sql = "insert into abc values(".$_POST["a"].",'".$_POST["b"]."')";
elseif ($_POST["c"] == "d")
 $sql = "delete from abc where a1=".$_POST["a"];
elseif ($_POST["c"] == "u")
 $sql = "update abc set a2='".$_POST["b"]."' where a1=". $_POST["a"];
elseif ($_POST["c"] == "s")
 $sql = "select * from abc";
$r = mysql_db_query("test",$sql);
if ($_POST["c"] == "s")
 while ($o = mysql_fetch_object($r)) echo "$o->a1 $o->a2 <hr>";
else echo $sql;
?>
ต.ย.27 คลายแฟ้ม .zip ด้วย PHP (Zip Management with PHP)
:: http://pecl.php.net/package/zip
:: http://th.php.net/manual/en/ref.zip.php
:: http://www.w3schools.com/php/php_ref_zip.asp
:: ลบ ; หน้า extension=php_zip.dll ใน php.ini ออก มีผลให้ phpinfo แสดง Zip Support เป็น enabled
// unzip( $zipfile, $destination_folder )
// สร้างห้อง c:\xxx ให้ใหม่ หากไม่สร้างไว้แล้ว
<?php
unzip('c:\\test.zip','c:\\xxx\\');
echo ": ok";
function unzip($file, $path) {
$zip = zip_open($file);
if ($zip) {
while ($zip_entry = zip_read($zip)) {
  if (zip_entry_filesize($zip_entry) > 0) {
    // str_replace must be used under windows to convert "/" into "\"
    $complete_path = $path.str_replace('/','\\',dirname(zip_entry_name($zip_entry)));
    $complete_name = $path.str_replace ('/','\\',zip_entry_name($zip_entry));
    if(!file_exists($complete_path)) {
      $tmp = '';
      foreach(explode('\\',$complete_path) AS $k) {
        $tmp .= $k.'\\';
        if(!file_exists($tmp)) mkdir($tmp, 0777);
      }
    }
    if (zip_entry_open($zip, $zip_entry, "r")) {
      $fd = fopen($complete_name, 'w');
      fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
      fclose($fd);
      zip_entry_close($zip_entry);
    }
  } // end of if
} // end of while
zip_close($zip);
} // end of if
} // end of function
?>
ต.ย.28 Shell Command หรือ shell_exec()
:: ถ้าใน php.ini กำหนดว่า safe_mode = On จะทำให้ใช้ shell_exec ไม่ได้ ต้องเปลี่ยนเป็น safe_mode = Off
:: ตรวจว่ากำหนดอะไรให้กับ disable_functions ใน php.ini หรือไม่
:: ใน iis ต้องกำหนดให้ system32/cmd.exe มี Security ของ IUSR_ สามารถประมวลผลได้
// แบบ 1 : สั่งทีละบรรทัด
echo "<br>".date("d/m/Y H:i:s"); // 13/07/2006 18:29:00
echo "<br>".time();  // 1152185502
echo "<br>".microtime(); // 0.23212200 1152185502
echo "<br>". ( microtime() + microtime() ); // 0.464397
echo "<pre><font face="courier new">";
$cmd =`type c:\\autoexec.bat`;
echo "<hr>$cmd";
$cmd =`echo dir %WINDIR% > a.bat`;
echo "<hr>$cmd";
$cmd =`type a.bat`;
echo "<hr>$cmd";
$cmd =`a.bat`;
echo "<hr>$cmd";
$cmd =`dir`;
echo "<hr>$cmd";
$cmd = shell_exec("echo dir %WINDIR% > b.bat");
$cmd = shell_exec("dir b.bat");
echo "<hr>$cmd"; // 17 Bytes
$cmd = shell_exec('del b.bat');
$cmd = shell_exec('dir b.bat');
echo "<hr>$cmd";
// แบบ 2 : ใช้อาร์เรย์
// ใน thaiabc ใช้ได้ บางเครื่องเกรงเป็น Security Hole อาจพบ Unable to execute (ปรับปรุง : 2553-04-20)
// ถ้าใน iis ไม่ยอมให้ใช้ shell_exec ผ่าน IUSR_ ต้องกำหนด Authen ของ User ให้กับคำสั่ง cmd ก่อน
ini_set('error_reporting', '2047'); 
ini_set('display_errors', 'on'); 
$ar = array();
$ar[count($ar)] = "netstat";
$ar[count($ar)] = "arp -a";
$ar[count($ar)] = "set";
$ar[count($ar)] = "net share";
$ar[count($ar)] = "ipconfig /all";
$ar[count($ar)] = "ping www.baidu.com";
$ar[count($ar)] = "ping www.baidu.com -l 1024 -n 3";
$ar[count($ar)] = "dir"; 
$ar[count($ar)] = "net start";
foreach($ar as $v){
echo "<b>$v</b><br>";
echo str_replace("<","&lt;",shell_exec($v));
echo "<hr>";
}
// แบบ 3 : เลือกทีละคำสั่ง
$ar = array();
$ar[count($ar)] = "dir"; 
$ar[count($ar)] = "ipconfig /all";
$ar[count($ar)] = "ping 127.0.0.1";
$ar[count($ar)] = "ping www.baidu.com -l 1024 -n 3";
$ar[count($ar)] = "arp -a";
$ar[count($ar)] = "set";
if (isset($_REQUEST["id"]))
if (isset($ar[$_REQUEST["id"]])) 
  echo str_replace("<","&lt;",shell_exec($ar[$_REQUEST["id"]]));
<a href="?id=0">0</a>
ต.ย.29 เพิ่ม Linux User ผ่าน shell_exec
:: น้องคนหนึ่งโทรถามเรื่อง ssh authentication กับ php เพื่อใช้ useradd ในสิทธิ์ของ root
:: Linux ของผมไม่อนุญาติให้เชื่อมต่อผ่าน ssh จึงต้องใช้ shell_exec กับการจัดการ sudoers แทน แล้งส่งให้ php ประมวลผล
:: ถ้าใน php.ini กำหนดว่า safe_mode = On จะทำให้ใช้ shell_exec ไม่ได้ ต้องเปลี่ยนเป็น safe_mode = Off
$host = "127.0.0.1" ;
$output = shell_exec("ping -c1 $host"); 
echo "<pre>$output</pre>";
$user = "hello";
$pass = "wow";
echo shell_exec("sudo -u root -S /usr/sbin/useradd $user");
echo shell_exec("echo $pass |sudo -u root -S /usr/bin/passwd $user --stdin");
echo shell_exec("id $user");

วิธีทำให้ใช้ sudo และ useradd ด้วยการแก้ไขแฟ้ม /etc/sudoers
- เปลี่ยนสิทธิ์จาก 440 เป็น 777
- เปิดแฟ้ม /etc/sudoers ด้วย vi แล้วแก้ให้เลิกถามรหัสผ่านเมื่อใช้ sudo
- เพิ่ม apache ALL= NOPASSWD: /usr/sbin/useradd, /usr/bin/passwd
- ต้องเปลี่ยนกลับเป็น 440 จึงจะสั่ง script ให้ทำงานได้
วิธีทำให้ใช้ shell_exec ไม่ได้
ถ้าผู้ดูแลระบบไม่ต้องการให้นักพัฒนาใช้ shell_exec สามารถทำได้โดยกำหนด safe_mode เป็น On ใน php.ini ก็จะใช้ฟังก์ชัน shell_exec ไม่ได้
// chmod 644 maillog
$cmd =`tail -100 /var/log/maillog`;
$a = preg_split("/\n/",$cmd);
$user ="";
$time ="";
echo "<font size=0>";
for ($i=0;$i<count($a);$i++){
  $r = preg_split("/imap-login/",$a[$i]);
  if(count($r) > 1){
   $f = preg_split("/ /",$r[1]);
    $user = $f[2];
    $time = substr($r[0],0,15);
    if($user != "login") $u[$user] = "<br /><b>Last login</b> : ". $user ." ".$time;
  }
}
foreach($u as $v) echo $v;
ต.ย.30 webservices แบบ REST จาก amazon.com
:: ทดสอบไว้ที่ http://www.thaiall.com/rss/callAmazonRESTWS.php
:: callAmazonRESTWS.php จาก http://gotoknow.org/blog/krunapon/74176
:: โดย ผศ.ดร.กานดา รุณนะพงศา
:: - ถ้าไม่ส่ง parameters จะเรียก http://webservices.amazon.com/onca/xml ไม่ได้
:: - http://www.onlamp.com/pub/a/php/2003/10/30/amazon_rest.html
header("Content-type: text/xml");
$base = 'http://webservices.amazon.com/onca/xml'; 
$query_string = '';
$params = array( 
'Service' =>'AWSECommerceService', 
'SubscriptionId' => '16XT8ETKKB7NWHAGCQ02' , 
'Operation' => 'ItemSearch',
'SearchIndex' => 'Books',
'Keywords' => 'Web Services'); 
foreach ($params as $key => $value) { 
  if ($key != 'Keywords')
   $query_string .="$key=".urlencode($value) . "&";
  else
   $query_string .="$key=".urlencode($value);
}
$url = "$base?$query_string";
$xml = file_get_contents($url);
echo $xml;     
ต.ย.31 crop or resize image
ใช้งานจริงใน http://www.thaiall.com/vbnet/testtoolbox.htm
http://www.thaiall.com/mag/merge.php
// crop image
if (isset($_GET["i"])) $i = $_GET["i"]; else $i = 1;
if (isset($_GET["f"])) $f = $_GET["f"]; else $f = 1;
if ($i < 1 || $f < 1) exit;
$filename = 'http://www.thaiall.com/vbnet/testtoolbox_0' . $f .'.gif';
$percent = 1; // 0.2 สำหรับลดขนาดลง 20%
header('Content-type: image/gif');
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;
$gap = ($height - 17) / 20;
$nh = $newheight - (20 * $gap);
// $thumb = imagecreatetruecolor($newwidth, $newheight);
$thumb = imagecreatetruecolor($newwidth, $nh);
$source = imagecreatefromgif($filename);
// imagecopyresized($thumb, $source,0,0,0,0,$newwidth,$newheight,$width,$height);
imagecopyresized($thumb, $source, 0, 0, 0, ($i * 20 - 2), $newwidth, $nh, $width, $nh);
imagejpeg($thumb);
// merge image ตามแนวคิดของ magmypic.com โดยมีกรอบให้เลือก แล้วส่งภาพเราเข้าไปอยู่ในกรอบ
$user = 'user.jpg'; // ภาพคนที่จะอยู่ในกรอบ 
$frame = 'mag01.gif'; // กรอบของภาพที่ทำโปร่งไว้ ด้วย iview
$dest = imagecreatefromgif($frame); 
$src = imagecreatefromjpeg($user); 
$src_new = imagecreatetruecolor(280, 350);
list($width, $height) = getimagesize($user);
imagecopyresized($src_new, $src, 0, 0, 0, 0 , 280, 350, $width,$height);
imagecopymerge( $src_new, $dest, 0, 0, 0, 0, 280, 350, 100);
header('Content-Type: image/jpeg');
imagegif($src_new);
imagedestroy($dest);
imagedestroy($src);
imagedestroy($src_new);
ต.ย.32 การทำงานของ PHP เพื่อนำไปใช้ใน WAP Browser
ตัวอย่าง http://www.thaiall.com/wap
<?php
header("Content-type: text/vnd.wap.wml");
print "<?xml version=\"1.0\"?>\n";
?>
<wml><card id="HTML" title="<?php print rand();?>">
<p>Hello on thaiall.com<br/>
<?php print date("d/m/Y H:i:s"); ?></p>
</card></wml>
ต.ย.33 อ่าน .dat แบบมีรูปแบบ ไปเป็น .txt
$r = fopen("mas1.dat","r"); // input file
$o = fopen("mas1.txt","w"); // output file
$v = fread($r, 16); // skip head
for ($i=1;$i<=200;$i++) { 
  $v = fread($r, 36);  
  fwrite($o, $v.chr(10)); 
}
fclose($o); 
fclose($r); 
ต.ย.34 อ่านข้อมูลจากเครื่องอ่านลายนิ้วมือ Bravo
$db_connection = new COM("ADODB.Connection");
$db_connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".realpath("att2000.mdb").";";
$db_connection->open($db_connstr);
$rs = $db_connection->execute("select * from checkinout order by checktime desc");
$rs_fld1 = $rs->Fields(1); 
$last = $rs_fld1->value;
//
$sql = "select * from checkinout where checktype='I' order by checktime desc";
$rs = $db_connection->execute($sql);
$rs_fld0 = $rs->Fields(0); // userid 
$rs_fld1 = $rs->Fields(1); // checktime
$rs_fld2 = $rs->Fields(2); // checktype
echo "<table><tr align=center><td colspan=2>เข้าทำงาน<tr><td>รหัส<td>".date("j-m-y",$last);
$i=1;
while (!$rs->EOF) {
if(date("j-m-y",$rs_fld1->value) == date("j-m-y",$last) && date("G",$rs_fld1->value) < 12){
  if (date("G",$rs_fld1->value) >= 8 && date("i",$rs_fld1->value) >= 1)
    print "<tr bgcolor=#ffdddd>";
  else
    print "<tr>";
  print "<td>". $i++ . ". ". $rs_fld0->value;
  print "<td align=right>". date("G:i",$rs_fld1->value);
}
$rs->MoveNext();
}
echo "</table>";
$rs->Close();
$db_connection->Close();
ต.ย.35 ตรวจรหัสผู้ใช้ และรหัสผ่าน
// checkuser.php
// $u = file("user.txt");
$u = "
tom	boy
jack	nok
burin	anuchit
admin	toranin
";
$status = "0";
if (isset($_REQUEST["u"]) && isset($_REQUEST["p"])) {
  $rec = preg_split("/\r\n|\r|\n/",$u);
  foreach($rec as $v) {
    $r = preg_split("/\t/",$v);
    if (strlen($v) > 5 && $_REQUEST["u"] == $r[0] && $_REQUEST["p"] == $r[1]) 
      $status = 1;
  }
}
echo $status;
# http://localhost/checkuser.php?u=tom&p=boy
// checkprofile.php
<?php session_start(); ?>
<form action=''>
<input name=u><input name=p type=password><input type=submit>
</form>
<?php
if (isset($_SESSION["u"])) echo "Current User: ". $_SESSION["u"]."<br>";
if (!isset($_REQUEST["u"])) exit;
$url = "http://www.yonok.ac.th/doc/burin/checkuser.php";
$url.= "?u=".$_REQUEST["u"]."&p=".$_REQUEST["p"];
$chk = file($url);
if ($chk[0] == 1) {
  echo "pass"; 
  $_SESSION["u"] = $_REQUEST["u"];
} else echo "fail";
?>
ต.ย.36 ค้นหาที่ตั้งประเทศตามหมายเลขไอพี
+ http://www.infosniper.net มีหลายแผนที่
+ http://www.ipaddresslocation.org/ip-address-locator.php มีแผนที่
+ http://www.geoiptool.com มีแผนที่
+ http://www.ip2location.com/118.172.107.201
+ http://www.maxmind.com/app/locate_ip
+ http://www.geobytes.com/IpLocator.htm?GetLocation
+ http://php.net/manual/en/function.get-meta-tags.php
$u = 'http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=11.2.3.9';
$tags = get_meta_tags($u);
foreach($tags as $key => $value) {
echo $key . $value. '<br>';
}
// print $tags['city'];  
ต.ย.37 เข้ารหัส และถอดรหัส base64
<body>base64_encode and base64_decode
<form action="" enctype="multipart/form-data" method=post>
<input type=file name=uploadfile><input type=submit value="encode" name="act">
</form>
<form action="" method=post>
<input type=submit value="decode" name="act">
<textarea rows=20 cols=70 name=d>
<?php
if (isset($_REQUEST["act"]) && $_REQUEST["act"] == "encode") { 
ini_set('allow_url_fopen', 'on'); 
if (isset($_FILES["uploadfile"]["name"])) {
  if($fn=fopen($_FILES["uploadfile"]["tmp_name"],"rb")) {
    if(filesize($_FILES["uploadfile"]["tmp_name"]) < 50000) {
      while(!feof($fn)){
        echo base64_encode(fread($fn, 1024));
        flush();
      }
    }
    fclose($fn);
  }    
}
}
?></textarea></form>
<?php
if (isset($_REQUEST["d"]) && strlen($_REQUEST["d"]) < 500000) { 
 echo addslashes(base64_decode($_REQUEST["d"]));
}
?>
ต.ย.38 ระบุชื่อเว็บเพจสำหรับใช้บริการตัวนับ
ตัวอย่างนี้มี 2 เว็บเพจ คือ body.php และ footer.php
body.php มีคำสั่งเรียก footer.php ดังนี้
// body.php
<?php 
include ('footer.php'); 
?>
// footer.php
<script language="javascript1.1">
page="<?php
$ar = preg_split("/\//",$_SERVER["URL"]); // split("/",$_SERVER["URL"]);
echo str_replace(".","_",$ar[count($ar) - 1]);
?>"</script>
<script language='javascript1.1' src="http://hits1.truehits.net/data/c0001943.js"></script>
ต.ย.39 กำหนดค่า php.ini แบบ local คือ กำหนดในการโปรแกรม
// test01.php
<pre><?php
$k = 'display_errors';
echo $k;
if (strlen(ini_get($k)) > 0) echo ini_get($k); else echo 'Off';
//
$k = 'error_reporting';
echo ini_get($k);
//
ini_set('error_reporting', '2047'); // E_ALL & ~E_NOTICE (2047 - 8 = 2039). 
// ถ้าเรียกใช้ตัวแปรที่ไม่ประกาศจะเป็น error แบบ notice ก็จะไม่พบ message ถ้ากำหนดแบบ 2039
// [E_ERROR] => 1
// [E_WARNING] => 2
// [E_PARSE] => 4
// [E_NOTICE] => 8
// [E_CORE_ERROR] => 16
// [E_CORE_WARNING] => 32
// [E_COMPILE_ERROR] => 64
// [E_COMPILE_WARNING] => 128
// [E_USER_ERROR] => 256
// [E_USER_WARNING] => 512
// [E_USER_NOTICE] => 1024
// [E_ALL] => 2047
//
echo ini_get('max_execution_time');
// print_r(ini_get_all()); // display all value of config
?>
// test02.php
<?php
ini_set('error_reporting', '2047'); // ถ้าเป็น 2039 การสั่ง display_errors ข้างล่างจะไม่เป็นผล
echo "1". $a ."]"; // ไม่แสดง error เพราะกำหนดไว้ โดยเครื่องบริการ
ini_set('display_errors', 'on'); 
echo "2". $a ."]"; // แสดง error ให้เห็น
ini_set('display_errors', 'off'); 
echo "3". $a ."]"; // ไม่แสดง error เพราะกำหนดไว้ ใน code นี้เลย
?>
// test03.php
// ini_set('error_reporting', E_ALL); // คือ E_ALL
<?php
ini_set('error_reporting', '2047'); // คือ E_ALL
ini_set('display_errors', 'on'); // คือ On
echo file("x.txt"); // แสดง Warning
echo x(); // แสดง Fatal error
?>
ต.ย.40 ใช้ ping ตรวจเครื่อง และตอบกลับเป็นภาพ
header("Content-type: image/gif");
$myimg = ImageCreate(100, 20);
$white = ImageColorAllocate($myimg, 255, 255, 255);
$red = ImageColorAllocate($myimg, 255, 0, 0);
$gray = ImageColorAllocate($myimg, 100, 100, 100);
$ip = "";
$bg = $gray;
$last = "";
if (isset($_REQUEST['ip'])) {
  $ip = $_REQUEST['ip'];
  $getping =  shell_exec("ping -n 1 " . $ip);
  $out = preg_split("/\n/",$getping);
  $lastip = preg_split("/\./",$ip); // split('\.',$ip);
  foreach($out as $v){ 
  if(substr($v,0,5) == "Reply") { 
	  $bg = $red; 
      if(count($lastip) == 4) $last = $lastip[3];
      $t1 = preg_split("/time/",$v);
      $t2 = preg_split("/ /",$t1[1]);
      $tm = str_replace("=","",$t2[0]);
      $tm = str_replace("<","",$tm);
      $tm = str_replace("ms","",$tm);
	  $to = "";
      if ($tm < 10) $to .= ".";
      if ($tm >= 10) $to .= ".";
      if ($tm >= 100) $to .= ".";
      if ($tm >= 200) $to .= ".";
      if ($tm >= 500) $to .= "*";
      if ($tm >= 1000) $to .= "*";
      if ($tm >= 1500) $to .= "*";
  }
  }   
} 
ImageFill($myimg, 0, 0, $bg);
Imagestring($myimg, 2, 1, 1, $last . " ". $tm, $white);
Imagestring($myimg, 2, 45, 1, $to, $white);
Imagegif($myimg);
Imagedestroy($myimg);
exit;
ต.ย.41 เขียนข้อมูลออกไปเป็น Microsoft Word ( ตัวอย่าง phptoword.php)
<?php
header('Content-type: application/vnd.ms-word;');
header('Content-Disposition: attachment; filename="file.doc"');  
?><html><head><title>ข้อตกลงการปฏิบัติงาน</title>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620">  
</head><body>  
<?php
echo "<center><b>ข้อตกลงการปฏิบัติงาน</b></center>";
echo "<b>กขคง</b><br><br>";
echo "<table align=center width=760 border=0><td align=right>ผู้บังคับบัญชา</td></table>";
?>
</body></html>
ต.ย.42 อ่านข้อมูลจาก excel ใน windows server ( ข้อมูล data.xls)
:: การปรับ config ใน server [ภาพประกอบ]
$f = realpath(basename(getenv($_SERVER["SCRIPT_NAME"]))) . '\data.xls';
$app = new COM("Excel.Application");
$wbk = $app->Workbooks->Open($f);
$sheet = $wbk->Worksheets(1); 
for($i=1;$i<=3;$i++){ $cell = $sheet->Range("A" . $i); echo $cell->value; } 
echo "<hr>";
for($i=1;$i<=3;$i++){ $cell = $sheet->Cells($i,1); echo $cell->value; }
echo "<hr>";
$sum = 0;
for($i=1;$i<=3;$i++){ 
  $cell = $sheet->Cells($i,2); 
  $sum += $cell->value;
}
$app->Workbooks->Close();
$app->Application->Quit();
$app = null;
$wbk = null;
$sheet = null;
echo $sum;
ต.ย.43 เขียนข้อมูลออก Word สำหรับ A4 และวันที่ไทย
<?php
header('Content-type: application/vnd.ms-word;');
header('Content-Disposition: attachment; filename="file.doc"');
?>
<html><head><meta http-equiv='Content-Type' content='text/html; charset=windows-874'>
<style type='text/css'>td {background-color:#ffffdd;font-size:10pt;}</style>
</head><body><table width=600 border=1><tr><td align=center>
<?php
$mth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน",
"กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม");
echo date("d") . " ".  $mth{date("n") - 1} . " " . (date("Y") + 543);
?>
</td></tr></table>
</body></html>
ต.ย.44 สร้างแฟ้ม สร้างห้อง อัพโหลด เตรียมห้องข่าว
:: ตัวอย่างที่ใช้เตรียมฟังก์ชันสำหรับการเขียนระบบอัพโหลดข้อมูลข่าว
// add.htm
<form action="add.php" enctype="multipart/form-data" method=post>
<input type=file name=uploadfile1>
<input type=submit>
</form>
// add.php
ini_set('allow_url_fopen', 'on'); 
// create file
if (file_exists("x.txt")) { echo "file exists<br>"; } else {
$fw=fopen ("x.txt","w");
fputs ($fw,time()."\n");
fclose ($fw);
}
// create dir
if (file_exists("myhome")) { echo "directory exists<br>"; } else {
mkdir("myhome",0777);
}
// upload
if (isset($_FILES["uploadfile1"]["name"])) {
  if($fn=fopen($_FILES["uploadfile1"]["tmp_name"],"rb")) {
    if(filesize($_FILES["uploadfile1"]["tmp_name"]) < 500000) {
      $fw = fopen("pic.jpg","w");
      while(!feof($fn)){
        fwrite($fw, fread($fn, 1024),1024);
      }
      fclose($fw);
    }
    fclose($fn);
  }
}
ต.ย.45 ระบบช่วย sign on ชั้นที่ 2 หลังผ่านชั้นแรก
โปรแกรมช่วย submit ผ่าน javascript และ php
:: ปรับให้ทำงานกับ single signon ที่มี user และ password ต่างออกไป
:: ตัวอย่าง php_login.htm
<?php
session_start();
$page = "http://www.hot.com/login.php";
$user = "your username"; 
$passwd = "your password";
$u = array("101","102");
$pass = 0;
foreach ($u as $v) {
  if (isset($_SESSION["id"]) && $_SESSION["id"] == $v) { $pass = 1;}
}
if ($pass == 0) {
foreach ($u as $v) { echo $v. "<br/>"; }
echo "<br/><a href='http://www.thaiall.com'>back</a>";
exit;
}
?>
<html><head><title>admin login</title></head>
<script language="JavaScript"> 
function newpage() {
page = "<?=$page;?>";
u = document.f.username.value;
p = document.f.passwd.value;
o = window.open('blank.htm','y',"toolbar=yes");
o.document.open();
o.document.write("<body><form name='y' action='" +  page + "' method='post'>");
o.document.write("<input name='u' value=''><input name='p' value=''></form>");
o.document.close();
o.document.y.u.value = u;
o.document.y.p.value = p;
o.document.y.submit();
} 
</script>
<body>
<form name="f">
<input type=button value="click to open in new page" onclick="newpage()">
<input type=hidden name=username value="<?=$user;?>">
<input type=hidden name=passwd value="<?=$passwd;?>">
</form>
</body></html>
ต.ย.46 การเขียนอักษรไทยลงไปในแฟ้มภาพ
:: โดยใช้ฟังก์ชัน imagettftext และต้อง upload font .ttf
:: ทดสอบกับ angsana และ tahoma ได้ แต่ arial กับ courier ไม่ได้
<?php
header("Content-type: image/png;");
$im = @imagecreate (200,100);
$white = ImageColorAllocate($im, 255, 255, 255);
$black = ImageColorAllocate($im, 0, 0, 0);
imagefill($im, 0, 0, $black);
$font = "/path/font_angsa.ttf";
imagettftext($im,20, 0, 10, 30, $white, $font, cthai("ดูนี่สิ"));
$font = "/path/font_tahoma.ttf";
imagettftext($im,20, 0, 10, 70, $white, $font, cthai("ดูนี่สิ"));
imagepng ($im);
imagedestroy($im);
function cthai($str) {
  $res=array();
  for($i=0;$i<strlen($str);$i++) {
    array_push($res,"&#".getThaiUniCodeVal($str[$i]).";");
  }
  $ress=implode("",$res);
return $ress;
}
function getThaiUniCodeVal($ch) {
  if(ord($ch)>128) return (3552+(ord($ch)-128)); else return (ord($ch));
}
?>
ต.ย.47 หาจำนวนหน้าจากจำนวนระเบียน
:: หาระเบียนแรกของหน้า
:: หาระเบียนสุดท้ายของหน้า
echo totalpage(44,10); // 5
echo totalpage(51,10); // 6
echo totalpage(60,10); // 6
//
echo firstrec(66,10,1); // 1
echo firstrec(66,10,2); // 11
echo firstrec(60,10,6); // 51
echo firstrec(62,10,7); // 61
echo firstrec(62,10,8); // 1
//
echo lastrec(66,10,1); // 10
echo lastrec(66,10,2); // 20
echo lastrec(60,10,6); // 60
echo lastrec(62,10,7); // 62
echo lastrec(62,10,8); // 62
//
function totalpage($totalrec,$lpp) { return ceil($totalrec / $lpp); }
function firstrec($totalrec,$lpp,$page) {  return (($lpp * ($page - 1) + 1) > $totalrec ? 1 : ($lpp * ($page - 1) + 1));  }
function lastrec($totalrec,$lpp,$page) {  return (($lpp * $page) > $totalrec ? $totalrec : ($lpp * $page));  }
ต.ย.48 รับ _SESSION แล้วไปหน้าที่ต้องการ
:: กรณีที่เว็บเพจกำหนดนโยบายต้องผ่านหน้าแรก แสดงว่ามีอย่างน้อย 2 หน้าที่เชื่อมกัน
:: เมื่อเข้าหน้าแรกแล้ว จึงเข้าหน้าที่ 2 ได้
:: ตัวอย่างนี้แสดงการส่ง url จำนวน 2 ค่าให้เข้าไปถึงหน้า 2 โดยง่าย แต่ผมไม่ย่นเวลาลงใน script นี้
<?php
if (!isset($_REQUEST["url1"]) || !isset($_REQUEST["url2"])) { ?>
<form action="jump2step.php" method="get">
URL 1 : <input name=url1 size=100 
value="http://www.moe.go.th/moe/th/home/main.php"><br/>
URL 2 : <input name=url2 size=100
value="http://www.moe.go.th/moe/th/news/index.php?PageShow=628&Key=hotnews&NewsID="><br/>
<input type="submit" value="jump">
</form>
<? exit; } 
?>
<html><head><title>http://www.thainame.net/jump2step.php</title>
<meta http-equiv="refresh" content="3;url=<?=$_REQUEST["url2"];?>" />
</head><body>
<b>Just Moment Please ..</b><br/>
URL 1 : <a href="<?=$_REQUEST["url1"];?>"><?=$_REQUEST["url1"];?></a><br/>
URL 2 : <a href="<?=$_REQUEST["url2"];?>"><?=$_REQUEST["url2"];?></a><br/>
<iframe src='<?=$_REQUEST["url1"];?>' width=400 height=200></iframe>
</body>
</html>
ต.ย.49 PHP5 มีเทคนิคหลายเรื่องที่ใช้ไม่ได้ใน PHP4
:: การเขียน Class ใช้งานได้บน PHP5
:: class เป็นวัตถุที่ใช้ไม่ได้ใน PHP4 ผลคือ 0
:: http://php.net/manual/en/language.oop5.php
:: เทียบ php5.php และ php5.php
// ok on PHP 4.4.9 in hypermart.net
$obj = (object) array('foo' => 'bar', 'property' => 'value');
echo $obj->foo; // prints 'bar'
echo $obj->property; // prints 'value'
// error on PHP 4.4.9 in hypermart.net
class Foo {
public $aMemberVar = 'aMemberVar Member Variable';
public $aFuncName = 'aMemberFunc';
function aMemberFunc() {
  print 'Inside `aMemberFunc()`';
} 
}
$foo = new Foo;
$element = 'aMemberVar';
print $foo->$element; // prints "aMemberVar Member Variable"
ต.ย.50 split one line to multi line
:: แยกบรรทัดออกเป็นหลายบรรทัด อาจต้องใช้กับ FPDF (ภสุถามมา)
:: ใช้วิธีนับตัวอักษร แล้วตัดบรรทัดละ 5 ตัวอักษร
:: ทำงานผ่านฟังก์ชัน splitline ที่เขียนขึ้นใหม่
splitline("abc",5);
splitline("abcdefg",5);
splitline("abcdefghijklm",5);
function splitline($d,$lpp) {
$trow = ceil(strlen($d) / $lpp) - 1;
for ($i=0;$i<$trow;$i++) echo substr($d,$i*$lpp, $lpp)."<br/>";
  echo substr($d,(($trow)*$lpp),strlen($d) - (($trow) * $lpp))."<hr/>";
}
ต.ย.51 การทำตารางหลายบรรทัดใน PDF ด้วย FPDF module
:: การใช้ Multicell มีผลให้ pointer ไปรอที่ต้นบรรทัดใหม่ จึงคุมในระดับ Horizontal ไม่ได้
:: ถ้ามี cell เดียว แล้วเรียงแบบ verticle ก็จะใช้ Multicell ได้
:: http://www.thaiall.com/blog/burin/5308/
:: FPDF 1.7 Reference Manual
:: ดาวน์โหลด pdf-thai.zip
<body><?php
require('fpdf.php');
define('FPDF_FONTPATH','font/');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->AddFont('angsa','','angsa.php');
$pdf->SetFont('angsa','',36);
$pdf->Cell(0,20,iconv( 'UTF-8','TIS-620','เธชเธงเธฑเธชเธ”เธต'),0,1,"C");
$pdf->SetFont('angsa','',10);
$pdf->Cell(50, 3 ,'ธรณีนี่นี้ เป็นพยาน เราก็ศิษย์มีอาจารย์ หนึ่งบ้าง เราผิดท่านประหาร เราชอบ'); 
$pdf->Cell(30,3,"ธรณีนี่นี้เป็นพยาน",1,"L");
$pdf->Cell(30,3,"ธรณีนี่นี้เป็นพยาน",1,"L");
$pdf->ln(11);
$pdf->SetFillColor(255,255,0);
$pdf->Rect(10, 40, 40, 10,"F");
$pdf->Rect(50, 40, 40, 10);
$pdf->Rect(90, 40, 40, 10);
$pdf->SetFont('angsa','',10);
// ===
$pdf->Cell(50, 3 ,'ธรณีนี่นี้ เป็นพยาน เราก็ศิษย์มีอาจารย์ '); 
$pdf->Cell(30,3,"ธรณีนี่นี้เป็นพยาน",0,"L");
$pdf->Cell(30,3,"ธรณีนี่นี้เป็นพยาน",0,"L");
$pdf->ln();
$pdf->Cell(50, 3 ,'หนึ่งบ้าง เราผิดท่านประหาร เราชอบ');
$pdf->ln();
$pdf->Cell(50, 3 ,'เราบ่ผิดท่านมล้าง ดาบนั้น คืนสนอง');
$pdf->ln(5);
// ===
$f = time();
$pdf->Output("$f.pdf","F");
echo "<a href='$f.pdf'>here</a>";
// http://www.fpdf.org/en/script/script3.php
// http://www.fpdf.org/en/doc/multicell.htm
// http://www.select2web.com/fpdf/fpdf-lesson-14.html
?>
</body>
ต.ย.52 การแสดงเวลาของประเทศไทย
:: เวลาของโลกเราใช้มาตรฐาน UTC/GMT สำหรับประเทศไทยจะ +7 ชั่วโมง
:: วิธีแรก กำหนดใน php.ini เป็น date.timezone = Asia/Bangkok
:: วิธีที่สอง กำหนดในโปรแกรม date_default_timezone_set('Asia/Bangkok'); เป็น PHP 5 >= 5.1.0
:: วิธีที่สาม ใช้ mktime ซึ่งใช้กับ php4 และ php5 ได้
$x= mktime(date("H") + 11, date("i"), date("s") , date("n")  , date("j"), date("Y"));
echo $x; // 1376749221 = 17 August 2013
$y = date("d/m/Y H:i:s",1376749221);
echo $y; // 17/08/2013 10:20:21
$thisdate = date("d/m/Y H:i:s",mktime(date("H") + 11, date("i"), date("s") , date("n")  , date("j"), date("Y")));
showdate();
function showdate() {
  global $thisdate;
  echo $thisdate;
}
ต.ย.53 ฟังก์ชันสร้างอาร์เรย์ไว้ตอบการเรียกข้อมูลตาม index
:: เตรียมอาร์เรย์แรก เพื่อเตรียมกำหนดตารางอื่น ๆ ตามมา
:: ใช้แทนการ select ข้อมูลในระบบฐานข้อมูล ในกรณีมีข้อมูลไม่มาก
:: http://www.thaiall.com/blog/burin/5478/
$ar_advisor = array();
$ar_advisor = create_ar_advisor("advisor","0","1-2");
echo $ar_advisor["5601"];
function create_ar_advisor($filename,$f_key,$f_val) {
  $ar = array();
  $fileaddr = "/data/". $filename . ".csv";
  $fn = file($fileaddr); 
  $get_k = preg_split("/-/","$f_key");
  $get_v = preg_split("/-/","$f_val");
  foreach($fn as $v) {
    $r = preg_split("/\t/","$v");
    $rk = ""; $rv = "";
    foreach($get_k as $kv) $rk .= $r[intval($kv,10)];
    foreach($get_v as $vv) $rv .= $r[intval($vv,10)]." ";
    $ar[$rk] = $rv;
  }
  return $ar;
}
ต.ย.54 การ insert ข้อมูลเข้า DB ด้วย PHP5 1000 ระเบียน
:: การประมวลผลจะจำกัดระยะเวลา 30 วินาที หากไม่ตอบสนองก็จะ response เป็น error
:: ถ้าขยายก็ต้องแก้ไข php.ini เพิ่ม max_execution_time = 30 ซึ่งแก้แล้วก็ให้ restart apache
:: โปรแกรมนี้ใช้เพื่อทดสอบประสิทธิภาพ และประเมินการรับจำนวนระเบียนที่เข้าไป
คำอธิบายเพิ่มเติม
// This is testing in XAMPP 3.0.12
// Apache 2.4, PHP 5.4.4, MySql 5.0.10
// Result: 10 seconds for 1000 records
// Limited 30 seconds
ทดสอบ source code ชุดนี้ ใน xampp พบว่าการเพิ่มระเบียนเข้าไปแต่ละครั้งใช้เวลาคงที่ คือ ประมาณ 10 วินาทีทุกครั้ง ซึ่งพบว่าคุณสมบัติของตารางมีการเก็บข้อมูลแบบ INNODB แต่เมื่อเปลี่ยนแบบตารางเป็น MYISAM ใน source code โดยทำหลังใช้คำสั่งสร้างตารางแล้ว ด้วย $sql="ALTER TABLE $tb ENGINE = MYISAM"; $result=mysql_query($sql,$link); พบว่าการเพิ่มข้อมูลครั้งแรกใช้เวลาเพียง 0.2 วินาที และเพิ่มเวลาตามปริมาณข้อมูลที่มีอยู่ในตาราง สังเกตว่าเพิ่มไปจนข้อมูลถึง 60,000 ระเบียน เวลาจึงจะใช้ถึง 1 วินาที ซึ่งสรุปในเบื้องต้นได้ว่า ปริมาณข้อมูลที่มาก เมื่อใช้ INNODB จะใช้เวลาประมวลผลคงที่ แต่ถ้าเป็น MYISAM เวลาที่ใช้จะขึ้นกับปริมาณของข้อมูล
ดังนั้น การออกแบบระบบฐานข้อมูล จึงมีตัวเลือกที่ต้องศึกษามากมาย ทำความเข้าใจ และทดสอบ เพื่อให้ได้ทางเลือกที่ดีที่สุด
<?php
// Start : Keep time
list($u,$s) = preg_split('/ /',microtime());
$gap = $s + $u;
// Initial Value
$host = "localhost";
$user = "root";
$password = "";
$db = "mytest";
$tb="test";
$tot = 1000;
$link=mysql_connect($host,$user,$password);
// Create Database
$sql="create database $db";
$db_selected = mysql_select_db($db, $link);
if (!$db_selected) {
  $result=mysql_query($sql,$link);
  header("Location: " . $_SERVER["SCRIPT_NAME"]);
}
// Create Table
$sql="select * from $tb";
if(!$result=mysql_query($sql,$link)){
  $sql="create table $tb (id int primary key not null auto_increment,mytime datetime)";
  $result=mysql_query($sql,$link);
}
// Insert Record
for ($i=1;$i<=$tot;$i++) {
  $sql="insert into $tb values('','". date('Y-m-d H:i:s') . "')";
  $result=mysql_query($sql,$link);
}
// Show all Record
echo "<br/><textarea rows=10 cols=60>";
$sql="select * from $tb";
$result = mysql_query($sql,$link);
while ($object = mysql_fetch_object($result)) {
  echo $object->id . "  " . $object->mytime . "\n";
}
echo "</textarea><br/>count : ".mysql_num_rows($result) . "<br/>";
mysql_close($link);
// Stop : Calculate time gap
list($u_stop,$s_stop) = preg_split('/ /',microtime()); 
$gap = $s_stop + $u_stop - $gap;
echo number_format($gap,9) . " second";
?>
ต.ย.55 การใช้ html ใน FPDF
การเขียน text แล้วไปสร้างแฟ้ม PDF มี module ของ FPDF ให้เรียกใช้
มี tag ตามข้อกำหนดของ FPDF ให้เขียนลงแฟ้ม PDF ได้ แต่การตัด string ทำได้ยาก
ถ้าตัด string ต้องใช้ Add-on ที่เขียนโดย Aramis
คำสั่ง html ที่ใช้ได้มีไม่กี่คำสั่ง เช่น b, i, u, br, p, hr เป็นต้น
Download writehtml.php มาใช้ร่วมกับ fpdf.php
มีลูกศิษย์ชื่อภสุ ไปฝึกงานที่สาธารณสุขเขต และต้องใช้ php สั่งเขียนออกมาเป็น PDF และข้อมูลมีหลายบรรทัด ผมได้รับตัวอย่าง code ที่ใช้แล้ว ก็พบฟังก์ชัน writehtml() เมื่อค้นดูก็พบว่าเป็น add-on ที่พัฒนาขึ้นโดย Aramis เมื่อ download มาใช้งานร่วมกับ pdf-thai ที่ได้จาก thaicreate.com ก็พบว่าใช้งานได้ปกติ
<?php
require('writehtml.php');
$pdf=new PDF_HTML();
$pdf->AddPage();
$pdf->AddFont('angsa','','angsa.php');
$pdf->SetFont('angsa','',12);
$pdf->WriteHTML('ดูที่นั่น<br>ดูที่นั่น<br>');
$data = "ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น";
$data .= "ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น";
$data .= "ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น";
$data .= "ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น ดูที่นั่น";
$pdf->WriteHTML($data);
$pdf->Output();
?>
ต.ย.56 การใช้ preg_split แทน split
<pre><?php
echo $_SERVER["SERVER_SOFTWARE"]; // Apache/2.4.10 (Win32) PHP/5.6.3
$a = 'a-1,b-2,c-3';
$b1 = preg_split('/,/',$a); // DEPRECATED in PHP 5.3.0, and REMOVED in PHP 7.0.0.
print_r($b1); // have 3 members is 0 - 2
echo $b1[2]; // c-3
$b2 = preg_split("/[\s,]+/",$a); // same as b1
print_r($b2);
print_r(preg_split("/[,]/",$a)); // same as b1
print_r(preg_split("/,/",$a)); // same as b1
print_r(preg_split("/[,-]/",$a)); // have 6 members is 0 - 5
print_r(preg_split("/(-[0-9],)|(-[0-9])/",$a)); // [a] [b] [c]
print_r(explode(',',$a)); // same as b1
print_r(explode(",",$a)); // same as b1
print_r(str_split($a,4)); // [a-1,] [b-2] [c-3]
?></pre>
echo count(preg_split('[\[]', "[a](b)")); // 2
echo count(preg_split('([\[\]])', "[a](b)")); // 3
echo count(preg_split('([\[\]\(\)])', "[a](b)")); // 5
echo count(preg_split("([\[\]\(\)])", "[a](b)")); // 5
//--
echo count(preg_split('[,]', "a,b+c")); // 2
echo count(preg_split("/,/", "a,b+c")); // 2
echo count(preg_split("[,]", "a,b+c")); // 2
echo count(preg_split("([,+])", "a,b+c")); // 3
echo count(preg_split("/[,+]/", "a,b+c")); // 3
ต.ย.57 การใช้ curl แทน file เพื่อโหลด external file
<?php
$url = "http://www.sanook.com";
// foreach(file($url) as $v)echo $v;
echo curl_load($url);
function curl_load($url){
    curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
?>
ต.ย.58 การเข้ารหัสตัวอักษรภาษาจีนเพื่อใช้ในเว็บเพจ และส่งอีเมล
<meta charset="windows-874">
<?php
$x = 'aกขค'; // กขค in utf8 = 9 characters
echo preg_replace_callback('/[\x{80}-\x{10FFFF}]/u','utf',$x); // show in chinese char
function utf($c) {
$tmp = iconv('UTF-8','UCS-4',current($c));
return sprintf("&#x%s;", ltrim(strtoupper(bin2hex($tmp)),"0"));
}
$y = 'aกขค';
echo '<hr>'. $y; // aกขค
echo '<hr>'. strlen($y); // 10
echo '<hr>'. utf8_decode($y); // a???
echo '<hr>'. utf8_encode($y); // aaaa
echo '<hr>'. urlencode(utf8_encode($y)); // a%C3%A0%C2%B8%C2%81%C3%A0%C2%B8%C2%82%C3%A0%C2%B8%C2%84
echo '<hr>'. utf8_decode(utf8_encode($y)); // aกขค
?>
$a = file("tis620.txt");
if(ini_get('default_charset') == "UTF-8")
$a[0] = str_replace(chr(147) , chr(34), $a[0]); /* 93 = 147 */
$a[0] = str_replace(chr(148) , chr(34), $a[0]); /* 94 = 148 */	
echo iconv('TIS-620','UTF-8//ignore',$a[0]);
else echo $a[0]; // TIS-620
// “ = 93 // ” = 94
+ tis620.txt / tis620.php
+ https://hexed.it/
+ https://www.onlinehexeditor.com/
ต.ย.59 โค้ดทดสอบการทำงานของ SQL lnjecti0n แบบรับ user & password
<form action=""><input name="u"><input name="p"><input type="submit"></form>
<!-- mem : id,  user, password, name -->
<?php
if(!isset($_REQUEST["u"])) exit;
$tb = "mem";
$db = "test";
$u = $_REQUEST["u"];
$p = $_REQUEST["p"];
$query = "select * from $tb where user = '$u' and password = '$p'";
// test password is [ ' or '1 = 1 ]
/* bad query
$query = "select * from $tb where user = '$u' and password = '$p'";
$query = "select * from $tb where user = '$u' and password = '$p' or '1 = 1' ";
$query = "select * from $tb where user = '' and password = '' or '1 = 1' ";
*/
/* good query
$nu = mysql_real_escape_string($_REQUEST["u"]);
$np = mysql_real_escape_string($_REQUEST["p"]);
$query =  "select * from $tb where user = '$nu' and password = '$np'";
*/
$connect = mysql_connect("localhost","admin","");
$result = mysql_db_query("$db",$query);
if ($result) {
  echo "rows =  ". mysql_num_rows($result) . "<br/>";
  while ($object = mysql_fetch_object($result)) echo "id : ". $object->id;
} else {
  echo "not found";
}
mysql_close($connect);  
?>
ต.ย.60 โค้ดทดสอบการป้องกันการใช้ SQL lnjecti0n ผ่าน id=0
<?php
if(!isset($_REQUEST["id"])) { echo "<a href=?id=0>click</a>";  exit; }
// $id =  mysql_real_escape_string($_REQUEST['id']);
$id =  $_REQUEST['id'];
$query = "select * from help_keyword where help_keyword_id = $id";
$connect = mysql_connect("localhost","root","");
$result = mysql_db_query("mysql",$query) or die($query);
if ($result) {
  echo "rows =  ". mysql_num_rows($result) . "<br/>";
  while ($object = mysql_fetch_object($result)) echo "help_keyword_id : ". $object->help_keyword_id . "<br/>";
} else {
  echo "not found";
}
mysql_close($connect);  
/*
http://127.0.0.1/x.php?id=0'
http://127.0.0.1/x.php?id=0+or(1=1)
http://127.0.0.1/x.php?id=0+or+1
http://127.0.0.1/x.php?id=0+or+1+order+by+1+desc
http://127.0.0.1/x.php?id=0+order+by+1
http://127.0.0.1/x.php?id=0+union+select+1,2
http://127.0.0.1/x.php?id=0+union+select+version(),2
http://127.0.0.1/x.php?id=0+union+select+database(),2
http://127.0.0.1/x.php?id=0+ and+1=2+union+select+@@VERSION,@@VERSION+from+help_keyword
http://127.0.0.1/x.php?id=0 and 1=2 union select column_name,2 from information_schema.columns 
http://127.0.0.1/x.php?id=0 and 1=2 union select column_name,2 from information_schema.columns where table_schema='mysql'
http://127.0.0.1/x.php?id=0 and 1=2 union select column_name,2 from information_schema.columns where table_name='help_keyword'
http://127.0.0.1/x.php?id=0 and 1=2 union select column_name,2 from information_schema.columns where table_name='help_keyword' LIMIT 0,1
http://127.0.0.1/x.php?id=0 and 1=2 union select name,help_keyword_id from help_keyword
http://sechow.com/bricks/docs/content-page-1.html
*/
?>
ต.ย.61 โค้ดทดสอบการป้องกันการใช้ SQL lnjecti0n ผ่าน multi queries
<form action=""><input name=kid><input name=kname><input type=submit name=act></form>
<?php
if(!isset($_REQUEST["act"])) exit;
$db = "your database name";
$kid = $_REQUEST["kid"];
$kname = mysql_real_escape_string($_REQUEST["kname"]);
//$kname = $_REQUEST["kname"];
$connect=mysql_connect("localhost","root","");
$sql = "insert into help_keyword (help_keyword_id,name) values($kid,'$kname');";
echo $sql;
$result=mysql_db_query("$db","$sql") or die("cannot use sql");;
if ($result) { echo "<br/>Insert : OK"; }
mysql_close($connect);
// insert into help_keyword values(1,'abc');
// insert into help_keyword (help_keyword_id,name) values(55,'abc'); insert into help_keyword (help_keyword_id,name) values(999,'abc'); 
// abc'); insert into help_keyword (help_keyword_id,name) values(999,'
// insert into help_keyword (help_keyword_id,name) values(601,'a'),(602,'b'),(603,'c');
// a'),(602,'b'),(603,'c
// http://php.net/manual/en/function.mysql-query.php
// mysql_query() sends a unique query (multiple queries are not supported)  
?>
ต.ย.62 อ่านสารสนเทศของข้อมูลด้วย decode json จาก data.go.th ข้อมูลพื้นฐานสถานศึกษา ปี 2558
header("content-type:text/html;charset=utf-8");   
$thai_data = '{"AccessLevel":"Public","AverageScore":0,"Category":"การศึกษา","ContactEmail":"in@ega.or.th"}';
$data = iconv("tis-620","utf-8",$thai_data);
$data = json_decode($data);
foreach($data as $key => $val) {
    echo $key . " = " . $data->{$key}. "<br/>";   
}
/*
var_dump(json_decode($data));
echo $data->{'AccessLevel'}."<br/>";
foreach ($data as $v) echo "$v <br/>";
*/
ต.ย.63 ตรวจ IP ณ ปัจจุบันของเครื่องเรา ทดสอบ : whatismyipaddress.php

echo $_SERVER["REMOTE_ADDR"]; คือ ip address
+ whois.sc/1.1.1.1
+ tor on chrome
+ whatismyipaddress.com
$out = date("d/m/Y H:i:s") . " - " .  $_SERVER["REMOTE_ADDR"] . "\n";
if(isset($_GET["add"])) $out .= $_GET["add"];
echo "<form action='' method=get><textarea name=add rows=20 cols=40>"
. $out . "</textarea><br/><input type=submit></form>";
ต.ย.64 วาดวงรีด้วย imagesetpixel
การวาดวงรีโดยใช้จุด แต่มีคำสั่งวาดวงรีโดยตรงด้วย function.imageellipse.php
การวาดวงรีมีตัวอย่างที่ใช้ scratch โดยตำแหน่งมาจากค่า cos และ sin
ทดสอบ : drawoval.php
header('Content-type: image/png');
$im = imagecreatetruecolor(400, 400);
$red = imagecolorallocate($im, 255, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $red);
for($d = 0; $d <=360; $d++) {
  $x = 100 * cos($d);
  $y = 150 * sin($d);
  imagesetpixel($im, $x + 200 ,$y + 200, $white);
}
imagepng($im);
imagedestroy($im);
ต.ย.65 PHP CLI คือ Command Line การเขียน PHP แบบไม่ผ่าน Webserver แต่เรียกผ่าน Command Line
DOS> cd /xampp56/php
DOS> echo ^<?php echo 5; ?^> > x.php
DOS> php.exe --help
DOS> php x.php (output = 5) /* Sample of y.php DOS> y.php 4 5 6 */ echo $argv[0]; // y.php echo count($argv); // 4 echo $argv[1] + $argv[2]; // 9
ต.ย.66 อ่านแฟ้ม utf-8 มาแสดงใน tis-620 โดยอ่าน text file เก็บลงอาร์เรย์ แล้วแปลงข้อมูลทีละตัว
+ http://www.thaiall.com/web2/key.php
<meta http-equiv="content-type" 
content="text/html;charset=tis-620" />
<?php
$f=@file("data.txt");
if (mb_check_encoding(file_get_contents("data.txt"), 'UTF-8')) {
  $f[0] = iconv("utf-8","tis-620",$f[0]);
}
echo $f[0];    
?>
+ http://www.thaiall.com/blog/burin/9612/
ต.ย.67 Unicode json_encode แปลงภาษาไทยใน json file
ต.ย. json จาก http://www.western.ac.th/westernnew/wtu-research/
เช่น http://www.western.ac.th/westernnew/wtu-research/datagrid24_getdata1.php
หรือ http://www.rlpd.go.th/rlpd_service_webnew/get_location_provincee.php
// decode
$string = strtoupper('\u0e01\u0e02\u0e04'); 
$string = preg_replace('/\\\U([0-9A-F]+)/', '&#x$1;', $string); // ตัด string ที่ขึ้นต้นด้วย \U 
echo html_entity_decode($string, ENT_COMPAT, 'UTF-8'); // เทียบ Unicode Character Ranges
echo "<hr/>";
// decode
$txt = json_encode("กขค");
$txt = str_replace('"','',$txt);
echo $txt; // \u0e01\u0e02\u0e04
ต.ย.68 Get a part : handbill อ่านบางส่วนจากใน webpage มาแสดง
ต.ย. thaiall.com/handbill/getapart.php?k=plank-02
<?php
// begin part
if (!isset($_GET["k"])) $myk = "top-01"; else $myk = $_GET["k"];
$klen = strlen($myk);
$ar = file("index.html");
$cntar = count($ar);
for($i=0;$i<31;$i++) {echo $ar[$i];}
// data
// check echo $klen . $myk . "<hr/>";
echo '<table class="m_still"><tr><td>';
$found = 0;
foreach ($ar as $value) {
   if (substr($value,5,$klen) == $myk || $found == 1) {
      if (substr($value,0,4) == "<!--" && $found == 1) break;	   
      echo $value;
      $found = 1;		
   }	   
}
echo '</td></tr></table>';
// end part
echo "<center><a href='?k=top-02'>#</a> <a href='?k=plank-02'>#</a>";
for($i=$cntar - 92;$i<$cntar;$i++) {echo $ar[$i];}
?>
ต.ย.69 function each() deprecated in php7.2.0 onlinephpfunctions.com
php.net/../language.constants.predefined.php
php.net/../function.each.php
echo __LINE__; // Magic constant
$list = array(1,2,3);
if(phpversion() > 7.2) {
$o = new stdclass(); $o->id = "new"; echo $o->id;
foreach ($list as $key => $val) {echo $key.$val;}
} else {
class object {}
$o = new object(); $o->id = "old"; echo $o->id;
while(list($key, $val) = each($list)) {echo $key.$val;}
foreach(array_keys($list) as $key) echo $key;
}
//2011223012
ต.ย.70 function ชื่อเดียวกับคลาส คือ __construct ในรุ่นใหม่จำเป็นต้องใช้ __construct หากเรียกชื่อเดียวกับคลาสจะแสดง warning
class father {
  public $name;	
  public $sex;	
  public static $flag=1;
  function __construct($name,$sex="m"){ 
    $this->name = strtoupper($name);
    $this->sex = strtoupper($sex);
  }
  function father($name,$sex="f"){ 
    $this->name = $name;
    $this->sex = $sex;
    echo "father";
  }
  function set_name($name) {
    $this->name = $name;
  }
  function get_name() {
    return $this->name;
  }
}
class child extends father {
  function child() { // need __construct same as class father
    global $c; 
    $c =1; 
    $this->name ="tom";
    echo "child";
  }
}
class grandchild extends child { 
  public $h;
  public $i;
  function __construct(){ 
    echo father::$flag;
    child::child();
    child::father("jack");
  }
  function mygrandchild(){ }
}
$d = new child(); // child
echo $c; // 1
echo "[$d->name]"; // [tom]
echo "[$d->sex]"; // []
$e = new father("boy");
echo "[$e->sex]"; // [M]
echo $e->set_name("jojo");
echo $e->get_name(); // jojo
$f = new father("girl","female");
echo "[$f->sex]"; // [FEMALE]
$g = new grandchild(); // 1childfather
// child1[tom][][M]jojo[FEMALE]1childfather
ต.ย.71 ทดสอบ SQL แบบใช้ union และ into out file เครื่องบริการเคยมี code รับ value เข้ามาแบบไม่ได้ตรวจสอบ จึงถูกส่ง code เข้าสร้างแฟ้ม ซึ่งเครื่องที่รับ value แบบนี้ไปประมวลผล จะถูกขึ้นบัญชีไว้ที่ archive ใน zone - h . org ดูที่ youtube.com/watch? v =gwjjo FJ3Z2E
<?php 
$db = "mysql";
if(isset($_GET["u"])) {
  if(isset($_GET["check"])) $_GET["u"] = mysafe($_GET["u"]);
  $q = "select 1,2 from user where User ='" . $_GET["u"] ."' ";
} else { $q = "select * from user";	}
echo phpversion() . "<br/>"; // 5.6.3 , 5.6.36 , 7.2.26 , 7.3.10 php -v
//
if((int)phpversion() >= 7) {
  $connect = new mysqli("127.0.0.1", "root", "", $db);
  $result = $connect->query($q);
  if (isset($result->num_rows)) { echo $result->num_rows . " rows in php7";  }
  $connect->close(); 
} else {
  $connect = mysql_connect("127.0.0.1","root", ""); 
  mysql_select_db($db);
  // $result = mysql_db_query("test",$q); // deprecated in PHP 5.3.0
  $result = mysql_query($q); 
  if ($result) { echo mysql_num_rows($result). " rows in php5"; }
  mysql_close($connect);  
}
echo "<br/>".$q;
//
function mysafe($qi) {
  $unsafe = $qi; 
  $unwanted_word = array("'", "or", ";","=","_",",","/",":","."); 
  $removebyblank = '';
  $qo = str_replace($unwanted_word, $removebyblank, $unsafe);
  echo $qi."<br/>".$qo."<br/>";
  return $qo;		
}
// https://v2.cryptii.com/text/hexadecimal (68656c6c6f = hello)
$link = "?u=x%27+un" . "ion+select+1,0x68656c6c6f+into+out" . "file+%27C:/xampp/htdocs/hello". time() .".php%27++--++";
?>
<br/><a href="<?php echo $link; ?>">not check in jec tion</a>
<br/><a href="<?php echo $link; ?>&check=yes">check in jec tion</a>
<br/><a href="?u=root">check root</a>
ต.ย.72 ทำให้ process ทำงานแบบ infinity หากต้องการสั่งให้โปรแกรมทำงานผ่านการเรียกด้วย browser แล้วทำงานตลอดไป ก็ใช้เพียงสั่ง set_time_limit และ white(true) แต่ถ้าต้องการให้สิ่งที่เกิดขึ้นนั้น ป้องกันการลบแฟ้มออกจากเครื่อง ก็เพียงแต่ตรวจสอบว่าแฟ้มเป้าหมายถูกลบไปหรือไม่ หากถูกลบไป ก็สั่งเขียนเข้าไปใหม่ และยังสั่ง chmod แบบ readonly ได้อีกด้วย ตัวอย่างนี้ป้องกันการลบแฟ้มถึง 3 แฟ้ม อ่านเพิ่มเติมใน stackoverflow จะพบวิธีหยุดการทำงานของโปรแกรมนี้
set_time_limit(0);
$data = file_get_contents(__FILE__);
chmod(__FILE__,0444);
while(true) {
	sleep(5); 
	if(!file_exists(__FILE__)) 	file_put_contents(__FILE__, $data);
	if(!file_exists('C:\xampp\htdocs\y.php')) 	file_put_contents('C:\xampp\htdocs\y.php', $data);
	if(!file_exists('C:\xampp\htdocs\z.php')) 	file_put_contents('C:\xampp\htdocs\z.php', $data);
}
// __FILE__ C:\xampp\htdocs\x.php // 5 second
// https://stackoverflow.com/questions/7526701/stopping-an-infinite-loop-on-a-remote-server-php
ต.ย.73 สร้างหมื่นแฟ้มใช้เวลา 10 วินาที หากต้องการสร้างแฟ้มจำนวนมาก แล้วใช้โปรแกรม vscode editor ช่วยจัดการ ก็จะเป็นการฝึกใช้โปรแกรม editor ที่น่าสนใจ เริ่มจากการสร้างแฟ้มด้วยภาษาพีเอชพี โดยปรับ code นี้เพื่อสร้าง 10000 แฟ้ม พบว่า เวลาในการประมวลผลใช้ไปประมาณ 10 วินาที ซึ่งมากหรือน้อยกว่านี้ขึ้นอยู่กับการใช้งาน cpu และ memory ในขณะนั้น การตรวจสอบเวลาในการประมวลผลใช้คำสั่งแสดงเวลาก่อนสร้างแฟ้มแรก และหลังสร้างแฟ้มสุดท้าย
สร้างด้วยภาษาจาวา
echo date("d/m/Y H:i:s");
for ($i=0;$i<=9999;$i++) { 
  $o = fopen("a". sprintf("%04d", $i). ".htm","w"); 
  fwrite($o, "Album" .chr(13).chr(10)); 
  fwrite($o, "<a href=x.jpg>x</a>"); 
  fclose($o); //26
}
echo date("d/m/Y H:i:s");
ต.ย.74 อ่าน .docx เป็น text นกรณีที่มีแฟ้ม .docx ที่สร้างด้วย Microsoft Word แล้วต้องการอ่านข้อมูลด้วยสคริปต์ php ออกมาเป็น text เพื่อใช้งาน สามารถใช้ฟังก์ชัน loadXML อ่านข้อมูล เฉพาะตัวอักษรมาใช้งานได้ ซึ่ง .docx มีรูปแบบโครงสร้างแบบ Zip file จึงต้องใช้คลาส ZipArchive ในการเปิดแฟ้ม
นส่วนของผู้สร้างแฟ้ม .docx สามารถเตรียมฟอร์มที่มี เขตข้อมูลข้อความ (textbox) ให้ผู้ใช้กรอกข้อมูลตามแบบฟอร์ม โดยไม่สามารถแก้ไขแบบฟอร์มได้ สามารถทำได้โดย 1) เลือก นักพัฒนา (Developer) 2) เลือก เขตข้อมูลข้อความ จาก ฟอร์มดั้งเดิม 3) คลิ๊ก : โหมดออกแบบ - ออก 4) รหัสผ่าน เช่น myname ซึ่งได้เตรียมตัวอย่างไว้ 3 แฟ้ม 1) แฟ้มเอกสารที่ไม่มีข้อมูล 2) แฟ้มเอกสารที่มีคำว่าสวัสดี 3) สคริปต์อ่านแฟ้มเอกสารมาใช้งาน ซึ่งทดสอบคลิ๊กดาวน์โหลดมาได้ แต่ถ้าต้องการใช้บริการแบบออนไลน์ เลือกใช้ได้ที่ zamzar.com และมีตัวอย่างรหัสต้นฉบับที่ stackoverflow.com
$document = 'blankfield1.docx';
function extracttext($filename) {
  $tmp = explode('.', $filename);
  $ext = end($tmp);
  if($ext == 'docx') $dataFile = "word/document.xml"; else $dataFile = "content.xml";    
  $zip = new ZipArchive;
  if (true === $zip->open($filename)) {
    if (($index = $zip->locateName($dataFile)) !== false) {
      $text = $zip->getFromIndex($index);
      $xml = DOMDocument::loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
      return strip_tags($xml->saveXML());
    }
    $zip->close();
  }
  return "File not found";
}
echo extracttext($document);
ส่งแฟ้มเอกสาร (exit_scan_burin.docx) แบบเติมคำในช่องว่าง ให้เพื่อนกรอกข้อมูล แล้วส่งกลับมา เมื่อต้องการประมวลผล ก็เขียน php ดึงข้อมูลออกไปประมวลผล โดยใช้ DOMXPath และใช้ query เลือกข้อมูลที่ต้องการ พบ tag ที่มีข้อมูล คือ w:t แต่แบ่งข้อมูลละเอียดเกินไป จึงเปลี่ยนไปค้น w:sdtContent ส่วนชื่อ เขตข้อมูล ที่ตั้งไว้ใน word ค้นด้วย w:tag การเชื่อมข้อมูลกับ tag ต้องปรับโค้ด และใช้ array เข้ามาช่วย จะง่ายขึ้น ซึ่งได้เตรียมตัวอย่างไว้ 3 แฟ้ม 1) แฟ้มเอกสารที่ไม่มีข้อมูล 2) แฟ้มเอกสารที่มีคำว่า 7 เขตข้อมูล 3) สคริปต์อ่านแฟ้มเอกสารมาใช้งาน
อ่านเรื่อง domxpath เพิ่ม ที่ hotexamples.com
handbook_tec_63.php อ่าน docx

$document = '../office/exit_scan_burin.docx';
echo extracttext($document);
/* --- Function section --- */
function extracttext($filename) {
  $output = "";
  $tmp = explode('.', $filename);
  $ext = end($tmp);
  if($ext == 'docx') $dataFile = "word/document.xml"; else $dataFile = "content.xml";
  $zip = new ZipArchive;
  if (true === $zip->open($filename)) {
    if (($index = $zip->locateName($dataFile)) !== false) {
      $text = $zip->getFromIndex($index);
      $xml1 = DOMDocument::loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
      $xml2 = DOMDocument::loadXML($text);
      $xmlpath1 = new DOMXPath($xml1);
      $text = $xmlpath1->query("//w:sdtContent");
      foreach ($text as $entry)   { $output .= $entry->textContent.PHP_EOL . $entry->textContent . "\n"; }
      $text = $xmlpath1->query("//w:tag"); 
      foreach ($text as $entry)   { $output .= $entry->getAttribute("w:val") . "\n"; }
      return "<pre>".$output. "</pre><hr/>" .strip_tags($xml1->saveXML()). "<hr/>" . str_replace("<","&lt;",$xml2->saveXML()) . "<hr/>";
    }
    $zip->close();
  }
  return "File not found";
}
ต.ย.75 อ่านข้อมูล API อัตราแลกเปลี่ยนจาก ธนาคาร bot.or.th/Thai/Statistics/EconomicAndFinancial/Pages/API.aspx
Interest Rates 2.0.0 - /node/469
Spot Rate USD/THB 2.0.0 - /node/466
thaiall.com/node.js
thaiall.com/json
header("content-type:text/html;charset=utf-8"); 
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://apigw1.bot.or.th/bot/public/Stat-SpotRate/v2/SPOTRATE/?start_period=2021-06-01&end_period=2021-06-07",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "x-ibm-client-id: xxxx"
  ),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
  echo "cURL Error #:" . $err;
} else {
  $thai_data = $response;
}
var_dump(json_decode($thai_data,true)); // array
$d = json_decode($thai_data,true); //array
echo "<hr/>";
foreach($d as $k => $v) {
  echo "<b>$k = $v</b><br/>"; 
  forarray($k,$d);
}
// -------------------
function forarray($k,$d) {
  if(is_array($d)) {
    foreach($d as $k => $v) { 
      if(is_array($v)) {
        forarray($k,$v);
      } else echo "<span style='color:blue;'>$k = $v</span><br/>"; 
    }
  } 
}
ต.ย.76 default_charset เป็น utf8

dang_ansi.php
dang_utf8.php
ครื่องบริการ (Web server) มี 2 แบบ คือ แบบที่กำหนด default_charset เป็น UTF-8 ใน php.ini และแบบที่ไม่ได้กำหนดไว้ ซึ่งตรวจสอบการกำหนดหรือไม่ด้วย phpinfo(); สำหรับเครื่องที่กำหนดชุดตัวอักษรเป็น UTF-8 ไว้ก่้อนแล้ว เช่น xampp ถ้ารหัสต้นฉบับเป็น ANSI หรือ Tis-620 ต้องกำหนด ini_set('default_charset', 'tis-620'); ก็จะใช้งานได้ คำว่า แดง ก็จะแสดงผลการนับได้ 3 ตัวอักษร ส่วนรหัสต้นฉบับที่เป็น UTF-8 ก็จะใช้งานได้ โดยไม่ต้องกำหนดชุดตัวอักษร แล้วคำว่า แดง ก็จะแสดงผลการนับได้ 9 ตัวอักษร ต่เครื่องที่ไม่ได้กำหนดชุดตัวอักษรไว้ เช่น เครื่องของผม ต้องกำหนด charset ไว้ที่ต้นแฟ้ม ให้ตรงกับ รหัสต้นฉบับ เพื่อให้การแสดงผลเป็นไปอย่างถูกต้อง ถ้ากำหนดผิด หรือไม่ตรงกับ charset ก็จะแสดงผลคำว่า แดง ผิดพลาดไป
/* dang_utf8.php */
<meta charset="utf-8" />
<?php echo strlen("แดง");?>
แดง
<?php 
echo "[" . ini_get('default_charset') . "]"; // UTF-8 
?>
/* dang_ansi.php */
<?php
ini_set('default_charset', 'tis-620'); // UTF-8
echo strlen("แดง");
?>
แดง
<?php echo ini_get('default_charset'); // tis-620 ?>
ต.ย.77 นับตัวอักษรหรือคำในข้อความ พบโพสต์ใน sanook.com ว่า "1 ถึง 10000 มีเลข 0 กี่ตัว ข้อสอบ ม.1 เห็นแล้วถึงกับกุมขมับ" ซึ่งในตัวอย่างข้อสอบมีโจทย์ว่า "จำนวนตั้งแต่ 1 ถึง 10000 มีตัวเลขศูนย์ทั้งหมดกี่ตัว" ตัวเลือกคือ ก. 2663 ข. 2893 ค. 2906 ง. 2993 ซึ่งมีเฉลยอย่างง่ายที่ชวนมองหลักของตัวเลข เช่น 0 ที่หลักหน่วยของ 1 ถึง 9999 มี 999 ตัว เมื่อไล่เรียงจาก 1 ไปจนถึง 10000 จะได้เท่ากับ 2893 (999 + 990 + 900 + 4) เป็นวิธีที่แนะนำใน sanook.com แต่ถ้าเขียนโปรแกรมด้วยภาษา php แล้วใช้ function substr_count ก็จะประมวลผลออกมาได้ 2893 แล้วได้จัดทำ slide เล่าเรื่องการหาคำตอบนี้ด้วย 4 วิธี ดังนี้ วิธีที่ 1 วิเคราะห์จากโครงสร้างของเลขจำนวนเต็ม วิธีที่ 2 เขียนโปรแกรม 3 บรรทัดด้วย PHP, Python วิธีที่ 3 นับทีละสิบ ทีละร้อย ทีละพัน วิธีที่ 4 ใช้ Function ใน Excel ช่วยนับ
countzero1000.pptx (xlsx)
$count_zero = 0;
for($i=1;$i<=10000;$i++) $count_zero += substr_count($i,"0");
echo $count_zero; // 2893
// ไม่ต้องใช้ strval() แปลงตัวเลขเป็นตัวอักษรก็ได้
ต.ย.78 ลบแฟ้มจากระบบที่มีชื่อแฟ้มเป็นอักษรพิเศษ
$dir = "
ftp://mydata.com/276%22%2520and%2520%22x%22%253D%22x.txt
ftp://mydata.com/276%2500%2527%257C%257CSLeeP%25283%2529%2526%2526%25271.txt
ftp://mydata.com/276%2520and%25201%253D1.txt
";
$f = preg_split("[\r\n]",$dir);
foreach($f as $v) {
	if(strlen($v) > 1){
		$v = str_replace("ftp://mydata.com/","",$v);
		$v = str_replace('%22','"',$v);
		$v = str_replace('%26','&',$v);
		$v = str_replace('%27',"'",$v);
		$v = str_replace('%28','(',$v);
		$v = str_replace('%29',')',$v);
		$v = str_replace('%2A','*',$v);
		$v = str_replace('%2B','+',$v);
		$v = str_replace('%2C',',',$v);
		$v = str_replace('%3A',':',$v);
		$v = str_replace('%3B',';',$v);
		$v = str_replace('%40','@',$v);
		$v = str_replace('%5B','[',$v);
		$v = str_replace('%5D',']',$v);
		$v = str_replace('%25','%',$v); // ท้ายสุดถึงจะดี
		if (file_exists("$v")) echo "<span style='color:red'>found</span>"; else echo "not found";
		unlink("$v");
		if (!file_exists("$v")) echo "-> not found - ";
		echo "$v:" . strlen($v) . "<br/>";
	}
}
unlink("123%7Cกขค.read");
ต.ย.79 sitemap_10.php เพื่อสร้าง sitemap.xml /blog/sitemap_10.php
/blog/sitemap_10.xml
sitemap_10_php.png
sitemap_10_xml.png
xml-sitemaps.com/validate-xml-sitemap.html
<?php
require_once 'wp-load.php';
require_once 'wp-includes/post.php';
$postsForSitemap = get_posts(array(
'numberposts' => 10,
'orderby' => 'date',
'post_type' => array('post','page'),
'order' => 'DESC'
));
$sitemap = '<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
foreach($postsForSitemap as $post) {
  setup_postdata($post);
  $postdate = explode(" ", $post->post_modified);
  $sitemap .= '<url><loc>'. get_permalink($post->ID) .'</loc>'.
  "<lastmod>$postdate[0]</lastmod></url>\n";
}
$sitemap .= '</urlset>';
echo $sitemap;
$fp = fopen("sitemap_10.xml", 'w');
fwrite($fp, $sitemap);
fclose($fp);
?>
ต.ย.80 ดึงบทความ url จาก sitemap.xml มาแสดง thaiall.com/php/curl_sitemap.php
thainame.net/php/curl_sitemap.php
<div style="display:block;margin-left:auto;margin-right:auto;width:720px;background-color:#ffffdd;"> <form action="" method="post"> <input type="radio" value="https://taobao.ttpcargo.com/post-sitemap.xml" name="url" checked> <label>https://taobao.ttpcargo.com/post-sitemap.xml</label><br/> <input type="radio" value="https://powerbank-perfect.com/post-sitemap.xml" name="url"> <label>https://powerbank-perfect.com/post-sitemap.xml</label><br/> <input type="radio" value="https://umbrella-perfect.com/post-sitemap.xml" name="url"> <label>https://umbrella-perfect.com/post-sitemap.xml</label><br/> <input type="radio" value="http://thainame.net/umbrella/sitemap.xml" name="url"> <label>http://thainame.net/umbrella/sitemap.xml</label><br/> <input type="submit" value="load sitemap.xml"> </form> </div> <div style="display:block;margin-left:auto;margin-right:auto;width:720px;background-color:#ffffdd;"> <?php if(false === function_exists('curl_init')){ echo 'Error: curl extension not enabled/available'; } else { // $url = str_replace("/index.php","",$_SERVER['SCRIPT_URI'] . "/sitemap.xml"); // Error: Failed to connect to usb-perfect.com port 443: Connection refusedError: Cannot create object if(isset($_REQUEST["url"]) && strlen($_REQUEST["url"]) < 100 && str_replace(['>', '?'],"",$_REQUEST["url"]) == $_REQUEST["url"]) { echo $_REQUEST["url"]."<br/>"; $curl = curl_init($_REQUEST["url"]); curl_setopt_array($curl,array(CURLOPT_RETURNTRANSFER => true)); $curlxml = curl_exec($curl); if(false === $curlxml){ echo 'Error: ' . curl_error($curl);} $myxml=simplexml_load_string($curlxml) or die("Error: Cannot create object"); $i = 0; foreach($myxml->url as $val) { if($i++ < 30) echo '☸ <a href="' . $val->loc. '" title="">' . $val->loc. '</a> : '. $val->lastmod .'<br>'; } } } ?> </div>
หน่วยที่ 6 : แนะนำเว็บ (Web Guides) Writing PDF File with FPDF Library [ Download : pdf-thai.zip ]
http://www.thaicreate.com/community/php-pdf-fpdf-thai.html [pdf-thai.zip]
http://www.select2web.com/fpdf/fpdf-lesson-10.html
http://www.web-development-blog.com/archives/create-pdf-files-with-php/
Writing XLS File with PHP [ Download : php2xls.zip ]
Demo Files หรือ example-stocks.php (ได้นำไปทดสอบใน thaiabc.com ก็ไม่พบปัญหาใด)
การนำไปใช้ ทำโดยเปิดแฟ้ม example-stocks.php ด้วย notepad เพื่อแก้ไข หรือเพิ่มข้อมูลลงใน cell
การนำไปใช้ แสดงรายชื่อนักศึกษา gradesubjn.php
PHP e-Commerce
http://www.tutorialized.com/tutorials/PHP/E-Commerce/1 (รวม link)
http://www.oscommerce.com (สมบูรณ์ด้วย PHP + MYSQL)
http://www.zen-cart.com (หน้าตาก็เหมือน zen-cart.com นั่นเลย)
PHP calendar with MYSQL
http://www.jtr.de/scripting/php/calendar/index_eng.html
http://keithdevens.com/software/php_calendar
Library of .dll on PHP
http://www.multimedia.uni-greifswald.de/~php4/
http://bugs.php.net/bug.php?id=4284 (problem about php_mssql70.dll on win98)
http://www.kromann.info/php.php (problem about php_mssql70.dll on win98)
Image in Script
http://cannot.info/base64image (convert image in php)
Flash Charts(XML)
charts.htm ตัวอย่าง
charts.zip
Open Flash Charts
(ยังแสดงภาษาไทยไม่ได้)
test01.htm ตัวอย่าง 2 ชาร์ต (default)
test02.htm ตัวอย่าง 1 ชาร์ต อย่างง่าย
test03.htm ข้อมูลจริง
ofcv2.zip
Open Flash Charts
OFC: tutorial
OFC: chart demo
Fusion Charts
fusioncharts.com
Google Charts (หาวิธีแสดงภาษาไทยยังไม่ได้ ใช้ %A1 แล้วหยุดเลยครับ)
http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=%41%42|%61%62%25
Google Chart API
Google Chart API คือ เครื่องมือพื้นฐานที่อนุญาตให้เราสร้างชาร์ทสำหรับข้อมูล ที่นำไปแสดงในเว็บเพจ ที่เราสามารถใช้ข้อมูล กำหนดตัวแปรใน HTTP request แล้วกูเกิ้ลคืนภาพมาเป็นชาร์ท ซึ่งมีชาร์ทให้เลือกใช้หลายแบบ เช่น ชาร์ทแท่ง ชาร์ทวงกลม ชาร์ทเส้น ตาราง แผนผังองค์กร หน้าปัดเกจ ซึ่งบริการ API นี้ ไม่ต้องขอ API Key จากผู้ให้บริการ

ตัวอย่าง Bar1.htm คือ ชาร์ตแสดงข้อมูล ที่มีเรื่องราวเกี่ยวกับแรงจูงใจ (Motivation) โดย "มีความเชื่อว่าเช้ามา แรงจูงใจทำงานสูง และได้พักทางข้าว แรงจูงใจก็จะสูงเช่นกัน" โดยใช้ Bar chart แบบแนวตั้ง (Column) ซึ่งเรียกใช้บริการของ Chart API ของ Google.com แล้วกำหนดค่าให้กับ Chart ผ่าน Java script ในตัวโปรแกรม เป็นการทำงานแบบ Front-end ผ่าน Javascript มีการปรับแต่งเพิ่มเติมให้รับความกว้างและความยาว มีความยืดหยุ่นที่เปลี่ยนไปตามขนาดของจอภาพ มีตัวอย่างที่ใช้งาน คือ นำเสนออันดับมหาวิทยาลัย ปี 2020 ที่รองรับ Mobile friendly
แนะนำเว็บไซต์
ความหมาย Google API
ตัวอย่าง Bar chart

รวมตัวอย่าง Chart (.htm)
Google_ajax_api_annotation
Google_ajax_api_area
Google_ajax_api_bar
Google_ajax_api_bar_1 (w, h)
Google_ajax_api_bubble
Google_ajax_api_calendar
Google_ajax_api_candlestick
Google_ajax_api_column (gpa)
Google_ajax_api_combo
Google_ajax_api_diff
Google_ajax_api_donut
Google_ajax_api_gantt
Google_ajax_api_gauge
Google_ajax_api_geo
Google_ajax_api_histrogram
Google_ajax_api_line น่าใช้
Google_ajax_api_lineinterval
Google_ajax_api_map
Google_ajax_api_org
Google_ajax_api_pie
Google_ajax_api_scatter
Google_ajax_api_table
Google_ajax_api_timeline
Google_ajax_api_trendline
Google_ajax_api_wordtree
google_chart.php
แนะนำหนังสือ - คู่มือเรียน PHP และ MYSQL สำหรับผู้เริ่มต้น, พร้อมเลิศ หล่อวิจิตร, provision, 239 บาท
Thaiall.com