พีเอชพี (PHP) สำหรับ Dynamic Website
หน่วยที่ 1 : ความรู้เบื้องต้น

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

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

ประวัติความเป็นมา

ประวัติของภาษาพีเอชพี (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
เอกสารปี 2549
เอกสารปี 2555 (อาชีวะ)
เอกสารเตรียมสอน PHP5
Download :
  + ตัวแปลภาษา php.net
  + PHP Manual(html)
  + PHP Manual(html)

รหัสต้นฉบับ (Source Code)
+ ปรับปรุงฟอร์มตามรหัสผู้ใช้ ***
+ icon.php ?
+ รายงานการประเมินตนเอง #
+ Webboard (Sample)
+ SuperModel (Sample)
+ บริการพื้นที่เว็บฟรี (Sample)
+ รับสมาชิก และตรวจ (admin:p)
+ ต.ย.Source 2548 (.doc)
+ แปลงสระปัญหาของ PDF
+ https://thaiall.github.io
+ https://github.com/php
+ http://alterebro.github.io
+ โค้ดอื่น ๆ ที่รวมไว้ ...
Run PHP Online
ในอดีต ถ้าเขียนโปรแกรมแล้วต้องการทดสอบประมวลผล ก็ต้องติดตั้ง Webserver ที่บริการภาษา PHP หรือลงโปรแกรมประเภท XAMPP แต่ปัจจุบัน สะดวกขึ้น ผู้เรียน หรือนักพัฒนาสามารถเขียนโปรแกรมบน Smartphone แล้วทดสอบได้เลย เพียงลงโปรแกรม Palapa web server หรือง่ายกว่านั้น ก็โดยเข้าเว็บไซต์ 1) phptester.net 2) onlinephpfunctions.com 3) writephponline.com 4) phpfiddle.org แล้วทดสอบเขียน code และ execute ได้เลย ได้นำ code ใน ต.ย.25 ไปทดสอบผ่านบริการ Online ทั้ง 4 Website และปรับปรุง code ให้ใช้งานได้ทั้งบน PHP 7.0 และ 5.6
Write in Editor and Run

Download : editplus
การเขียน Webpage บน Editplus หากต้องการให้เขียนแล้ว และดูผลการแก้ไข Script ในทันที ก็สามารถ Config ให้ทำได้ เพราะ Editor สนับสนุนการสร้างเครื่องมือ เพื่อสั่ง Compile แล้ว Run สำหรับการพัฒนาโปรแกรมแบบผ่าน Compiler อยู่แล้ว ส่วน Script ที่ต้อง Run บน Web Server อย่างภาษา PHP หากต้องการใช้ Tool มีสิ่งที่ต้องทำ ดังนี้
1) เปิดบริการ Web Server ถ้าใช้ XAMPP ก็สะดวกเลย กรณีของผมลงไว้ และมีห้อง c:\xampp\htdocs สำหรับเก็บ script หากเป็น Web Server ของ IIS หรือ Appserv ก็หา Folder ให้พบ ก็จะเข้าไปจัดการได้เหมือนกัน
2) ถ้าต้องการย้าย DocumentRoot ไปชี้ห้องอื่น ก็เปิด ControlPanel ของ XAMPP คลิ๊ก Config เลือก Apache (httpd.conf) มองหา DocumentRoot "C:/xampp/htdocs" และ แล้วเปลี่ยนเป็นชื่อ Folder ที่ต้องการเก็บ Script สำหรับ run ได้เลย
3) เปิด Editplus คลิ๊ก Menu bar, Tools, Configure User Tools.. แล้ว Add Tool, Program กรอกข้อมูล 3 ช่อง คือ Menu Text, Program และ Argument ช่อง Menu Text ตั้งชื่อตามถนัด ช่อง Program เลือกที่ตั้ง เช่น C:\Program Files (x86)\Google\Chrome\Application\chrome.exe ช่อง Argument นี้กรอกว่า http://localhost/$(FileName)
4) เราพึ่งสร้าง Tool ตัวแรกสำหรับใช้งาน สั่งด้วยการกด Ctrl+1 ขณะเขียนโปรแกรมจะ Save อัตโนมัติ แล้วไปเปิด Browser พร้อมเรียก Script มาประมวลผลให้เห็นทันใด เทคนิคการสร้าง Tool แบบนี้ ทำให้นึกถึงการเขียนโปรแกรม Turbo C, Cobol, Assembly ที่เป็น Compiler ต้องมีขั้นตอนการ Compile และ Run แยกกัน
Free page : มาสร้างเพจใน 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 : รหัสต้นฉบับ อย่างสั้น
เอกสาร 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 ก็จะนำไปใช้ได้ มีรายละเอียดอีกไม่มากนักที่ http://www.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 no support GD GIF but support GD JPEG. # you can check by phpinfo(); # test at http://www.lampang.go.th/webboard/securecode.php # test at http://www.thaiall.com/php/testjpg.php 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); ?>
ต.ย.
3
:: Listing of thumb nail and click to enlarge
    ตัวอย่าง : http://www.lampang.go.th/nwt
    <table width=100%>
    <?
    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> | ";
    }
    ?>
    
    ตัวอย่าง : http://www.thaiall.com/win/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 <?=$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> <? 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 = 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/ <? 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>
    <?
    $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>";
      }
    }
    // 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>";
    // }
    ?>
    </body></html>
    
ต.ย.
5
:: Security by word in image putting
    ตัวอย่าง : http://www.thaiall.com/php/secure.php
    <body>
    <?
    $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=<?=$t;?>><br>
    <input type=submit value="Check password">
    </form>
    <? } ?>
    </body>
    
ต.ย.
6
:: 2 connection method of PHP+MDB in Windows
    Source Code : (empl.mdb 68 KB = empl :emplid as double,emplname as text,emplsalary as double)
    
      <body>Connection method of PHP+MDB in Windows<br>
    1. <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>
    2. <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><hr>
      <? 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)"; } } ?>
    เพราะนักศึกษาคนหนึ่งที่ผมเคยสอนคอมพิวเตอร์เบื้องต้น ถามเรื่องนี้ ทำให้ผมต้องศึกษาเพิ่มเติม แล้วนำมาเขียนไว้ที่นี่ เพราะเดิมผมไม่สนใจเรื่อง php+mdb
ต.ย.
7
:: Open File From Internet (ดูดเว็บอื่นมาใช้งานเป็นเว็บเพจของเรา)
:: บาง Server ไม่ยอมให้ใช้ file() ดูดข้อมูลจากเว็บเพจนอกเครื่อง (Using remote files) เช่น thaiall.com เพราะใน php.in กำหนด allow_url_fopen เป็น off ถ้าเป็น on ก็จะไม่พบปัญหานี้ สามารถตรวจสอบด้วย phpinfo()
    <base href=http://www.youtube.com/>
    <?
    $ar = file("http://www.youtube.com");
    foreach ($ar as $value) {
       echo $value;
    }
    ?>
    ตัวอย่างนี้แสดงการดูดเว็บ http://www.youtube.com
    มาแสดงเป็นเว็บของเรา ถ้าจะ split หรือนับ line ก็ต้องเขียนโปรแกรมเพิ่ม เช่น $lines = split("\n", $multi-line-input);
    
ต.ย.
8
:: ดูดบางส่วนของเว็บ โดยเลือกจาก keyword มาเท่าจำนวนบรรทัดที่ต้องการ
    Commnet : 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;
     }
    }
    ?>
    
    ตัวอย่างนี้แสดงการดูดเว็บ http://www.manager.co.th เพียงบางส่วน
    โปรแกรมนี้ใช้กับบาง server ไม่ได้ เพราะเขาไม่ยอมให้ใช้ฟังก์ชัน file() เช่น thcity.com เป็นต้น
    
ต.ย.
9
:: ดูด Directory และเปลี่ยน Link ของ Google.com
    9.1 ดูด Directory ของ google (ปรับปรุง 2552-08-24)
    ตัวอย่าง : http://www.thaiall.com/php/load_phpbb.php
    ตัวอย่าง : http://www.thaiall.com/php/google.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 = split($chk1,$web[$i]);
        if (count($r) > 1) { 
          $found = 1;
          echo $chk1;  # พิมพ์คำที่ค้นหาเป็นคำแรก
        }  
      } else {
        $r = 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
    <?
    $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
    ตัวอย่าง : http://www.thaiall.com/listen/_cut.php
    <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>
    <?
    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 = split($chk1,$r[$i]);
        if (count($r1) > 1) {
          $found = 1;
          $r2 = split($chk2,$r1[1]);
          $r3 = $r2[0];
        }
      }
      echo "<a href=".$chk1.$r3.$chk2.">mp3</a>";
    }
    ?>
    
    9.4 ดูดเว็บเพจของ ไอทีในชีวิตประจำวัน
    ตัวอย่าง : http://www.thaiall.com/itinlife/article.php
    ปรับปรุงมาจากโปรแกรมดูดเว็บที่ใช้กับ google.com จึงทำให้ดูเข้าใจง่ายขึ้น
    <table width=760 align=center><td bgcolor=#ffffdd>
    <?
    $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 = split($chk1,$web[$i]);
     $r2 = 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
    ตัวอย่าง : http://www.thaiall.com/php/load_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 = split($startpoint,$web[$i]);
        if (count($r) > 1) $found = 1;  
      } else {
        $r = split($stoppoint,$web[$i]);   
        if (count($r) > 1) break;
        $r = split($checkline,$web[$i]);   
        if (count($r) > 1) {
           $r = 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 แบบ
    <! up.php โปรแกรม upload แฟ้มข้อมูลเข้าไปในเครื่องบริการ>
    <form action=up.php enctype="multipart/form-data" method=post>
    <input type=file name=uploadfile>
    <input type=submit>
    </form>
    <?
    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> <? $tot = 3; for($i=1;$i<=$tot;$i++) { echo "<input type=file name=uploadfile$i><br>"; } ?> <input type=submit> </form> <? 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> <? if (isset($_POST["new"])) if (copy($_FILES["uploadfile"]["tmp_name"],"./".$_POST["new"])) echo "upload : completely"; ?>
    <! uploadbanner.php ส่งแฟ้มเข้าแบบกำหนดชื่อตายตัว และกำหนด redirect> <? 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> <? } ?>
ต.ย.
11
:: โปรแกรม 3 โปรแกรม แสดงการทำงานของ 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\ > <? 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> <?=$_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
    <body>
    <?
    # 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 <?=$_SESSION['count']; ?> times.
    </body>
    :: เพราะผมเคยใช้ 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();
    
ต.ย.
13
:: โปรแกรมจัดตารางสอบอย่างง่าย (นักเรียนลงทะเบียนคนละ 3 วิชา แต่หลังจัดตารางสอบจะมีชั่วโมงสอบ 3 Hrs คือ ac, be, d)
:: อาจารย์หญิงท่านหนึ่งที่ผมรู้จักใช้ theory การจัดตารางสอบที่มีการทำ generation พร้อมกับ constrain อีกมากมาย
:: ผมลองเขียนดู แต่เอาแบบง่าย ๆ ไม่มีเงื่อนไข จัดให้ลง block ที่เตรียมไว้ ก็ถือว่าใช้ได้แล้ว
    Source Code : http://www.thaiall.com/php/timetabling.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 = split("\n",$_POST['regist']); foreach($student as $one) { $subj = split(",",$one); for($i=0;$i<count($subj);$i++) echo $subj[$i]; } // นำข้อมูลแต่ละคน มาแยกเก็บแยกวิชา เช่น a,1,2 ลงตัวแปร $s เพื่อใช้ในการจัดตารางสอบ foreach($student as $one) { $subj = 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 = 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 = 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 ผมจึงเขียนโปรแกรมง่าย ๆ ขึ้นมาให้นำไปปรับปรุง
    Source Code : http://www.thaiall.com/php/barchart.php?b1=50&b2=100&b3=120&b4=30
    14.1 เขียน barchart.php (ปรับปรุง : 5 กรกฎาคม 2548 เพราะเดิมลืมเครื่องหมาย $)
    
    <?
    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.yonok.ac.th/burin/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 ทดสอบเขียนภาพอีกแบบหนึ่ง
    <?
    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 มาแสดง
    <?
      header("Content-Type: image/gif");
      $fn=fopen("ta5.gif","r");
      fpassthru($fn);
    ?>
    
    14.4 อ่านแฟ้มภาพภาษาไทยใน linux เพราะใช้ชื่อแฟ้มภาษาไทยตรง ๆ ไม่ได้
    <?
    // http://www.thaiall.com/lampangmap/img.php?f=ลำปาง1
    $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 เพื่อแก้ปัญหาการมีชื่อแฟ้มเป็นภาษาไทย
    <?
    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
    <?
    $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
    <?
    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 (Access to MSSQL, PHP.net Guide)
    <?
    // $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 : <?
    $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 = 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>
    <?
    $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>
    <?
    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>
    
    โปรแกรมแปลงภาษาไทยเป็นตัวเลข
    <?
    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="<?
    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);
    }
    
ต.ย.
21
:: Each _SESSION, _SERVER, _ENV
:: แสดงข้อมูลทั้งหมดในตัวแปร Session หรือตัวแปร Server
    <?
    # ใช้ session_save_path ในกรณีที่ server บังคับให้ใช้ เช่น hypermart.net
    # session_save_path("/var/www/cgi-bin/tmp"); สร้างห้อง tmp ไว้เก็บ session เป็นต้น
    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
    <?
    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
    <?
    $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)
    
    <?php
    // Microsoft-IIS/8.5 php-5.6 mysql-5.1 phpmyadmin-4.0.10.20
    // ! http://www.phpconcept.com/content/view/21/28/
    $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);
    ?>
    
    <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);
    ?>
    
+ แก้ปัญหาภาษาไทย เมื่อพิมพ์ภาษาไทยใน phpmyadmin แล้วออกเป็น ???
- ให้ทำตอนเริ่มต้นสร้างตาราง หรือ backup ข้อมูลไว้ก่อน เพราะถ้ามีข้อมูลมาก ๆ อาจมีปัญหา
- เปลี่ยน การเรียงลำดับในแต่ละ field จาก latin1_swedish_ci เป็น tis620_thai_ci
- ใน php script ต้องเพิ่ม mysql_query("set names tis620"); ต่อจาก mysql_connect( .. );
- วิธีนี้ไม่ได้แก้ปัญหาภาษาไทยในข้อมูลเดิม แต่จะไม่มีปัญหากับข้อมูลใหม่ที่เพิ่ม หรือแก้ไข
ต.ย.
24
:: ตรวจ Link ในเว็บเพจที่ต้องการ
:: รุ่นนี้ยังไม่เช็ค link ปลายทาง เพียงแต่บอกว่า เว็บเพจนั้นมี link อะไรบ้าง
:: ลองทดสอบดูได้ ที่ 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 = split("href=",$web[$i]);
       if (count($r1) > 1) $found = 1;
       if ($found == 1) {
         $r2 = 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)
    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 <? # mysql> use test; # mysql> create table abc(a1 int,a2 varchar(10)); $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 ให้ใหม่ เมื่อไม่ถูกสร้างไว้
    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_ สามารถประมวลผลได้
    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";
    
    // ใน thaiabc ใช้ได้ บางเครื่องเกรงเป็น Security Hole อาจพบ Unable to execute (ปรับปรุง : 2553-04-20)
    // ถ้าใน iis ไม่ยอมให้ใช้ shell_exec ผ่าน IUSR_ ต้องกำหนด Authen ของ User ให้กับคำสั่ง cmd ก่อน
    <pre><?
    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>";
    }
    
    // แบบเลือกทีละคำสั่ง
    <pre><?
    $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 = split("\n",$cmd); $user =""; $time =""; echo "<font size=0>"; for ($i=0;$i<count($a);$i++){ $r = split("imap-login",$a[$i]); if(count($r) > 1){ $f = 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
    <?
    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 โดยมีกรอบให้เลือก แล้วส่งภาพเราเข้าไปอยู่ในกรอบ
    // http://www.thaiall.com/mag/merge.php
    <?
    $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 = split("\r\n",$u);
      foreach($rec as $v) {
        $r = 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
    ?>
    <? session_start(); // checkprofile.php ?> <form action=''> <input name=u><input name=p type=password><input type=submit> </form> <? 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
    <?
    $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><?
    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>
    <?
    if (isset($_REQUEST["d"]) && strlen($_REQUEST["d"]) < 500000) { 
     echo addslashes(base64_decode($_REQUEST["d"]));
    }
    ?>
ต.ย.
38
:: ระบุชื่อเว็บเพจสำหรับใช้บริการตัวนับ
ตัวอย่างนี้มี 2 เว็บเพจ คือ body.php และ footer.php
body.php มีคำสั่งเรียก footer.php ดังนี้
<?php include ('footer.php'); ?>
footer.php
<script language="javascript1.1">page="<?
$ar = 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><?
$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
<?
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
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 = split("\n",$getping);
  $lastip = split('\.',$ip);
  foreach($out as $v){ 
  if(substr($v,0,5) == "Reply") { 
	  $bg = $red; 
      if(count($lastip) == 4) $last = $lastip[3];
      $t1 = split("time",$v);
      $t2 = 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)
<? 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>  
<?
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)
$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 และวันที่ไทย
<?
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>
<?
$mth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน",
"กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม");
echo date("d") . " ".  $mth{date("n") - 1} . " " . (date("Y") + 543);
?>
</td></tr></table>
</body></html>
ต.ย.
44
:: สร้างแฟ้ม สร้างห้อง อัพโหลด เตรียมห้องข่าว
:: ตัวอย่างที่ใช้เตรียมฟังก์ชันสำหรับการเขียนระบบอัพโหลดข้อมูลข่าว
<form action="add.php" enctype="multipart/form-data" method=post>
<input type=file name=uploadfile1>
<input type=submit>
</form>

<?
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 ต่างออกไป
<?
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 ไม่ได้
<?
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 นี้
<? 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 = split("-","$f_key");
  $get_v = split("-","$f_val");
  foreach($fn as $v) {
    $r = 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
:: โปรแกรมนี้ใช้เพื่อทดสอบประสิทธิภาพ และประเมินการรับจำนวนระเบียนที่เข้าไป
<?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";
?>
คำอธิบายเพิ่มเติม
// 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 เวลาที่ใช้จะขึ้นกับปริมาณของข้อมูล
ดังนั้น การออกแบบระบบฐานข้อมูล จึงมีตัวเลือกที่ต้องศึกษามากมาย ทำความเข้าใจ และทดสอบ เพื่อให้ได้ทางเลือกที่ดีที่สุด
ต.ย.
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
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();
?>
มีลูกศิษย์ชื่อภสุ ไปฝึกงานที่สาธารณสุขเขต และต้องใช้ php สั่งเขียนออกมาเป็น PDF และข้อมูลมีหลายบรรทัด ผมได้รับตัวอย่าง code ที่ใช้แล้ว ก็พบฟังก์ชัน writehtml() เมื่อค้นดูก็พบว่าเป็น add-on ที่พัฒนาขึ้นโดย Aramis เมื่อ download มาใช้งานร่วมกับ pdf-thai ที่ได้จาก thaicreate.com ก็พบว่าใช้งานได้ปกติ
ต.ย.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 = 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>
ต.ย.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กขค
?>
ต.ย.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
header("content-type:text/html;charset=utf-8");   
// https://data.go.th/datasetinfo/8548e3ab-00bf-4eae-b29a-156a4aa52c0d
$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
<?php
$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>"; ?>
+ target=_blank>whois.sc/
+ tor on chrome
+ whatismyipaddress.com
หน่วยที่ 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
http://www.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
ติดตั้ง memcache เพื่อใช้ใน wordpress บน nginx บน google cloud
มีโจทย์จากเพื่อนเรื่องการติดตั้ง memcache บน nginx ซึ่งเคยมีความเชื่อว่าจะติดตั้งบน nginx ไม่ได้จาก manual ในหลายที่ แต่เมื่อได้อ่านที่ nginxtips.com ซึ่งพบว่า memcache นั้นเกี่ยวกับ php ไม่ได้เกี่ยวกับ nginx จึงเข้าไปแก้ไข php.ini ลบ ; หน้าบรรทัด extension=memcache.so แล้วใช้ service bitnami restart ก็พบว่า memcache ปรากฎใน phpinfo(); แต่ก่อนหน้านี้ต้องติดตั้ง memcache ให้เรียบร้อยก่อน ในเครื่องของ google cloud ที่ใช้อยู่มี php 5.4.4 ซึ่งไม่ได้ติดตั้ง memcache ไว้ ต้องหามาติดตั้งเอง และใช้ ps -aux | grep memache ตรวจสอบว่าทำงานอยู่หรือไม่ จากนั้นก็เชื่อมเข้า php ผ่าน php.ini
#vi /opt/bitnami/php/etc/php.ini
เดิม ;extension=memcache.so
ใหม่ extension=memcache.so
แนะนำหนังสือ
- คู่มือเรียน PHP และ MYSQL สำหรับผู้เริ่มต้น, พร้อมเลิศ หล่อวิจิตร, provision, 239 บาท

การนำเสนอ chart ในเว็บเพจ มีด้วยกันหลายวิธี ได้ทบทวนการใช้ OFC (Open Flash Chart) อยู่พักหนึ่ง สุดท้ายก็ต้องยอมแพ้ เพราะ เส้นทางของ Flash ในอนาคต ดูจะตีบตันเหลือเกิน และ OFC ก็ไม่ได้พัฒนาต่อให้สมบูรณ์ ต่างกับ Google Chart ที่พัฒนาอย่างต่อเนื่อง และเลือกใช้งานได้หลากหลาย ตามความต้องการของผู้ใช้

อัพโหลดหลายไฟล์ผ่าน click เดียว
22 ม.ค.54 การ upload แฟ้มเข้าเครื่องบริการทีละแฟ้มนั้น ใช้คำสั่งไม่เกิน 5 บรรทัดก็สามารถทำได้ แต่ถ้าต้องการ upload หลายแฟ้มด้วยการ click ครั้งเดียว ต้องเขียนหลายบรรทัด .. การศึกษาเรื่องนี้เกิดจาก คุณแบงค์ (เพื่อนร่วมงาน) ถามว่า ทำอย่างไร upload หลายแฟ้มเข้าเครื่องบริการผ่าน web browser .. ผมเองก็เคยเห็นใน hi5.com หรือ facebook.com เมื่อหลายปีก่อน เมื่อสืบค้นดูก็พบว่า swfupload.org มี code จึงนำมาดัดแปลง และเปิดให้ทดสอบที่ http://www.thaiall.com/php/multiupload
+ http://demo.swfupload.org/v250beta3/
+ http://www.thaiall.com/download/multiupload_swfupload.zip
+ ถ้านำไปใช้ อย่าลืมอ่าน readme.txt ใน .zip .. ก่อนนะครับ
ผู้สนับสนุน ยินดีรับ ผู้สนับสนุน เว็บไซต์ด้านการศึกษา
กลุ่มเว็บไซต์นี้ เริ่มพัฒนา พ.ศ.2542
โดยบุคลากรทางการศึกษาด้านคอมพิวเตอร์
โทร. 081-9927223 (ผมเป็นคนลำปางหนา)
ปล. ขอไม่รับ work at home / อาหารเสริม

http://goo.gl/72BPC