พีเอชพี (PHP) ครูโรงเรียน
โครงการอบรม ครูโรงเรียน เพื่อเป็นโปรแกรมเมอร์ภาษาพีเอชพี (PHP)
บทเรียน
1. การใช้ข้อมูลจากอาร์เรย์
2. การจัดการข้อมูลในแฟ้มตัวอักษร
3. การจัดการข้อมูลในมายเอสคิวแอล
4. การใช้จาวาสคริปต์ในฟอร์ม
5. การใช้งานเซสชัน และคุกกี้
6. การจัดการตัวนับ
7. การจัดการแฟ้ม และอัพโหลด
8. การรับส่งอีเมลด้วยพีเอชพี
9. การเขียนภาพกราฟฟิก
10. การใช้เชลคอมแมน
11. ระบบแกลลารี่อย่างง่าย
12. ระบบยืนยันตัวตนด้วยภาพอักษร
13. ระบบซีเอ็มเอส
14. ระบบสมาชิก
15. ระบบเว็บบอร์ด
16. ระบบเว็บโฮสติ้ง
17. การสร้างระบบติดตั้ง

Work Shop
- สร้างฐานข้อมูล และตารางนักเรียน
- การแปลงข้อมูล (Data Convertion) 
- การสร้างฟอร์ม และรับค่าจากฟอร์ม

Learning By Example
คุณสมบัติผู้เรียน
1. มีประสบการณ์การเขียน html
2. มีประสบการณ์การเขียน php + mysql
3. มีประสบการณ์การโปรแกรมแบบมีโครงสร้าง
4. มีประสบการณ์ติดตั้งเว็บเซิร์ฟเวอร์
5. มีประสบการณ์ในการออกแบบฐานข้อมูล
6. มีใจรัก และมีเป้าหมายของการเรียน
ขั้นตอนการเรียน
1. ติดตั้ง webserver + php + mysql
2. ทดสอบบริการของ php
3. ทดสอบบริการของ mysql
4. สร้างระบบขนาดเล็ก ตามคำแนะนำ
5. นำระบบขนาดใหญ่มาทดสอบ และแก้ไข
6. สร้างระบบด้วยตนเอง
แนะนำเว็บ (Web Guides)
- www.thaiall.com/webserver
- www.thaiall.com/html/html.htm
- www.thaiall.com/php
- www.thaiall.com/mysql
- www.thaiall.com/source
- www.thaiall.com/programming
- www.thaiall.com/article/teachpro.htm
- www.thaiall.com/java
- www.thaiabc.com
- www.php.net

แผนการสอน ซึ่งเปลี่ยนแปลงตามความต้องการของผู้เรียน ตามหลัก child center
วันที่ 1

9.00 - 12.00 ทบทวนความรู้เรื่องข้อมูล
- ความรู้เบื้องต้นเกี่ยวกับพีเอชพี
- ความรู้เบื้องต้นเกี่ยวกับมายเอสคิวแอล
- การติดตั้งเว็บเซิร์ฟเวอร์
- การใช้ข้อมูลจากอาร์เรย์
- การจัดการข้อมูลในแฟ้มตัวอักษร
13.00 - 16.00 การจัดการข้อมูลในมายเอสคิวแอล
- ความรู้เบื้องต้นเกี่ยวกับเอสคิวแอล
- การใช้ MySQL
- การใช้ phpMyAdmin
- คำสั่ง insert, select, update, delete
- การเชื่อมตารางในฐานข้อมูล
- การเขียนโปรแกรมจัดการข้อมูล
วันที่ 2

9.00 - 12.00 การใช้จาวาสคริปต์ในฟอร์ม
- ความรู้เบื้องต้นเกี่ยวกับจาวาสคริปต์
- ตรวจสอบข้อมูลก่อนส่ง
- ยืนยันการส่งข้อมูล
13.00 - 16.00 การใช้งานเซสชัน และคุกกี้
- ความรู้เบื้องต้นเกี่ยวกับเซสชัน และคุกกี้
- การใช้งานเซสชัน
- การใช้งานคุกกี้
วันที่ 3

9.00 - 12.00 การจัดการตัวนับ
- ความรู้เบื้องต้นเกี่ยวกับตัวนับ
- การใช้แฟ้มตัวอักษร
- การใช้มายเอสคิวแอล
13.00 - 16.00 การจัดการแฟ้ม และอัพโหลด
- ความรู้เบื้องต้นเกี่ยวกับอัพโหลด
- การอัพโหลดแฟ้ม
- การลบแฟ้ม
วันที่ 4

9.00 - 12.00 กราฟฟิก และอีเมล
- ความรู้เบื้องต้นเกี่ยวกับกราฟฟิก
- การเขียนภาพกราฟฟิก
- การรับส่งอีเมลด้วยพีเอชพี
- การใช้เชลคอมแมน
13.00 - 16.00 กรณีศึกษาอย่างง่าย
- ศึกษาระบบแกลลารี่อย่างง่าย
- ศึกษาระบบยืนยันตัวตนด้วยภาพอักษร
- ศึกษาระบบซีเอ็มเอส
วันที่ 5

9.00 - 12.00 กรณีศึกษาอย่างง่าย (ต่อ)
- ศึกษาระบบสมาชิก
- ศึกษาระบบเว็บบอร์ด
- ศึกษาระบบเว็บโฮสติ้ง
13.00 - 16.00 การสร้างระบบติดตั้ง
- การสร้างระบบติดตั้ง
- ฝึกติดตั้งระบบที่พัฒนาขึ้นในเครื่องอื่น
เอกสารประกอบการอบรม
- คู่มือ php (#1 + #2)
- คู่มือ mysql
- คู่มือ javascript
- คู่มือ weberver
- Sample Code in Thaiabc.com

เอกสารคู่มือแบบออฟไลน์ (.chm หรือ .htm)
แฟ้มเอกสารควรมีไว้ศึกษา
+ php_manual_chm.zip (14 MB)
+ php_manual_en.tar.gz (3 MB)
+ refman-5.1-en.chm (4 MB)
รวมแหล่งเอกสาร PHP
- http://www.php.net/download-docs.php
- Online : http://www.php.net/manual/en/
- Online : http://dev.mysql.com/doc/


ฟังก์ชันที่ควรจดจำ


T01. ความรู้เบื้องต้นเกี่ยวกับพีเอชพี (Professional Home Page)
1. พีเอชพีมีหลายรุ่น และต้องติดตั้งอยู่บน Web Server เช่น IIS หรือ Apache
2. ภาษานี้ถูกพัฒนาอย่างต่อเนื่อง มีโครงสร้างเหมือนภาษา C และนำไปใช้ได้ฟรี
3. netstat -a ใน DOS ใช้ดู Port 80 ที่ LISTENING 
4. ผู้ดูแลระบบควรฝึก เปิด และ ปิดบริการต่าง ๆ ด้วยความเข้าใจ
5. ฟังก์ชัน phpinfo() ทำหน้าที่รายงานข้อมูลเกี่ยวกับ php module + environment value 
6. code เดียวกันอาจใช้ไม่ได้กับทุก server เช่น $x หรือ $_GET["x"] ขึ้นอยู่กับหลายองค์ประกอบ
7. กำหนด register_globals = On ใน php.ini ทำให้ใช้ $x หรือ $_GET["x"] ได้
8. ตัวอย่าง code ทำซ้ำ คือ  for ($i=1;$i<=5;$i++) echo $i . "\n";
9. ตัวอย่างโปรแกรม x.php 
<? 
echo 5;
// phpinfo(); 
?>
10. ตัวอย่างผลการประมวลผลผ่าน command line เช่น DOS>php x.php
Content-type: text/html
X-Powered-By: PHP/4.3.9

5
11. ตัวอย่างทดสอบ POST GET และ REQUEST
<form action="" method=post>
<input name=a value='bb'>
<input type=submit>
</form>
<a href="?a=cc">click</a>
<?
echo $a.$_GET["a"].$_POST["a"].$_REQUEST["a"];
// bbccbbbb
phpinfo();
?>
12. ตัวอย่างฟังก์ชันที่สร้างขึ้นใช้งาน
$x = 5;
echo a(100,200);
function a($a1,$a2) {
  global $x;
  $t = $a1 + $a2 + $x;
  return $t;
}
หมายเหตุ
1. $_ENV["REMOTE_ADDR"] คืออะไร
2. php in command line ช่วยตรวจสอบข้อมูล
3. DOS>php x.php > x.htm คืออะไร
4. DOS>explorer x.htm
5. เขียน พิมพ์ 1 ถึง 10 ใน command line
6. เขียน POST และ GET
7. เขียน $_ENV["QUERY_STRING"];

T02. ความรู้เบื้องต้นเกี่ยวกับมายเอสคิวแอล
1. มายเอสคิวแอลเป็นโปรแกรมที่นำมาใช้ได้ฟรี หรือเลือกจ่ายให้กับบริษัท MySQL AB
2. Default Port คือ 3306 กำหนดใน my.ini และใช้ DOS>netstat -a ตรวจ Port ได้
3. แต่ละรุ่นแตกต่างกัน ต้องเลือกติดตั้งให้ตรงกับ Script ที่ได้มา
4. ปิดบริการโดยเข้า Processes ใน Windows Task Manager หรือ Services
หมายเหตุ
1. รู้ได้อย่างไรว่า MySQL เปิดให้บริการอยู่
2. ท่านใช้ MySQL รุ่นใด เพราะอะไร

T03. การติดตั้งเว็บเซิร์ฟเวอร์
1. Web Server คือ เครื่องบริการเว็บ มักเปิดบริการผ่าน port 80
2. โดยปกติการติดตั้ง apache + php + mysql และ config มีความซับซ้อน
3. โปรแกรม WAMP = Windows + Apache + MySQL และ PHP 
เช่น appserv, foxserv, wmserver, phpdev, phpTraid, nusphere หรือ thaiabc
4. การสร้างโปรแกรมติดตั้ง สามารถใช้ NSIS ที่ใครก็ทำได้ (ขั้นตอน)
5. แฟ้ม c:\thaiabc\apache\apache2\conf\httpd.conf 
6. ตัวแปรใน httpd.conf ที่น่าสนใจ DocumentRoot, Listen, DirectoryIndex, Virtualhost
7. แก้ไข httpd.conf เพื่อให้บริการ php ใน apache
ScriptAlias /php/ "c:/thaiabc/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"
หมายเหตุ
1. httpd.conf คืออะไร อยู่ห้องใด
2. ตรวจ PORT 80 ว่าเปิดหรือไม่

T04. การใช้ข้อมูลจากอาร์เรย์
1. ข้อมูลบางอย่างไม่จำเป็นต้องใช้ฐานข้อมูลข้างนอก กำหนดในโปรแกรมแล้วเรียกใช้
2. $a[0] = "tom"; หรือ $a = array("tom",256,1024); หรือ $sal["tom"] = 2500;
3. ตัวอย่างคำสั่ง print_r
<pre><? 
//$a = array(); // not required
$a["tom"] = 2000; $a["boy"] = 2500;
print_r( $a ); 
// output : Array ( [tom] => 2000 [boy] => 2500 ) 
?>
4. ตัวอย่างกำหนด index อัตโนมัติ
<pre><? 
$a = array('3'=>'x','y','z');
print_r($a); // Array([3] => x [4] => y [5] => z) 
$a = array('a','9'=>'b','c');
print_r($a); // Array([0] => a [9] => b [10] => c)
?>
5. ตัวอย่าง 2 มิติ
<pre><? 
<pre><?
$a[0][0] = "a"; // replaced
$a{0}{0} = "b";
$a{"c"}{"d"} = "e";
$a{"c"}{"f"} = "g";
print_r($a);
?>
Array (
[0] => Array (
       [0] => b
)
[c] => Array (
       [d] => e
       [f] => g
)
)
6. ตัวอย่างหลายแบบใน 1 อาร์เรย์
<pre><?
$a = array("a","b"=>5,"c"=>array("d","e"),"f");
print_r($a);
?>
Array (
[0] => a
[b] => 5
[c] => Array (
       [0] => d
       [1] => e
       )
[1] => f
)
7. ตัวอย่างกำหนดหลายมิติใน 1 อาร์เรย์
<pre><?
$a["tom"] = 5;
$a["boy"]["dang"] = 10;
print_r($a);
?>
8. ตัวอย่าง array_push
<pre><?
$a =array();
$b[6] = 10;
$c[7] = "d";
array_push($a,$b);
array_push($a,$c);
print_r($a);
?>
Array (
[0] => Array (
       [6] => 10
)
[1] => Array (
       [7] => d
)
)
9. ตัวอย่างการท่องไปในอาร์เรย์
$a =array(5,"a","b"=>7);
foreach($a as $k=>$v) echo $k."=".$v;
// 0=51=ab=7
10. ตัวอย่างการตรวจสอบอาร์เรย์
$a =array(5);
echo is_array($a);
echo !is_array($a[0]);
echo is_array($a[0]); // no output
echo is_array($a) ? 'Array' : 'Not Array';
echo is_array($a[0]) ? 'Array' : 'Not Array';
if (is_array($a)) echo 1;
if (isset($a)) echo 2;
if (!isset($a[1])) echo 3;
// 11ArrayNot Array123
11. ตัวอย่างการท่องในอาร์เรย์ซ้อนอาร์เรย์
$a =array(5,array(6,7),8);
foreach($a as $v) echo $v;
// 5Array8
foreach($a as $v) {
if (!is_array($v))
  echo $v;
else 
  foreach($v as $va) echo $va;
}
// 5678
หมายเหตุ
1. สร้างอาร์เรย์เก็บข้อมูลอาจารย์
2. ค้นหาชื่ออาจารย์จากรหัสได้ในอาร์เรย์
3. อธิบายความต่างของ $a[0] และ $sal["tom"] ได้

T05. การจัดการข้อมูลในแฟ้มตัวอักษร
1. ดูข้อมูล หรือขนาดแฟ้มใน DOS ด้วย type และ dir และ debug
2. แต่ละบรรทัดมีรหัส Carriage Return(13) และ Line Feed(10)
3. เลข 13 ฐาน 16 คือ 0D และเลข 10 ฐาน 16 คือ 0A
4. ตัวอย่างสร้าง text file
$f = fopen("test.txt","w");
fputs($f,"a,b\n");
fputs($f,"c,d\n");
fclose($f);
5. ตัวอย่างอ่าน text file มาแสดงผล
$f = fopen("test.txt","r");
while(!feof($f)){
  $d = fgets($f);
  echo $d."\n"; // a,b c,d
}
fclose($f);
6. ตัวอย่างอ่าน text file มาแสดงผลในตาราง
<table border=1><?
$f = fopen("test.txt","r");
while(!feof($f)){
  if ($d = fgets($f))
  echo "<tr><td>$d</td></tr>";
}
fclose($f);
?></table>
7. ตัวอย่างอ่านลงอาร์เรย์ และแยกฟิล์ด
echo "<table border=1>";
$f = file("test.txt");
foreach($f as $v){
 $d = split(",",$v);
 if ($d) echo "<tr><td>$d[0]<td>$d[1]";
}
echo "</table>";
หมายเหตุ
1. ท่านใช้ debug ดูข้อมูลใน x.txt อย่างไร
2. csv จาก excel ได้อะไร (.csv)
3. tab delimited จาก excel ได้อะไร (.txt)
4. ฟังก์ชัน split("\t",$d); ใช้แยกข้อมูลแบบใด
5. ฟังก์ชัน split(",",$d); ใช้แยกข้อมูลแบบใด

T06. ความรู้เบื้องต้นเกี่ยวกับเอสคิวแอล
SQL (Structured Query Language) คือ ภาษาสอบถามข้อมูล หรือภาษาจัดการข้อมูลอย่างมีโครงสร้าง มีการพัฒนาภาษาคอมพิวเตอร์ และโปรแกรมฐานข้อมูลที่รองรับมากมาย เพราะจัดการข้อมูลได้ง่าย เช่น MySQL, MsSQL, PostgreSQL หรือ MS Access เป็นต้น สำหรับโปรแกรมฐานข้อมูลที่ได้รับความนิยมคือ MySQL เป็น Open Source ที่ใช้งานได้ทั้งใน Linux และ Windows
โปรแกรมฐานข้อมูล มีหน้าที่เก็บข้อมูลอย่างเป็นระบบ รองรับคำสั่ง SQL (Structured Query Language) เป็นเครื่องมือสำหรับเก็บข้อมูล ที่ต้องใช้ร่วมกับเครื่องมืออื่นอย่างสอดคล้อง เพื่อให้ได้ระบบที่รองรับความต้องการของผู้ใช้ เช่น เครื่องบริการเว็บ (Web Server) และโปรแกรมประมวลผลฝั่งเครื่องบริการ (Server-Side Script)
MySQL เป็นซอฟต์แวร์โอเพนซอร์ส ใช้ในการจัดการดาต้าเบส (Database) โดยใช้ภาษา SQL ถูกพัฒนาโดย บริษัท MySQL AB ในประเทศสวีเดน มีทั้งแบบใช้ฟรี และเชิงธุรกิจ
1. export ข้อมูลจาก mysql ออกไปเป็น text file ด้วย phpmyadmin
2. import ข้อมูลจาก text file เข้า mysql ด้วย phpmyadmin
3. import ข้อมูลจาก text file เข้า mysql ด้วย DOS Command
หมายเหตุ
1. การเลือกใช้รุ่นของ MySQL ต้องหาข้อมูล
2. moodle หรือ cms อาจใช้ได้กับ MySQL บางรุ่น

T07. การใช้ MySQL
1. เข้าห้องเก็บโปรแกรม เช่น DOS>cd c:\thaiabc\mysql\bin
2. เปิดบริการ เช่น DOS>mysqld-nt --console
3. เข้าใช้ผ่าน DOS เช่น DOS>mysql -u root -p
4. ดูค่าตัวแปรใน MySQL เช่น DOS>mysqladmin variables
5. netstat -a ใน DOS ใช้ดู Port 3306 ที่ LISTENING 
6. แก้ค่า variables โดยเติมบรรทัดด้านล่างนี้ใน my.ini
  set-variable=key_buffer=64M 
  set-variable=sort_buffer=4M 
7. เติมบรรทัดข้างล่างนี้ขณะเปิดบริการ MySQL เพื่อกำหนด my.ini 
  --defaults-file="C:\my.ini" 
8. ตัวอย่างคำสั่งน่ารู้ และเตือนให้ระวังคำสงวน
DOS>mysql -u root -p
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> delete from user where user='';
mysql> update user set password = password('upass') where user='root';
mysql> set password for 'root'@'localhost' = old_password('p'); 
mysql> flush privileges;
mysql> create database oho;
mysql> use oho;
mysql> create table wow1(
    ->id int primary key not null auto_increment ,
    ->ename  varchar(50),
    ->salary  double);
mysql> drop table wow1;
mysql> create table xx(x1 time,x2 date);
mysql> insert into xx values('09:56:51','2007-12-30');
mysql> insert into xx (x2)values('2007-12-30');
mysql> select * from xx where x2='2007-12-30';
หมายเหตุ
1. สามารถตรวจ การเปิดบริการได้
2. ปิดบริการใน Services อย่างไร

T08. การใช้ phpMyAdmin
1. กำหนด auth_type ในแฟ้ม config.ini.php ได้ 3 แบบคือ config, cookie, http
  1. config : กำหนดรหัสผ่านในแฟ้ม config.ini.php ที่ตรงกับ user ใน MySQL
ทำให้ไม่ถามรหัสจาก phpmyadmin แต่ใช้ .htaccess ตรวจสอบ ซึ่ง thaiabc ใช้อยู่
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'admin';
$cfg['Servers'][$i]['password'] = 'p'; 2. cookie : ทำให้มีช่อง login ในเว็บเพจ ต้องกำหนดทั้ง auth_type และ blowfish_secret
$cfg['blowfish_secret'] = 'admin';
$cfg['Servers'][$i]['auth_type'] = 'cookie'; 3. http : ทำให้มี pop up ขึ้นมาถามรหัสผ่าน คล้ายกับวิธีใช้แฟ้ม .htaccess
การใช้ http จะพบปัญหาเมื่อใช้กับ MySQL 4.1 ขึ้นไป เพราะ verify รหัสผ่าน ไม่ได้
ถ้าใช้ MySQL 4.0 จะไม่มีปัญหา และมีปัญหารใช้วิธีนี้ใน thaiabc 2. วิธีเพิ่มหรือเปลี่ยนรหัสผู้ใช้ในแฟ้ม htpasswd ของ apache
แก้แฟ้ม c:\thaiabc\.htpasswd โดยเข้า DOS ห้อง C:\thaiabc\apache\apache2\bin
DOS>htpasswd -n yourname แล้วคัดลอกบรรทัดสุดท้ายใส่แฟ้ม .htpasswd
แฟ้ม c:\thaiabc\.htpasswd ทำงานร่วมกับแฟ้ม .htaccess ในห้องที่ต้องการ Lock 3. สร้างแฟ้ม .htaccess ในห้องที่ต้องการควบคุม AuthUserFile c:\thaiabc\.htpasswd AuthName "User คือ admin - Password คือ p " AuthType Basic require valid-user DirectoryIndex index.html index.htm index.shtml index.php 4. การสร้างตารางไม่ให้มีปัญหาภาษาไทยใน phpmyadmin CREATE TABLE `aa` ( `aa` VARCHAR( 5 ) NOT NULL , `bb` VARCHAR( 5 ) CHARACTER SET tis620 COLLATE tis620_thai_ci NOT NULL ) TYPE = MYISAM ; 5. นำตารางออกเป็นแฟ้ม x.sql
- ใช้ phpmyadmin เปิดฐานข้อมูล students และเปิดตาราง subject
- คลิ๊ก Export จาก menu bar และคลิ๊ก checkbox ของ Save as file และ Go
CREATE TABLE `subject` (
`subj` varchar(8) default NULL,
`subjname` varchar(30) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `subject` VALUES ('1', 'คณิต');
INSERT INTO `subject` VALUES ('2', 'วิทย์');
INSERT INTO `subject` VALUES ('3', 'อังกฤษ');
- ไม่พบปัญหาภาษาไทยเมื่อเปิดด้วย notepad 6. ถ้าไม่ใช้ phpmyadmin จะไม่พบปัญหาภาษาไทยใน php + mysql
- ถ้าไม่แก้ไข Collation ใน field ก็ไม่ควรเติม set names tis620 ใน php
- ถ้าแก้ไข Collation ใน field ก็ต้องเติม set names tis620 ใน php ทุกโปรแกรม
- แฟ้มที่ export ออกไป สามารถ import ผ่านส่วน SQL ถ้าไม่มีปัญหาภาษาไทยแต่แรกแล้ว
หมายเหตุ
1. เข้าใจประโยชน์ของ phpmyadmin
2. สามารถใช้งาน phpmyadmin จัดการข้อมูล

T09. คำสั่ง insert, select, update, delete
1. ตัวอย่างคำสั่งพื้นฐาน
create table a (a1 int, a2 char(20)); 
insert into a (a1, a2) values (1, "abc"); 
select * from a; 
delete from a where a1=1; 
update a set a2="def" where a1=1;
2. ตัวอย่างคำสั่งเลือกข้อมูล
select * from a order by a2;
select salary from empl
where ((salary) between 5000 and 10000);
3. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 1
select regist.sid,subjname,grade from student,subject,regist
where student.sid = regist.sid and regist.subj = subject.subj
and student.sid = 1
order by regist.subj,subject.subjname;
4. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 2
select regist.sid, student.sname, sum(regist.score) as s 
from regist,student 
where student.sid = regist.sid group by regist.sid;
5. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 3
select regist.grade, count(regist.grade) as g 
from regist group by regist.grade; 
6. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 4
select * from student join regist
on (student.sid = regist.sid);
7. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 5
select student.sid, count(regist.sid) from student 
join regist on (student.sid = regist.sid)
where score > 60 and score < 90
group by student.sid
8. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 6
select regist.grade, max(regist.score) from regist
group by regist.grade
9. ตัวอย่างการเลือก และเชื่อมแฟ้ม แบบ 7
ผลคือ รวมคะแนนทั้งหมด และจำนวนนักเรียน(ไม่ใช่จำนวนระเบียน)
select count(sid) as cid,sum(sc) as ssc 
from (select sid,sum(score) as sc from regist group by sid) a
หมายเหตุ
1. แต่ละตัวอย่างได้ผลลัพธ์คืออะไร
2. ทดสอบฟังก์ชัน max, min, avg, sum
3. ทดสอบฟังก์ชัน mod, len, left, right
4. ทดสอบ where substr(sname,1,3)='นาย'
5. http://sqlzoo.net มีตัวอย่างให้ทดสอบ

T10. การเชื่อมตารางในฐานข้อมูล
1. การอ่านข้อมูลมาใช้ มีฟังก์ชันสำคัญ 4 ฟังก์ชัน
- mysql_connect,
- mysql_db_query หรือ mysql_select_db
- mysql_fetch_object หรือ mysql_fetch_row หรือ mysql_fetch_array
- mysql_close 2. หัวข้อนี้แสดงการเชื่อมตาราง 2 แบบคือ where และ inner join 3. ตัวอย่างอ่านข้อมูลด้วย mysql_fetch_object $c = mysql_connect("127.0.0.1:3306","admin","p"); $charset = "set names tis620"; mysql_query($charset) or die('Invalid query: '.mysql_error()); $q = "select * from help_category"; $r = mysql_db_query("mysql",$q); while ($o = mysql_fetch_object($r)) { echo "$o->name<br>"; } echo "total : ".mysql_num_rows($r); mysql_close($c); 4. ตัวอย่างอ่านข้อมูลด้วย mysql_fetch_array $c = mysql_connect("127.0.0.1:3306","admin","p"); $result = mysql_db_query("mysql","select * from help_category"); while($row = mysql_fetch_array($result)) { $i=0; while(isset($row[$i])) echo $row[$i++]; echo"<br>"; } mysql_close($c); 5. ตัวอย่างอ่านข้อมูลด้วย mysql_fetch_row <pre><? $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_select_db("mysql",$c); $q = "select * from help_category where help_category_id = 1"; $result = mysql_query($q,$c); $row = mysql_fetch_row($result); echo $row[0].$row[1].$row[2]; mysql_close($c); ?> 6. ตัวอย่างอ่านชื่อฐานข้อมูลทั้งหมดมาแสดงผล <pre><? $c = mysql_connect("127.0.0.1:3306","admin","p"); $db_list = mysql_list_dbs($c); $cnt = mysql_num_rows($db_list); while ($i < $cnt) { echo mysql_db_name($db_list, $i)."\n"; $i++; } ?> 7. ตัวอย่างอ่านตารางมาเชื่อมกันด้วย where <ol><? $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_select_db("mysql",$c); $q = "select help_topic_id,help_category.name,help_topic.name from help_category,help_topic where help_topic.help_category_id = help_category.help_category_id order by help_category.name"; $result = mysql_query("$q",$c); while($row = mysql_fetch_array($result)) { echo "<li>$row[0] $row[1] $row[2]"; } mysql_close($c); ?></ol> 8. ตัวอย่างอ่านตารางมาเชื่อมกันด้วย inner join <ol><? $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_select_db("mysql",$c); $q = "select help_topic.*,help_category.*,help_topic.name as tn from (help_topic inner join help_category on help_topic.help_category_id = help_category.help_category_id)"; $result = mysql_query("$q",$c); while($o = mysql_fetch_object($result)) { echo "<li>".$o->help_category_id; echo $o->name." ".$o->help_topic_id ." ".$o->tn; } mysql_close($c); ?></ol>
หมายเหตุ

1. catagory และ topic เทียบได้กับบ้าน และห้อง
2. ตารางแบบใดคล้าย 2 ตารางนี้

T11. การเขียนโปรแกรมจัดการข้อมูล
1. ไม่พบปัญหาภาษาไทยใน php แต่พบปัญหาใน phpmyadmin เมื่อแสดงผล หรือแก้ไข
2. แก้ปัญหาให้ใช้ phpmyadmin และ php 
เปลี่ยน collation ใน field ที่เป็นภาษาไทยจาก latin1_swedish_ci เป็น tis620_thai_ci
เพิ่ม mysql_query("set names tis620"); ต่อจาก mysql_connect เสมอ 3. ตัวอย่างโปรแกรมสร้างตาราง $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_query("set names tis620"); $sql = "create table d(a int,b varchar(20))"; $result = mysql_db_query("test",$sql); mysql_close($c); 4. ตัวอย่างเพิ่มข้อมูล if(isset($_GET["a"])) $a = $_GET["a"]; else $a=1; if(isset($_GET["b"])) $b = $_GET["b"]; else $b='กขค'; $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_query("set names tis620"); $sql = "insert into d values($a,'$b')"; $result = mysql_db_query("test",$sql); mysql_close($c); 5. ตัวอย่างการอ่านข้อมูลมาแสดงผล $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_query("set names tis620"); $result = mysql_db_query("test","select * from d"); while($o = mysql_fetch_object($result)) { echo $o->a.$o->b."<br>"; } mysql_close($c); 6. ตัวอย่างการปรับปรุงข้อมูล if(isset($_GET["a"])) $a = $_GET["a"]; else $a=1; if(isset($_GET["b"])) $b = $_GET["b"]; else $b='ลอง'; $c = mysql_connect("127.0.0.1:3306","admin","p"); mysql_query("set names tis620"); $sql = "update d set b='$b' where a=$a"; $result = mysql_db_query("test",$sql); mysql_close($c); 7. ตัวอย่างการลบข้อมูล if(isset($_GET["a"])) $a = $_GET["a"]; else $a=1; $c = mysql_connect("127.0.0.1:3306","admin","p"); $sql = "delete from d where a=$a"; $result = mysql_db_query("test",$sql); mysql_close($c);
หมายเหตุ
- สร้างตารางใหม่
- สร้างฟอร์ม
<form action='' method=get>
<input name=a>
<input name=b>
<input type=submit>
</form>

T12. ความรู้เบื้องต้นเกี่ยวกับจาวาสคริปต์
1. ภาษาจาวาสคริปต์ (JavaScript Language) คือภาษาโปรแกรมแบบหนึ่ง มีโครงสร้างคล้ายภาษาซี ทำหน้าที่แปลความหมาย และดำเนินการทีละคำสั่ง ภาษานี้มีชื่อเดิมว่า LiveScript ถูกพัฒนาโดย Netscape Navigator เพื่อช่วยให้เว็บเพจสามารถแสดงเนื้อหา ที่มีการเปลี่ยนแปลงได้ ตามเงื่อนไข หรือสภาพแวดล้อมที่แตกต่างกัน หรือโต้ตอบกับผู้ใช้ได้มากขึ้น เพราะภาษา HTML ที่เป็นภาษาพื้นฐานของเว็บเพจ ทำได้เพียงแสดงข้อมูลแบบคงที่เท่านั้น
2. ภาษาจาวา (Java Language) คือ ภาษาคอมพิวเตอร์ที่ถูกพัฒนาขึ้นโดยบริษัท ซันไมโครซิสเต็มส์ เป็นภาษาสำหรับเขียนโปรแกรมที่สนับสนุนการเขียนโปรแกรมเชิงวัตถุ (OOP : Object-Oriented Programming) โปรแกรมที่เขียนขึ้นถูกสร้างภายในคลาส ดังนั้นคลาสคือที่เก็บเมทอด (Method) หรือพฤติกรรม (Behavior) ซึ่งมีสถานะ (State) และรูปพรรณ (Identity) ประจำพฤติกรรม (Behavior)
3. ตัวอย่าง onMouseOver และ onMouseOut
<a href='http://www.thaiall.com'
onMouseOver="window.status='ไทยออล';return true;"
onMouseOut="window.status='บายบาย';return true;">
thaiall.com</a>
4. ตัวอย่างแสดงข้อมูลแยกบรรทัดละสี
<script language=JavaScript>
<!--
i = 0;
var c = new Array ();
c[i++] ='ความดี';
c[i++] ='คุณธรรม';
c[i++] ='ศีล';
c[i++] ='วินัย';
for(j=0;j<i;j++) {
  if (j % 2 == 0)
    document.write("<font color=gray>"+ c[j] + "</font> ");
  else
    document.write(c[j] + " ");
}
-->
</script>
หมายเหตุ
1. ตอบได้ว่า Javascript คืออะไร
2. ทราบความแตกต่างของ Javascript และ HTML
3. สามารถเขียน Javascript รวมกับ HTML
4. สามารถเขียน Dynamic webpage ได้

T13. ตรวจสอบข้อมูลก่อนส่ง
1. เพิ่มฟอร์มรับระเบียนข้อมูล แบบ refresh
<form action=''>
<script language=JavaScript>
<!--
function getvar(variable) {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) { 
    var pair = vars[i].split("=");
    if (pair[0] == variable) { return pair[1]; }
  } 
}
document.write("<input name=a1>");
document.write("<a href=?t=2>#</a><br>");
if (getvar("t") > 0) {
  for(j=2;j<=getvar("t");j++) {
    document.write("<input name=a" + j + ">");
    document.write("<a href=?t=" + (j + 1) +">#</a><br>");
  }
}
-->
</script>
<input type=submit>
</form>
2. เพิ่มฟอร์มรับระเบียนข้อมูล แบบไม่ refresh
<form name=f action='' method=get>
<input type=checkbox name=a selected>
<div id=frmout>
<input name=a1><a href='javascript:;' onclick='getvar(2)'>#</a><br>
</div>
<input type=submit></form>
<script language=JavaScript>
<!--
function getvar(variable) {
x = document.getElementById("frmout");
for (var j=variable;j<=variable;j++) { 
 x.innerHTML +="<input name=a" + j + ">";
 x.innerHTML +="<a href='javascript:;' onclick='getvar(" + (j + 1) +")'>#</a><br>";
} 
}
-->
</script>
3. ตัวอย่างตรวจความยาวตัวอักษร ด้วย javascrpt + php
<script type="text/javascript">
function chklen() {
  var n = document.f.n;
  if (n.value.length > 3) 
    document.f.submit();
  else 
    alert("should more than 3");
}
</script>
<? if (!isset($_GET["n"])) { ?>
<form name=f action="" method=get>
your name :<input name=n> 
<input type=button value=send onclick={chklen();}>
</form>
<? exit; }  ?>
<a href="?">Logout</a>
หมายเหตุ
1. ท่านว่าแบบใดเหมาะกับท่าน เพราะอะไร
2. 2 บรรทัดนี้เขียนอย่างไรให้ถูกต้อง #
href='javascript:;'
onclick='alert("a")'

T14. ยืนยันการส่งข้อมูล
1. ตัวอย่างการถาม ยืนยัน แบบเขียนฟังก์ชัน
<script type="text/javascript">
function confirmSend() {
  alert("Ask for confirm?"); 
  if (confirm("confirm ??")) {
    document.f.submit();
   } else {
    alert("cancel"); 
  }
}
</script>
<? if (!isset($_GET["n"])) { ?>
<form name=f action="" method=get>
your name :<input name=n> 
<input type=button value=send onclick={confirmSend();}>
</form>
<? exit; }  ?>
<a href="?">Login</a>
2. ตัวอย่างการถาม ยืนยัน แบบไม่เขียนฟังก์ชัน
<? if (!isset($_GET["n"])) { ?>
<form name=f action="" method=get>
your name :<input name=n> 
<input type=button value=send 
onclick="javascript:if(confirm('ok'))document.f.submit();">
</form>
<? exit; }  ?>
<a href="?">Login</a>

หมายเหตุ
1. แฟ้มนี้ควรมีสกุลใด เพราะเหตุใด
2. ใช้ confirm() แสดง Ok+Cancel เพื่ออะไร
3. ใช้ alert() แสดง Ok เพื่ออะไร

T15. ความรู้เบื้องต้นเกี่ยวกับเซสชัน และคุกกี้
1. คุกกี้ (Cookie) คือ ข้อมูลขนาดเล็กที่เป็น HTTP Header แบบหนึ่ง ถูกส่งจากเครื่องบริการไปเก็บไว้ในเครื่องของผู้ใช้ตามที่บราวเซอร์กำหนด เพื่อบันทึกข้อมูลการเข้าเยี่ยมชม เมื่อผู้ใช้เข้าไปเยี่ยมชมเว็บไซต์อีกครั้ง เครื่องบริการจะใช้ข้อมูลคุกกี้ที่มีอยู่ในเครื่องของผู้ใช้ได้ทันที
2. เซสชัน (Session) คือ ข้อมูลที่ถูกสร้างขึ้นเมื่อใช้บราวเซอร์ ติดต่อเข้าเครื่องบริการ และถูกทำลายเมื่อบราวเซอร์ถูกปิดลง ข้อมูลนี้ถูกจัดเก็บในเครื่องบริการ
3. ตัวอย่างการสร้าง ใช้ และเลิกใช้ เซสชัน
session_start();
$_SESSION["a"] = 1;
echo $_SESSION["a"];
session_unset();
$_SESSION["b"] = 2;
print_r($_SESSION);
session_unset();
print_r($_SESSION);
//1Array ( [b] => 2 ) Array ( )
4. ตัวอย่างการสร้าง คุกกี้ (ไม่แสดงผลทางจอภาพ)
setcookie("a","tom",time() + 3600); // 1 HR
5. ตัวอย่างใช้ และเลิกใช้ คุกกี้
echo $HTTP_COOKIE_VARS["a"];
echo $_COOKIE["a"];
setcookie("a","",0); // unset
print_r($_COOKIE); // still set after unset
หมายเหตุ
1. เขียน session_start() อย่างไรให้ผิด
2. cookie กับ session ต่างกันอย่างไร
3. ผลลัพธ์ของ count($_SESSION); คืออะไร

T16. การใช้งานเซสชัน
1. Proxy Server หรือ Cache Server เป็นอุปกรณ์ในเครือข่ายคอมพิวเตอร์ชนิดหนึ่ง ทำหน้าที่เก็บข้อมูลเว็บเพจ ที่ถูกผู้ใช้ในเครือข่ายเรียกดู เมื่อมีเว็บเพจใดถูกเรียกใช้ซ้ำ และเคยถูกจัดเก็บไว้แล้ว ก็จะนำข้อมูลนั้น ไปใช้ได้ทันที
2. ระวังปัญหา Proxy ดูจาก IE, Tools, Internet Options, Connections, LAN Setting
3. ตัวอย่างการใช้เซสชั่น
<?
session_start();
if (isset($_GET['a'])) {
  if (isset($_SESSION['a'])) 
    session_unset('a');
  $_SESSION['a'] = $_GET['a'];
}
if (isset($_SESSION['a'])) {
  $_SESSION['a']++;
  echo $_SESSION['a'];
}
// first = null (refresh is same)
// start = 6 (click is same)
// clearz = cleasa (click is same)
// next = increase 
?>
<a href='?a=5'>start</a> 
<a href='?a=clearz'>clearz</a>
<a href='?'>next</a>
หมายเหตุ
1. proxy คืออะไร
2. proxy เกี่ยวกับ session อย่างไร

T17. การใช้งานคุกกี้
1. บางเครื่องใช้ไม่ได้ ดูที่ IE, Tools, Internet Options, Privacy, Setting, Block All Cookies
2. ตัวอย่างการใช้คุกกี้
<?
// result of cookie in next load
if (isset($_GET['a'])) {
  if ($_GET['a'] == "clear") 
    setcookie("a","",0); // expired
  if ($_GET['a'] == "5")
    setcookie("a",$_GET['a'],time() + 3600); // 1 HR
}
if (isset($_COOKIE['a'])) {
  if (!$_GET['a'])
    setcookie("a",$_COOKIE["a"] + 1,time() + 3600); // 1 HR
  echo $HTTP_COOKIE_VARS["a"];
  print_r($_COOKIE); // $_COOKIE["a"]
}
?>
<a href='?a=5'>start</a> 
<a href='?a=clear'>clear</a>
<a href='?'>next</a>
หมายเหตุ
1. การกำหนด Block All Cookies เป็นข้อดีหรือไม่
2. ควรใช้ cookie เมื่อใด

T18. ความรู้เบื้องต้นเกี่ยวกับตัวนับ
1. การใช้ตัวนับคือการเพิ่มค่า ทำให้ทราบว่าค่าปัจจุบันคือเท่าใด
1.1 สามารถนับจำนวนคนเข้าเว็บเพจแต่ละหน้า หรือทั้งเว็บไซต์
1.2 สามารถนับจำนวนหน้าที่เข้าใช้ของแต่ละคน 2. ค่า session จะถูก clear เมื่อปิดเว็บเพจ 3. อาจเก็บข้อมูลในสื่อ และแยกข้อมูลด้วย date("d/m/Y H:i:s"); 4. ตัวอย่างนับการ Reload Webpage ด้วย session session_start(); if(isset($_SESSION["cnt"])) $_SESSION["cnt"]++; else $_SESSION["cnt"] = 0; echo $_SESSION["cnt"];
หมายเหตุ
1. นับ reload คืออะไร
2. เก็บข้อมูลตัวนับ มีวิธีใดบ้าง

T19. การใช้แฟ้มตัวอักษร
1. ตัวอย่างนับเฉพาะหน้าผ่าน text file
$fn ="cnt.txt";
$cnt=0;
if (file_exists($fn)) {
  $file = fopen($fn,"r");
  $cnt = fgets($file,255);
  fclose($file);
}
$file = fopen($fn,"w");
fputs($file,++$cnt);
fclose($file);
echo $cnt;
2. ตัวอย่างการหาชื่อแฟ้ม
$s = $_SERVER["SCRIPT_URL"]; // /test.php
$a = split('/',$s);
echo $a[count($a) - 1];
echo str_replace("/","",$s);
3. ตัวอย่างการอ่านข้อมูลมาไว้ในอาร์เรย์
$a = file("test.php");
print_r($a);
หมายเหตุ
1. จะสร้าง text file อย่างไร
2. ตรวจ Size on disk อย่างไร

T20. การใช้มายเอสคิวแอล
1. ตัวอย่างการสร้างตารางเก็บตัวนับใน mysql
$c = mysql_connect("127.0.0.1:3306","admin","p");
$result = mysql_db_query("test","create table cnt(c int)");
if (!$result) echo "fail"; else {
echo "ok";
$result = mysql_db_query("test","insert into cnt values(1)");
}
mysql_close($c);
2. ตัวอย่างตัวนับใน mysql
$c = mysql_connect("127.0.0.1:3306","admin","p");
$result = mysql_db_query("test","select * from cnt");
$row = mysql_fetch_row($result);
$sql = "update cnt set c=" . ++$row[0];
echo $row[0];
$result = mysql_db_query("test",$sql);
mysql_close($c);
หมายเหตุ
1. $x++ ต่างกับ ++$x อย่างไร
2. คำสั่ง เพิ่ม ลบ แก้ไข ในภาษา SQL คืออะไร

T21. ความรู้เบื้องต้นเกี่ยวกับอัพโหลด
1. ฟังก์ชันที่ใช้สำหรับการ upload คือ copy()
2. ใน form ต้องใช้ enctype="multipart/form-data" จึงจะใช้ตัวรับเป็น $_FILES
3. ขนาดของแฟ้มที่ php รับผ่านการ post กำหนดใน php.ini คือ upload_max_filesize
4. การเปิดบริการ FTP ในเครื่องคอมพิวเตอร์ ส่วนใหญ่เปิด Port 21
หมายเหตุ
1. การส่งข้อมูลเข้า server มีหลายวิธี
1.1 Filemanager
1.2 FTP
1.3 Copy and Paste
1.4 Directory Sharing

T22. การอัพโหลดแฟ้ม (File Uploading)
1. ตัวอย่างฟอร์ม และคำสั่งอัพโหลด
<form action='' enctype="multipart/form-data" method=post>
<input type=file name=up>
<input type=submit>
</form>
<?
if (isset($_FILES["up"]["name"]) 
&& copy($_FILES["up"]["tmp_name"],$_FILES["up"]["name"]))
  echo "upload : process";
else
  echo "upload : error";
?>
หมายเหตุ
1. ถ้าเพิ่มแฟ้ม upload จะเขียนอย่างไร
2. ฟังก์ชันใด ใช้นำแฟ้มเข้าเครื่อง

T23. การลบแฟ้ม (File Deleting)
1. ตัวอย่างการอ่านชื่อแฟ้มในไดเรกทรอรี่
<pre><?
$dir_handle=opendir("./article");
while ($file = readdir($dir_handle)) {
if ($file != "." && $file != "..") {
  echo strtolower($file)."\n";
}
}
closedir($dir_handle);
?>
2. ตัวอย่างการลบแฟ้ม และไดเรกทรอรี่
echo filetype("pda.htm"); // file
echo filetype("article"); // dir
mkdir("xx",0777);
echo file_exists("xx"); // 1
unlink("pda.htm");
unlink("article\mobile.htm");
rmdir("article");
หมายเหตุ
1. ฟังก์ชันใด ใช้ลบแฟ้ม
2. ฟังก์ชันใด ใช้ลบไดเรกทรอรี่

T24. ความรู้เบื้องต้นเกี่ยวกับกราฟฟิก
1. ตัวอย่างนำภาพมาใช้ด้วย imagecreatefromgif
$im = imagecreatefromgif("arrow.gif");
imagegif ($im);
2. ตัวอย่างนำภาพมาใช้ fopen
//header("Content-Type: image/gif");
//$fn=fopen("arrow.gif","r");
//fpassthru($fn);
header("Content-Type: image/jpeg");
$fn=fopen("i_demo.jpg","r");
fpassthru($fn);
3. ตัวอย่างการลงสี
header("Content-type: image/jpeg");
$imagesize = 100;
$myImage = imageCreate($imagesize, $imagesize);
$red = imageColorAllocate($myImage, 255, 0, 0);
imagefill($myImage,0,0, $red);
Imagejpeg($myImage);
Imagedestroy($myImage);
หมายเหตุ
1. ประโยชน์ของตัวอย่างเหล่านี้คืออะไร
2. gif และ jpg และ png ต่างกันอย่างไร

T25. การเขียนภาพกราฟฟิก
1. ตัวอย่างเขียนข้อความบนภาพ
$msg = "THAI";
if (isset($_GET["msg"])) $msg = $_GET["msg"];
$im = imagecreatefrompng("a3.png");
$yellow = ImageColorAllocate($im, 255, 255, 0);
imagestring ($im, 5, 1, 10, $msg, $yellow);
imagepng ($im);
imagedestroy($im);
2. ตัวอย่างเขียนภาพด้วย jpeg
$msg = "THAI";
if (isset($_REQUEST["msg"])) $msg = $_REQUEST["msg"];
header("Content-type: image/jpeg");
$imagesize = 100;
$im = imageCreate($imagesize, $imagesize);
$white = imageColorAllocate($im, 255, 255, 255);
$red = imageColorAllocate($im, 255, 0, 0);
imagefill($im, 0, 0, $white);
imagerectangle($im, 0, 20, 90, 99, $red); 
imagearc($im, 50, 50, 50, 50, 0, 360, $red);
imageline($im, 5, 5, 90, 90, $red);
imagestring($im, 0, 5, 5, $msg, $red);
imagepolygon($im, array(0,0,70,90,10,80),3,$red);
Imagejpeg($im);
Imagedestroy($im);
3. ตัวอย่างเขียนภาพด้วย png
header("Content-type: image/png");
$imagesize = 100;
$im = imageCreate($imagesize, $imagesize);
$white = imageColorAllocate($im, 255, 255, 255);
$red = imageColorAllocate($im, 255, 0, 0);
$yel = imageColorAllocate($im, 255, 255, 100);
imagefill($im, 0, 0, $white);
imagefilledarc($im, 0, 0, 99, 99, 0, 360, $yel, IMG_ARC_PIE);
imagearc($im, 0, 0, 99, 99, 0, 360, $red);
imagerectangle($im, 0, 0, 99, 99, $red); 
imagestring($im, 0, 10, 10, "hello", $red);
imagestring($im, 2, 10, 20, "hello", $red);
imagestring($im, 6, 10, 30, "hello", $red);
imagestring($im, 36, 10, 50, "hello", $red);  // same 6
Imagepng($im);
Imagedestroy($im);
หมายเหตุ


T26. การรับส่งอีเมลด้วยพีเอชพี
1. ตัวอย่างฟอร์มรับอีเมล 
<form action='' method=post>
From <input name=from>
To <input name=to>
Subject <input name=subj>
Message <textarea name=message rows=10 cols=80></textarea> 
<input type=submit value='Send mail'>
</form>
2. คำสั่งส่งอีเมล
// mail("abc@x.com","hello friend","are you ok?","From: jojo@x.com");
mail("$_REQUEST['to']","$_REQUEST['subj']","$_REQUEST['message']","From: $_REQUEST['from']");
3. ตัวอย่างฟอร์มรับอีเมล และคำสั่งส่งอีเมล ในโปรแกรมเดียวกัน
if (!isset($_REQUEST{"from"})) $_REQUEST{"from"} = "";
if (!isset($_REQUEST{"to"})) $_REQUEST{"to"} = "";
if (!isset($_REQUEST{"subj"})) $_REQUEST{"subj"} = "";
if (!isset($_REQUEST{"message"})) $_REQUEST{"message"} = "";
if (!isset($_REQUEST{"redirect"})) $_REQUEST{"redirect"} = "";
$from = $_REQUEST{"from"};
$to = $_REQUEST{"to"};
$subj = $_REQUEST{"subj"};
$message = $_REQUEST{"message"};
$redirect = $_REQUEST{"redirect"};
if (strlen($redirect) < 2) $redirect = "http://www.yonok.ac.th";
if ((strlen($to) == 0) || (strlen($from) == 0) || (strlen($from) == 0)) {
  echo "<form action='' method=post>";
  echo "จาก <input name=from value='$from' size=30><br>";
  echo "ถึง <input name=to value='$to' size=30><br>";
  echo "ชื่อเรื่อง <input name=subj value='$subj' size=50><br>";
  echo "ข้อความ <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 {
  $subj = "Subject _ ".$subj;
  mail("$to","$subj",$message,"From: $from\r\n"
  ."Reply-To: $from\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("$to","$subj",$message,"From: $from\nX-Mailer: PHP/" . phpversion());
  echo "<html><head><meta http-equiv=Refresh content='50; URL=$redirect'>";
  echo "</head><body><font face=fixedsys><pre>";
  echo "From    : $from \n";
  echo "To      : $to \n";
  echo "Subject : $subj \n";
  echo "Message :<ul><font color=gray>" . htmlentities($message) ."</ul>";  
  // htmlentities แปลง html ให้แสดงเป็น text 
}

T27. การใช้เชลคอมแมน
1. สัญลักษณ์ ` คือ Ascii ตัวที่ 96 ใน 256 ใช้ปิดหัวท้ายคำสั่ง
2. ปิด shell_exec โดยเปลี่ยนจาก safe_mode = Off เป็น On ใน php.ini 
3. ตัวอย่างในระบบปฏิบัติการ Windows
<? 
echo "<pre><font face=fixedsys>";
$cmd =`echo dir %WINDIR%\*.bmp > b.bat`;
$cmd =`type b.bat`;
echo "<hr>$cmd";
$cmd =`b.bat`;
echo "<hr>$cmd";
$cmd =`echo rem hello test > b.bat`;
$cmd =`echo @echo off >> b.bat`;
$cmd =`echo dir %WinDir%\*.exe >> b.bat`; // windows
$cmd =`echo dir %UserProfile% /w >> b.bat`; // htdocs
$cmd =`echo set >> b.bat`;
$cmd =`type b.bat`;
echo "<hr>$cmd";
$cmd =`b.bat`;
echo "<hr>$cmd";
?>
4. ตัวอย่างสร้าง และลบแฟ้ม
<? 
echo "<pre><font face=fixedsys>";
$cmd =`echo dir %WINDIR% > b.bat`;
$cmd =`dir b.bat`;
echo "<hr>$cmd"; // 17 Bytes
$cmd =`del b.bat`;
$cmd =`dir b.bat`;
echo "<hr>$cmd";
?>
5. ตัวอย่างใช้ shell_exec (ไม่ต่างจากก่อนหน้านี้)
<? 
echo "<pre><font face=fixedsys>";
$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";
?>
6. ตัวอย่างเกี่ยวกับเวลา
echo date("d/m/Y H:i:s"); // 26/02/2007 09:13:09
echo time();  // 1172509989
echo microtime(); // 0.49982500 1172509989
echo (microtime() + microtime()); // 0.999836

หมายเหตุ
1. แสดงข้อมูลจากแฟ้ม win.ini
2. แสดงผลจากการใช้คำสั่ง set ใน DOS
3. ทำไม dir %WINDIR% ได้ 17 Bytes
4. ถ้า safe_mode = Off ดีหรือไม่
5. shell_exec() โดย hacker มีผลเสีย?

T28. ศึกษาระบบแกลลารี่อย่างง่าย (Photo Gallery)
1. ใช้โปรแกรม IrfanView สร้าง Gallery อย่างง่าย (Thumbnail, Enlarge)
2. อ่านแฟ้มภาพมาแสดงเป็น Gallery ด้วย PHP
- แบบง่ายที่สุด
- แบบจัดหมวดหมู่ และไม่มี Thumbnail
- แบบเก็บใน MySQL
- แบบใช้ระบบ Photo Gallery เต็มระบบ



T29. ศึกษาระบบยืนยันตัวตนด้วยภาพอักษร (Image Verification)
1. ตัวอย่างแสดงภาพด้วย HTML ชื่อ a.htm
<img src=x.php>
2. ตัวอย่างโปรแกรมแสดงภาพตัวอักษร ชื่อ x.php
<?
// session_save_path("/tmp");
session_start();
srand(time());
$n = "";
for ($i=1;$i<=8;$i++) $n = $n.chr((rand()%26)+65);
$_SESSION['secure'] = base64_encode($n);
header("Content-type: image/png");
$im = @imagecreate (100,20); // w,h
$r = rand() % 100;
$bcolor = ImageColorAllocate($im,$r,$r,$r);
imagefill($im, 0, 0, $bcolor);
for ($i = 0; $i <=8; $i++) {
 $r = rand() % 100;
 $rcolor = ImageColorAllocate($im, 150+$r,150+$r,50+$r);
 imagestring ($im,6,$i*12,rand()%5,substr($n,$i,1),$rcolor);
 // imagestring(img,size,col,row,char,color)
}
imagepng ($im);
imagedestroy($im); 
?>
3. ตัวอย่างการตรวจสอบค่าเซสชัน ชื่อ y.php
if ($_POST["secure"] != base64_decode($_SESSION['secure']))


imagerotate($im, 30, 0);

T30. ศึกษาระบบซีเอ็มเอส
1. ศึกษา lovelampang.com ในห้อง /ecom ของ thaiabc.com
2. แฟ้มชุดนี้แบ่งได้ 4 กลุ่ม
- ภาพกลุ่ม template
- ภาพกลุ่ม สินค้า
- โปรแกรมกลุ่มข้อมูลทั่วไป หรือเฉพาะงาน
- โปรแกรมกลุ่มประมวลผล
3. โปรแกรมกลุ่มข้อมูลทั่วไป หรือเฉพาะงาน
- icontact.php
- ipromotion.php
- iradio.php
- isendmail.php
- isource.php
- itravel.php
- iwebboard.php
4. โปรแกรมกลุ่มประมวลผล
- config.inc.php
- iadmin.php
- iblog.php
- icart.php
- icolumn3.php
- idetail.php
- ifooter.php
- ifootersub.php
- igroup.php
- iheader.php
- iheadersub.php
- imanagefile.php
- imember.php
- imenu.php
- index.php
หมายเหตุ
1. ใช้งานโปรแกรมระบบ admin อย่างไร
2. เพิ่ม หรือเปลี่ยน template อย่างไร
3. หาคำตอบให้ได้ว่าโปรแกรมใดทำหน้าที่อะไร



T31. ศึกษาระบบสมาชิก
1. ศึกษา Intranet School
- ข้อมูลจัดเก็บใน c:\thaiabc\school
- โปรแกรมจัดเก็บใน c:\thaiabc\apache\apache2\htdocs\school
- แฟ้มข้อมูลนักเรียน engl001s.txt บรรทัดแรกเก็บรหัสครูประจำวิชา
teacher,thai1001
1001,MR.BOY SUPERMAN,thai1001
- แฟ้มข้อมูลข้อสอบ engl001q.txt
qg001,สุนัขทั่วไปมีกี่ขา,1,2,3,4,4
- แฟ้มข้อมูลผลการสอบของนักเรียน engl001r.txt
1256,127.0.0.1,8/5/2005 11:58 am,2,3,2,2,3
- ทั้ง quiz.php และ loginout.php ไม่ใช้ function แต่ใช้ if เลือกกระทำ 2. โปรแกรม quiz.php
- สร้างแฟ้มเก็บผลสอบ ถ้าไม่เคยมีแฟ้มนี้มาก่อน
- เก็บคะแนนนักเรียนเข้าแฟ้ม
- ดูผลสอบโดยนักเรียน จาก $yourscore
- ดูผลสอบโดยครู แบบ ดูข้อมูลดิบผลสอบ
- ดูผลสอบโดยครู แบบ ดูผลสอบ
- ดูผลสอบโดยครู แบบ ดูผลวิเคราะห์ข้อสอบ
- แสดงคำถามให้นักเรียนตอบ script confirm 3. โปรแกรม loginout.php
- แสดงตัวเลือกให้กระทำ
- เก็บ session หรือลบค่าใน session
หมายเหตุ
1. ถ้าเพิ่มวิชาใหม่ต้องทำอย่างไร
2. ถ้ามีข้อมูลนักเรียนใน .mdb จะนำมาใช้อย่างไร
3. ถ้าเปลี่ยนชื่อแฟ้มทั้งหมด ต้องแก้ไขอะไรบ้าง



T32. ศึกษาระบบเว็บบอร์ด
1. ศึกษา webboard.php 1.3c
- กำหนดตัวแปร
- ใช้ if เลือกกระทำตามฟังก์ชัน
- send_topic() เพิ่มกระทู้ใหม่ และภาพ เข้า folder ที่กำหนด
- add_topic() แสดงฟอร์มรับกระทู้ใหม่ จากผู้ใช้
- view_topic() แสดงรายละเอียดกระทู้ และความคิดเห็น และรับความคิดเห็นเพิ่ม
- list_main() แสดงชื่อกระทู้ทีละหน้า
- reply_topic() เพิ่มความคิดเห็นต่อท้ายแฟ้มกระทู้
- secure_code_r() แสดง image security สำหรับฟอร์มตอบกระทู้
- secure_code() แสดง image security สำหรับฟอร์มเพิ่ม และแก้ไขกระทู้
- delete_topic() ลบกระทู้
- edit_topic() แก้ไขกระทู้
- user_login_form() ฟอร์มเข้าระบบ ถ้า $program_type == "puser"
- text_header() แสดงส่วนหัวของกระทู้
- text_footer() แสดงส่วนท้ายของกระทู้
- startup_firsttime() สำหรับการเปิดโปรแกรมครั้งแรก จะติดตั้งอัตโนมัติ
หมายเหตุ
1. ตัวแปร $webmaster_password ถูกใช้เมื่อใด
2. ตัวแปร $edit_topic_password ถูกใช้เมื่อใด
3. ตัวแปร $program_type มีค่าอะไรได้บ้าง
4. ฝึกใช้ $file_header และ $file_footer (x.htm)



T33. ศึกษาระบบเว็บโฮสติ้ง
1. ศึกษา filemanager.php ของ thainame.net
- กำหนดตัวแปร
- ใช้ if เลือกกระทำตามฟังก์ชัน
- regist_user1() แสดงฟอร์มรับข้อมูลสมาชิกใหม่
- regist_user2() เก็บข้อมูลเข้าแฟ้มสมาชิก และสร้างห้องสมาชิกใหม่
- user_listing() แสดงรายชื่อสมาชิก
- user_login1() ล้างค่า login และแสดงฟอร์ม login ใหม่
- user_login2() ตรวจรหัส และเก็บข้อมูลการเข้าใช้
- user_logout() ล้างค่า login
- upload_file() ควบคุมการนำแฟ้มเข้าพื้นที่ส่วนของสมาชิก
- delete_file() ลบแฟ้มของสมาชิก
- edit_user1() แสดงฟอร์มรับข้อมูล มาแก้ไขข้อมูลสมาชิก
- edit_user2() แก้ไขข้อมูลผู้ใช้
- edit_html1() แสดงแฟ้ม html มาให้แก้ไข
- edit_html2() แก้ไขแฟ้ม html
- create_folder() สร้างห้องเก็บข้อมูลใหม่ หรือ sub directory ในห้องสมาชิก
- folder_listing() แสดงรายชื่อแฟ้มในห้องปัจจุบัน ถ้ากำหนดให้ $create_user = "0"
- delete_user() ลบสมาชิก และข้อมูลทั้งหมดของสมาชิก
- create_admin_password() แสดงผลการเข้ารหัสผู้ดูแล เพื่อใช้ใน $admin_password
- view_source() แสดงรหัสต้นฉบับของ filemanager.php
- write_secret_image() แสดง image security สำหรับการ upload
- space_used() แสดงพื้นที่ว่าง หรือที่เหลือ ของสมาชิก
- check_password() ตรวจสอบสิทธิ์การเป็นสมาชิก
- filelisting() แสดงรายชื่อแฟ้มของสมาชิก
- upload_file_sub($up) นำแฟ้มเข้าเก็บในห้องของสมาชิก
- faqs() แสดงคำถาม - คำตอบ
- user_functions() แสดงเมนูสำหรับสมาชิก หลัง login
- footer() แสดงส่วนท้ายของเว็บเพจ
หมายเหตุ
1. เปลี่ยนค่า $admin_password อย่างไร
2. ลบสมาชิกด้วยวิธีใด
3. กำหนดสกุลของแฟ้มที่อนุญาตผ่านตัวแปรใด
4. กำหนดประเภทผู้ใช้ด้วยวิธีใด



T34. การสร้างระบบติดตั้ง
1. โปรแกรมสร้างตัวติดตั้งชื่อ NSIS = Nullsoft Scriptable Install System
2. Download จาก http://nsis.sourceforge.net/Download
3. การสร้างตัวติดตั้ง 5 ขั้นตอน
1. ติดตั้ง NSIS เพื่อใช้แปลแฟ้ม .nsi
2. ต้องมีแฟ้มโปรแกรมประยุกต์ เช่น c:\log1.exe
3. สร้างแฟ้มคำสั่ง เช่น x.nsi อาจสร้างแฟ้มนี้ด้วย notepad
4. right click เหนือแฟ้ม x.nsi แล้วแปล จะได้ log1setup.exe เป็นผลการแปล
5. นำ log1setup.exe ไปประมวลผลในเครื่องเป้าหมาย จะได้ c:\windows\log1.exe
หมายเหตุ
1. บอกประโยชน์ของ NSIS
2. ใช้ NSIS ง่ายกว่าไม่ใช้อย่างไร

T35. ฝึกติดตั้งระบบที่พัฒนาขึ้นในเครื่องอื่น
1. ชื่อแฟ้ม เช่น x.nsi, log1.exe หรือ log1setup.exe เป็นเพียงตัวอย่าง ท่านเปลี่ยนได้
- x.nsi คือแฟ้มที่ท่านสร้างขึ้นด้วย Notepad เป็นการกำหนดในสิ่งที่ต้องการ
- log1.exe คือโปรแกรมที่ท่านต้องการให้มีในเครื่องอื่น ปัจจุบันเก็บใน c:\ (แฟ้มนี้อาจสร้างด้วย VB)
- log1setup.exe คือโปรแกรมที่ถูกสร้างขึ้น เมื่อนำไปประมวลผลในเครื่องอื่นจะสร้างแฟ้ม log1.exe ใน c:\windows 2. ตัวอย่างแฟ้ม x.nsi Caption "Log version 1.0" OutFile "log1setup.exe" InstallDir "c:\windows" Section "install" SetOutPath "$INSTDIR" File "c:\log1.exe" File "c:\log2.gif" File "c:\log3.mdb" SetOutPath "$INSTDIR\media" File "c:\readme.htm" ; File "c:\xxx\*" CreateShortCut "$SMPROGRAMS\Startup\log1.lnk" "$INSTDIR\log1.exe" SectionEnd

Work Shop 1 : สร้างฐานข้อมูล และตารางนักเรียน
1. ตัวอย่างตาราง 3 ตารางเกี่ยวกับระบบนักเรียน [student97.mdb]

? ทั้ง 3 ตารางนี้มีอะไรที่น่าสงสัยบ้าง .. เพราะคำถาม ก็คือคำตอบในตัว
2. ตัวอย่าง SQL ที่ใช้สร้างตาราง
create database students;
use students;
create table student(sid varchar(20), sname varchar(50));
create table regist(ryear int, rsem int, subj varchar(8),sid varchar(20), score int,grade varchar(3));
create table subject(subj varchar(8), subjname varchar(30));
3. ตัวอย่างการใช้ SQL ใน PHP
$c = mysql_connect("127.0.0.1:3306","admin","p");
mysql_query("set names tis620");
if (!$result=mysql_query("create database students;"))
  echo "create db : error";
else {
$sql = "create table student(sid varchar(20), sname varchar(50));";
$result = mysql_db_query("students",$sql);
$sql = "create table regist(ryear int, rsem int, subj varchar(8),sid varchar(20), score int,grade varchar(3));";
$result = mysql_db_query("students",$sql);
$sql = "create table subject(subj varchar(8), subjname varchar(30));";
$result = mysql_db_query("students",$sql);
echo "create db & tb : ok";
}
mysql_close($c);
4. ตัวอย่างการใช้ SQL ใน PHP เพิ่มข้อมูล
$c = mysql_connect("127.0.0.1:3306","admin","p");
mysql_query("set names tis620");
$ar = array(
"insert into student values('1','นาย สมปอง สมชาย')",
"insert into student values('2','นาย กะทิ ชาวเกาะ')",
"insert into regist values(2550,1,'1','1',52,'ง')",
"insert into regist values(2550,1,'1','2',81,'ก')",
"insert into regist values(2550,1,'2','1',62,'ค')",
"insert into regist values(2550,1,'2','2',85,'ก')",
"insert into regist values(2550,2,'3','1',55,'ง')",
"insert into regist values(2550,2,'3','2',66,'ค')",
"insert into subject values('1','คณิต')",
"insert into subject values('2','วิทย์')",
"insert into subject values('3','อังกฤษ')");
// foreach ($ar as $v) echo $v."<br>";
foreach ($ar as $v) 
$result = mysql_db_query("students",$v);
$result = mysql_db_query("students","select * from student");
echo mysql_num_rows($result);
mysql_close($c);
5. ตัวอย่างนับระเบียน
$c = mysql_connect("127.0.0.1:3306","admin","p");
$result = mysql_db_query("students","select * from student");
echo mysql_num_rows($result);
mysql_close($c);

Work Shop 2 : การแปลงข้อมูล (Data Convertion)
1. มีข้อมูลใน Microsoft Access เช่น student97.mdb
2. คัดลอกข้อมูลจากตารางใน Microsoft Access แล้ว Paste ลงไปใน Microsoft Excel
3. พิมพ์สูตรนำข้อมูลมารวมกันเป็น SQL Command ใน Microsoft Excel
สูตร ="insert into student values('" & A1 & "','" & B1 & "');" 4. คัดลอกข้อมูลไปใส่ใน Notepad เพื่อนำไป import ใน phpmyadmin หรือ mysql ได้โดยสะดวก 5. นำแฟ้ม .sql เข้าฐานข้อมูล ทำได้ 3 วิธี
- import เข้า แฟ้ม .sql หลังเลือก database แล้ว ใน sql ของ phpmyadmin
- เปิด .sql ด้วย notepad แล้ว copy ไป past ใน sql ของ phpmyadmin
- ใช้ mysql command ใน text mode เช่น DOS>mysql students < x.sql

Work Shop 3 : การสร้างฟอร์ม และรับค่าจากฟอร์ม
1. ตัวอย่างจัดเรียงของข้อมูลที่รับเข้ามา
<form action='' method=get>
<input name=a2 value=5>
<input name=a1 value=9>
<input name=a3 value=8>
<input type=submit>
</form>
<? 
foreach($_REQUEST as $v) echo $v; // 598
ksort($_REQUEST);
foreach($_REQUEST as $v) echo $v; // 958
sort($_REQUEST);
foreach($_REQUEST as $v) echo $v; // 589
?>
2. ตัวอย่างสร้างฟอร์มแบบมีลำดับ
<form action='' method=get>
<? for($i=8;$i<=12;$i++) { ?>
<input name=a<?
echo sprintf("%03d",$i);
?> value=<?=$i?>>
<? } ?>
<input type=submit>
</form>
<? 
foreach($_REQUEST as $k=>$v) echo $k; 
// a008a009a010a011a012
?>
3. ตัวอย่างรับค่าจาก textarea
<form action='' method=post>
<textarea name=t>
a,b,c,d
e,f,g,h,i
</textarea>
<input type=submit>
</form>
<? 
$ar = split("\r\n",$_REQUEST["t"]);
foreach($ar as $v) {
  if(strlen($v) > 0) echo $v."<hr>";
}
echo count($ar); // 3
?>
4. ตัวอย่างรับ SQL จาก textarea (คล้าย textarea ของ phpmyadmin)
<body bgcolor=#ffffdd>
<b>database</b>: test <b>table</b>: student, subject, regist<br>
<form action=''>
<input name=db value=students>
<input type=checkbox name=select checked>
<input type=submit value=query><br>
<textarea name=q rows=6 cols=100>
<? if (isset($_REQUEST["q"])) echo $_REQUEST["q"]; else { ?>
select * from student,subject,regist
where student.sid = regist.sid and regist.subj = subject.subj
order by regist.ryear,regist.sid
<? } ?>
</textarea>
</form>
<hr>
<?
$c = mysql_connect("127.0.0.1:3306","admin","p");
if (!isset($_REQUEST["db"])) $db = "students"; else $db = $_REQUEST["db"];
if (isset($_REQUEST["q"]) && strlen($_REQUEST["q"]) > 5) {
  $q = stripslashes($_REQUEST["q"]);
} else {
  $q = "select * from student";
}
$result = mysql_db_query($_REQUEST["db"],$q);
if (isset($_REQUEST["select"])) {
  while($row = mysql_fetch_array($result)) {
    for($i=0;$i<count($row);$i++)
    if(isset($row[$i])) echo $row[$i]."_";
    echo "<hr>";
  }
}
mysql_close($c);
?>


โครงการพัฒนาโปรแกรมเมอร์ทางการศึกษาระยะที่ 2
หลักสูตร การสร้างเว็บแอพลิเคชันด้านการบริหาร และจัดการการศึกษา PHP & MySQL (2 - 5 เมษายน 2550)
รายชื่อผู้เข้ารับการอบรม
ณ แม่ต่ำการ์เด้นท์ฮิลล์รีสอร์ท
อ.เมือง จ.ลำปาง
teacher.txt
ผู้รับการอบรม : อภิโชค สันตะจิตต์ + บรรลังษ์ ลังการัตน์ + มงคล ใบแสง + ชาติ หมีเอี่ยม + ชาติ ตันกุระ + ธรรมนูญ เสาร์แก้ว + พีรศิษฐ์ เผ่าต๊ะใจ + ชูเกียรติ เมืองกรุง + สัญญา เสียงหวาน + สุณา รัตนชีวพงศ์ + ศักดิ์ณรงค์ พรมสะวะนา + ประสิทธิ์ วินันท์ + วิเชียร ยาสมุทร + เอกรักษ์ ชัยวงค์ + สุทิน ศรวิจิตร์ + วิเชษฐ์ ลังกากาศ + สิทธิกร ตุ้ยเต็มวงศ์ + ปรีดาภรณ์ ตาลี วิทยากร : บุรินทร์ รุจจนพันธุ์ + วิเชพ ใจบุญ

ผู้สนับสนุน + ผู้สนับสนุน
+ รับผู้สนับสนุน