การเขียนเว็บเพจ ด้วยพีเอชพี (PHP) ติดต่อฐานข้อมูล ระดับกลาง

ปรับปรุง : 2549-07-06 (เพิ่ม mysql again)
โครงการอบรมการเขียนเว็บเพจพีเอชพี (PHP) ติดต่อฐานข้อมูลมายเอสคิวแอล (MySQL)
บทเรียน
1. อาร์เรย์ (Array)
2. แฟ้มข้อความ (Text File)
3. มายเอสคิวแอล (MySQL)
4. การเก็บภาพในมายเอสคิวแอล (Image)
5. ไมโครซอฟต์แอคเซส (Microsoft Access)
6. เขียนแฟ้มภาพ (PNG Header)
7. ส่งข้อมูลเข้าเครื่องบริการ (Uploading)
8. การตรวจสอบ (Verification)
แนะนำเว็บ (Web Guides)

- http://www.thaiall.com/webserver
- http://www.thaiall.com/html/html.htm
- http://www.thaiall.com/php
- http://www.thaiall.com/mysql
- http://www.thaiall.com/source
- http://www.thaiall.com/programming
- http://www.thaiabc.com
- http://www.php.net
วันที่ 1

9.00 - 10.30 อาร์เรย์ 1
- อาร์เรย์ (Array)
- การนำอาร์เรย์มาใช้
10.40 - 12.00 อาร์เรย์ 2
- การค้นข้อมูลในอาร์เรย์
- การจัดเรียงอาร์เรย์
13.00 - 14.30 เท็กไฟล์ 1
- การสร้างแฟ้มข้อมูลแบบเท็กไฟล์
- การอ่านข้อมูล
14.40 - 16.00 เท็กไฟล์ 1
- การเพิ่มข้อมูล
- การลบข้อมูล
- การแก้ไขข้อมูล
วันที่ 2

9.00 - 10.30 มายเอสคิวแอล 1
- การอ่านตารางเดียว
- การอ่านตารางที่เชื่อมต่อกัน
10.40 - 12.00 มายเอสคิวแอล 2
- การเพิ่ม ลบ แก้ไขข้อมูล
13.00 - 14.30 มายเอสคิวแอล 3
- การใช้ฟังก์ชันต่าง ๆ ในเอสคิวแอล
14.40 - 16.00 มายเอสคิวแอล 4
- การสร้างตารางสำหรับเก็บภาพ
- การเพิ่มข้อมูลภาพ
- การเรียกภาพมาแสดงผล
วันที่ 3

9.00 - 10.30 ไมโครซอฟต์แอคเซส
- การเชื่อมต่อ และอ่านข้อมูลมาแสดงผล
- การเพิ่ม ลบ แก้ไขข้อมูล
10.40 - 12.00 เขียนภาพ
- การเขียนภาพ
- การเขียนภาพที่สัมพันธ์กับฐานข้อมูล
13.00 - 14.30 ส่งแฟ้ม
- การส่งแฟ้มเข้าไปเก็บในเครื่องบริการ
- การส่งแฟ้มหลายแฟ้ม
- การตรวจสอบแฟ้ม
- การอ่านแฟ้มในไดเรกทรอรี่
14.40 - 16.00 การตรวจสอบ
- การป้องกันการผิดพลาด
- การพิสูจน์ตัวตนของผู้ใช้
1. อาร์เรย์ (Array)
- ตัวแปรชื่อเดียว แต่มีได้หลายสมาชิก โดยอาศัยเลขระบุสมาชิก
- ตัวบ่งชี้สมาชิกของอาร์เรย์สามารถเป็นข้อความได้
แบบฝึกหัด
? สร้างอาร์เรย์เก็บชื่อภาพ และเรียกใช้
? สร้างอาร์เรย์เก็บชื่อแฟ้มเอกสาร และเรียกใช้
ex.0101

zz0101.php
ประกาศอาร์เรย์ทีละค่า
<?
$a[0] = "tom";
$a[1] = 65;
$a[2] = 97;
$a[3] = 161;
for($i=0;$i<4;$i++) { echo "$a[$i]<br>"; }
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
tom
65
97
161
# การสร้างอาร์เรย์และเรียกใช้
# กำหนดค่าของอาร์เรย์ทีละบรรทัด
# เลขลำดับของสมาชิกตัวแรกเริ่มที่ 0
ex.0102

zz0102.php
ประกาศอาร์เรย์ครั้งเดียว
<?
$a = array("tom",65,97,161);
for($i=0;$i<count($a);$i++)
echo "$a[$i]<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
tom
65
97
161
# กำหนดค่าของอาร์เรย์บรรทัดเดียว
# array() เป็นฟังก์ชันใช้ประกาศค่าอาร์เรย์
ex.0103

zz0103.php
ฟังก์ชันแปลง ASCII กับอาร์เรย์
<?
$a = array("tom",65,97);
$a[3] = 161;
$a[4] = "A";
echo chr($a[2])."<br>";
echo ord($a[4])."<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
a
65
# chr ใช้แปลงรหัส Ascii เป็นตัวอักษร
# ord ใช้แปลงตัวอักษร เป็นเลขลำดับ
ex.0104

zz0104.php
การประกาศแบบต่าง ๆ
<?
$a = array("tom",65,97,161);
$a[count($a)] ="boy";
$a[count($a)] ="one";
echo $a[0].$a{1};
echo $a[count($a) - 1].count($a);
echo "<hr size=20 color=black>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
tom65one6
# count ใช้นับจำนวนสมาชิกในอาร์เรย์ # สมาชิกตัวสุดท้าย คือ (จำนวนสมาชิก - 1)
ex.0105

zz0105.php
แสดงการแยก และรวมอาร์เรย์
<?
$a = explode(" ","I am a boy");
echo "$a[0]$a[2]<br>";
$b = implode("a",$a);
echo $b;
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Ia
Iaamaaaboy
# explode สามารถนำ String มาแยกเป็น Array
# implode สามารถนำ Array มารวมเป็น String
# explode ให้ผลลัพธ์เป็น Array คล้าย Split
ex.0106

zz0106.php
foreach กับอาร์เรย์
<?
$a = array("tom",65,97,161);
foreach($a as $v1) echo $v1;
$b = split(" ","I am a boy");
foreach($b as $v2) echo $v2."<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
tom6597161I
am
a
boy
# foreach สามารถท่องไปใน array ได้
# split สามารถแยกข้อความมาเป็น array ได้
ex.0107

zz0107.php
แสดงภาพจาก array
<?
$a = array();
$a[count($a)] = "a1.jpg";
$a[count($a)] = "a2.jpg";
$a[count($a)] = "a3.jpg";
foreach($a as $v)
echo "<img src=$v>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# img เป็นคำสั่งนำชื่อภาพมาแสดง
ex.0108

zz0108.php
แสดงข้อมูลพจนานุกรม
<?
$a = array();
$a["ant"] = "มดเป็นแมลงชนิดหนึ่ง";
$a["cat"] = "แมวเป็นสัตว์สี่เท้า";
$a["dog"] = "สุนัข(หมา)เป็นสัตว์สี่เท่าไม่ชอบแมว";
$a["fish"] = "ปลาเป็นสัตว์น้ำ";
foreach($a as $k => $v) echo "$k = $v<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ant = มดเป็นแมลงชนิดหนึ่ง
cat = แมวเป็นสัตว์สี่เท้า
dog = สุนัข(หมา)เป็นสัตว์สี่เท่าไม่ชอบแมว
fish = ปลาเป็นสัตว์น้ำ
# ใช้อาร์เรย์เก็บข้อมูลแบบกำหนด key
ex.0109

zz0109.php
พจนานุกรมแบบเลือกคำจาก select
<?
$a = array();
$a["ant"] = "มดเป็นแมลงชนิดหนึ่ง";
$a["cat"] = "แมวเป็นสัตว์สี่เท้า";
$a["dog"] = "สุนัข(หมา)เป็นสัตว์สี่เท่าไม่ชอบแมว";
$a["fish"] = "ปลาเป็นสัตว์น้ำ";
echo "<form action='' method=get><select name=k>";
foreach($a as $k => $v)
echo "<option value=$k>$k";
echo "</select><input type=submit></form>";
if (isset($_REQUEST["k"])) {
  foreach($a as $k => $v) {
    if ($k == $_REQUEST["k"])
    echo "$k = $v<br>";
  }
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

cat = แมวเป็นสัตว์สี่เท้า
# ถ้า click cat ก็จะได้ผลตามตัวอย่าง
ex.0110

zz0110.php
ค้นหาคำใน String แล้วเน้นคำ
<?
$a = array();
$a["ant"] = "มดเป็นแมลงชนิดหนึ่ง";
$a["cat"] = "แมวเป็นสัตว์สี่เท้า";
$a["dog"] = "สุนัข(หมา)เป็นสัตว์สี่เท่าไม่ชอบแมว";
$a["fish"] = "ปลาเป็นสัตว์น้ำ";
echo "<form action='' method=get>
<input name=s value=แมว>
<input type=submit></form>";
if (isset($_REQUEST["s"])) {
  $r = $_REQUEST["s"];
  foreach($a as $k => $v) {
    if (stristr($v,$r)) {
      $v=str_replace($r,"<b>$r</b>",$v);
      echo "$k = $v<br>";
    }
  }
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

cat = แมวเป็นสัตว์สี่เท้า
dog = สุนัข(หมา)เป็นสัตว์สี่เท่าไม่ชอบแมว
fish = ปลาเป็นสัตว์น้ำ # ตัวอย่างนี้ใช้ REQUEST หรือ GET ก็ไม่ต่างกัน # ผลลัพธ์นี้แสดงผลการค้น สัตว์ ไม่ใช่ แมว # str_replace( คำเก่า , คำใหม่ , ประโยคเป้าหมาย) # stristr ใช้ตัดคำตั้งแต่ตำแหน่งที่ต้องการ # echo stristr("abcd","b"); ผลคือ bcd # หากใช้ stristr ใน if จะได้ผลเป็นจริง ถ้าพบ
ex.0111

zz0111.php
นำอาร์เรย์ไปเขียนในตาราง
<table width=50% align=center border=1>
<?
$a = array();
$a["ant"] = "มดเป็นแมลงชนิดหนึ่ง";
$a["cat"] = "แมวเป็นสัตว์สี่เท้า";
$a["fish"] = "ปลาเป็นสัตว์น้ำ";
foreach($a as $k => $v)
echo "<tr><td>$k</td><td>$v</td></tr>";
?>
</table>
ตัวอย่างผลลัพธ์ หรืออธิบาย
antมดเป็นแมลงชนิดหนึ่ง
catแมวเป็นสัตว์สี่เท้า
fishปลาเป็นสัตว์น้ำ
# คุณสมบัติของตารางในตัวอย่างนี้มี 3 อย่าง # คือ width align และ border
ex.0112

zz0112.php
พิมพ์ตารางแยกสีละบรรทัด
<table width=50% bgcolor=yellow>
<?
$a = array();
$a["ant"] = "มดเป็นแมลงชนิดหนึ่ง";
$a["bat"] = "ค้างคาวเป็นสัตว์ปีก";
$a["cat"] = "แมวเป็นสัตว์สี่เท้า";
$a["fish"] = "ปลาเป็นสัตว์น้ำ";
$i = 0;
foreach($a as $k => $v) {
  if ($i % 2 == 0)
    echo "<tr><td>$k $v</td></tr>";
  else
    echo "<tr bgcolor=red><td>$k $v</td></tr>";
  $i++;
}
?>
</table>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ant มดเป็นแมลงชนิดหนึ่ง
bat ค้างคาวเป็นสัตว์ปีก
cat แมวเป็นสัตว์สี่เท้า
fish ปลาเป็นสัตว์น้ำ
# % ใช้หาเศษของผลหาร # เมื่อใช้ % 2 จึงได้เศษคือ 0 หรือ 1
ex.0113

zz0113.php
การจัดเรียงค่าในอาร์เรย์
<?
$a = array(9,5,3,6);
sort($a);
foreach($a as $v) echo $v;
rsort($a);
foreach($a as $v) echo $v;
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
35699653
# sort ใช้เรียงจากน้อยไปมาก
# rsort ใช้เรียงจากมากไปน้อย
ex.0114

zz0114.php
ประกาศอาร์เรย์แบบกำหนด Key เป็นข้อความ
<?
$age = array("boy"=>12,"tom"=>31,"big"=>22);
foreach($age as $v) echo $v;
echo "<br>";
foreach($age as $k => $v)
echo "$k => $v<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
123122
boy => 12
tom => 31
big => 22
# foreach สามารถใช้ key ของอาร์เรย์ได้
ex.0115

zz0115.php
ประกาศทีละค่า และเรียงตาม key
<?
$age["boy"] = 12;
$age["tom"] = 31;
$age["big"] = 22;
ksort($age);
foreach($age as $v) echo $v;
echo "<br>";
krsort($age);
foreach($age as $k => $v)
echo "$k => $v<br>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
221231
tom => 31
boy => 12
big => 22
# ksort ใช้เรียงตาม key
# krsort ใช้เรียงแบบ Reverse
ex.0116

zz0116.php
จับความเร็ว เมื่อทำงานกับอาร์เรย์
<?
list($usec, $sec) = explode(" ", microtime());
$start = (float)$usec + (float)$sec;
for($i=1;$i<=1000000;$i++) {
  $a = rand(65,90);
  if (isset($c[$a])) $c[$a]++; else $c[$a] = 1;
}
ksort($c);
foreach($c as $k => $v) 
  echo chr($k)." $k $v<br>";
list($usec, $sec) = explode(" ", microtime());
$stop = (float)$usec + (float)$sec;
$s = ($stop - $start) / 1;
echo $s. " Seconds";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
A 65 38502
B 66 38450
C 67 38447
:
:
X 88 38465
Y 89 38406
Z 90 38453
8.6548380851746 Seconds
# เครื่องผมเร็ว 500 MHz PII RAM 256
# ไม่มีอาร์เรย์ใช้เวลา 5.7208440303802
ex.0117

zz0117.php
รายงานแยกหน้า กับอาร์เรย์
<?
for($i=1;$i<=30;$i++) {
  $a = rand(65,90);
  if (isset($c[$a])) $c[$a]++; else $c[$a] = 1;
}
$tot = count($c);
if(isset($_GET["page"]))
  $page = $_GET["page"]; else $page = 1;
$lpp = 5; // line per page
$totpage = round(($tot / $lpp) + 0.499);
for($p=1;$p<=$totpage;$p++)
  echo "<a href=?page=$p>$p</a> ";
$start = $lpp * ($page - 1) + 1;
$stop = $lpp * $page;
if ($stop > $tot) $stop = $tot;
echo "<hr>";
ksort($c);
foreach($c as $k => $v) echo chr($k);
echo "<hr>";
$j = 1;
foreach($c as $k => $v) {
  if ($j>=$start && $j<=$stop) 
    echo chr($k)." $k $v<br>";
  $j++;
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 2 3 4 
AEFIJLMNOPQRTVWXYZ
Q 81 1
R 82 2
T 84 1
V 86 2
W 87 1
# ตัวอย่างนี้มีค่า page = 3 # link เลือกหน้าจะใช้ตัวแปร ?page=1 เป็นต้น
2. แฟ้มข้อความ (Text File)
- ถ้าข้อมูลไม่ซับซ้อน Text file น่าสนใจ
- นำเสนอตัวอย่างการ อ่านแฟ้ม เพิ่ม ลบ และแก้ไข
แบบฝึกหัด
? ทดสอบกับฟอร์ม หลาย ๆ แบบ
? สร้างระบบสมาชิก
ex.0201

zz0201.php
สร้างแฟ้ม และเขียนทับข้อมูลเดิม
<?
$f = fopen("data1.txt","w");
fputs($f,"101,200\n");
fputs($f,"102,150\n");
fputs($f,"103,180\n");
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ไม่มีผลลัพธ์ใด
# แฟ้ม data1.txt มีขนาด 8 * 3 = 24 Byte
# รหัสปิดบรรทัดคือ 0A หรือ Line Feed
# ถ้าเพิ่ม \r ก่อน \n ก็จะได้ 0D0A ตามปกติ
# ใน DOS ใช้ debug data1.txt แล้ว d แล้ว q
ex.0202

zz0202.php
อ่านข้อมูลจากแฟ้มด้วย fopen
<?
echo "<pre>";
$f = fopen("data1.txt","r");
while(!feof($f)){
  $d = fgets($f,1000);
  echo "$d<hr color=red>";
}
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
101,200

102,150
103,180

# กำหนด Buffer ไว้มาก ๆ ใช้ไม่หมดก็ไม่เป็นไร # ที่มี hr เกิน เพราะครั้งสุดท้ายอ่านแล้วไม่เป็น eof # ถ้าไม่ใช้ $d สามารถ echo fgets( .. ) ได้เลย # ผลการพิมพ์มีรหัส \n ติดมากับค่าที่อ่านด้วย
ex.0203

zz0203.php
อ่านข้อมูล แบบตรวจค่าก่อนแสดงผล
<?
echo "<pre>";
$f = fopen("data1.txt","r");
while(!feof($f)){
  $d = fgetss($f,1000);
  if ($d) echo "$d<hr color=red>";
}
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
101,200

102,150
103,180
# if ใช้เพื่อตรวจสอบว่าผลการอ่าน สำเร็จหรือไม่ # fgetss จะตัว html tag ให้เหลือแต่ข้อความ # data1.txt ไม่มี html tag ผลของ fgets จึงไม่ต่าง
ex.0204

zz0204.php
ตรวจแฟ้มก่อนอ่านข้อมูลมาแสดง
<?
if (file_exists("data1.txt")) {
  $f = file("data1.txt");
  foreach($f as $v){ echo $v."|<br>"; }
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
101,200 |
102,150 |
103,180 | # file_exists ใช้ตรวจว่ามีแฟ้มอยู่หรือไม่ # ผลการพิมพ์มีรหัส \n ติดมากับค่าที่อ่านด้วย # พบช่องไฟหน้าเครื่องหมาย | ทุกบรรทัด # foreach อ่านข้อมูลจากอาร์เรย์มาแสดงผล
ex.0205

zz0205.php
พิมพ์เลขลำดับนำหน้าระเบียน
<?
$f = file("data1.txt");
for($i=0;$i<count($f);$i++){
 echo $i + 1 . " : $f[$i]<br>";
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 : 101,200
2 : 102,150
3 : 103,180 # แสดงเลขลำดับระเบียน (Record) # for อ่านข้อมูลจากอาร์เรย์มาแสดงผล
ex.0206

zz0206.php
อ่านข้อมูลมาแยก field ลงตาราง
<?
echo "<table border=1>";
$f = file("data1.txt");
foreach($f as $v){
 $d = split(",",$v);
 if ($d) echo "<tr><td>$d[0]<td>$d[1]";
}
echo "</table>";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
101200
102150
103180
# การเขียนตาราง ไม่จำเป็นต้องปิด tr หรือ td
ex.0207

zz0207.php
หาผลรวมเฉพาะบางเขตข้อมูล
<?
$sum = 0;
$f = file("data1.txt");
foreach($f as $v){
 $d = split(",",$v);
 $sum += $d[1];
}
echo $sum;
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
530
# $d[1] = str_replace("\n","",$d[1]);
# ไม่ลบ \n ก็สามารถหาผลรวมได้
# ไม่ตรวจ if($d) ก็ไม่พบปัญหาเช่นกัน
ex.0208

zz0208.php
เพิ่มข้อมูล 1 ระเบียน
<?
$f = fopen("data1.txt","a");
fputs($f,"104,600\n");
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ไม่มีผลลัพธ์ใด
# ถ้าเรียกหลาย ๆ ครั้ง ก็จะเพิ่มหลายระเบียน
# ต้องใช้โปรแกรมเรียกดูข้อมูล จึงจะเห็นผลการเพิ่ม
ex.0209

zz0209.php
รับข้อมูลจาก form เพิ่มระเบียนใหม่
<form action=''>
<input name=id size=5 value=105>
<input name=salary size=5 value=280>
<input type=submit></form>
<?
if (isset($_REQUEST["id"])) {
  $f = fopen("data1.txt","a");
  fputs($f,$_REQUEST["id"].",");
  fputs($f,$_REQUEST["salary"]."\n");
  fclose($f);
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย



# default method คือ GET ใช้ REQUEST รับได้
# ก่อน fputs จะตรวจสอบว่ามีค่า id หรือไม่
# $d = str_replace(",",",",$d);
# ประโยคข้างบนแก้ปัญหา การเพิ่มข้อมูลที่มี ,
ex.0210

zz0210.php
รับข้อมูลจาก form ลบระเบียนเดิม
<form action=''>
<input name=id size=5 value=106>
<input type=submit></form>
<?
if (isset($_REQUEST["id"])) {
  $fo = file("data1.txt");
  $fn = fopen("data1.txt","w");
  foreach($fo as $v){
    $r = split(",",$v);
    if ($r[0] == $_REQUEST["id"])
      echo "del : $r[0]";
    else
      fputs($fn,$v);
  }
  fclose($fn);
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# อ่านข้อมูลทั้งหมดด้วย file
# เขียนลงใหม่ด้วย fopen
# พบรหัสที่รับเข้ามา จะไม่เขียนลงไป
ex.0211

zz0211.php
รับข้อมูลจาก form เปลี่ยนระเบียนเดิม
<form action=''>
<input name=id size=5 value=103>
<input name=salary size=5 value=500>
<input type=submit></form>
<?
if (isset($_REQUEST["id"])) {
  $fo = file("data1.txt");
  $fn = fopen("data1.txt","w");
  foreach($fo as $v){
    $r = split(",",$v);
    if ($r[0] == $_REQUEST["id"]) {
      fputs($fn,$_REQUEST["id"].",");
      fputs($fn,$_REQUEST["salary"]."\n");
    } else
      fputs($fn,$v);
  }
  fclose($fn);
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย



# เดิม 103 มี 180 ถ้า click จะเปลี่ยนเป็น 500
ex.0212

zz0212.php
อ่านเว็บเพจหน้านี้มาแสดงแบบลบ html tag
<?
echo "<pre>";
$f = fopen("training492.htm","r");
while(!feof($f)) {
  echo fgetss($f,10000);
}
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ข้อมูลทั้งหมดในแฟ้ม training492.htm
จะถูกนำมาแสดง
# fgetss จะอ่านแบบตัด html ออก
ex.0213

zz0213.php
เลือกบางส่วนของเว็บเพจมาแสดง
<?
$f = fopen("training492.htm","r");
$found = 0;
$start = "<a name=ch0102></a>";
$stop = "<a name=ch0103></a>";
while(!feof($f)) {
  $d = fgets($f,10000);
  if (stristr($d,$start)) $found = 1;
  if (stristr($d,$stop)) $found = 0;
  if ($found == 1) echo $d;
}
fclose($f);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
แสดงเฉพาะหัวข้อ 0102
# อ่าน training492.htm แต่เลือกหัวข้อ 0102 มาแสดง
# ค้นหาจนพบ จุดเริ่มต้น ก็จะให้ $found เป็น 1
# ค้นหาจนพบ จุดสิ้นสุด ก็จะให้ $found เป็น 0
# ถ้า $found เป็น 1 ก็จะแสดงทุกอย่างที่อ่านได้
ex.0214

zz0214.php
อ่านแฟ้มใน directory ปัจจุบันมาแสดงเป็นภาพ
<?
$d = opendir(".");
while($l = readdir($d)) {
  if (substr($l,-3) == "jpg") echo "<img src=$l> ";
}
closedir($d);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# แฟ้มไหนสกุล jpg จะนำมาแสดงเป็นภาพหมด
# สำหรับ sprintf("%03d",1) เพิ่ม 0 อีก 2 หลักหน้า 1
3. มายเอสคิวแอล (MySQL)
- SQL ย่อมาจาก Structured Query Language
- memmysql.php ที่ http://www.thaiall.com/perlphpasp/source.pl?9121
- http://www.thaiall.com/mysql มีตัวอย่าง และรายละเอียด
แบบฝึกหัด
? ฝึกสร้างฐานข้อมูล และตารางหลาย ๆ ครั้ง
? ฝึกทั้งแบบ phpmyadmin และ command line
ex.0301
สร้างตารางและเพิ่มข้อมูลผ่าน Command Line
mysql> use test;
mysql> create table hello(
    ->m1 int ,
    ->m2 varchar(50),
    ->m3 double);
mysql> create table m(m1 int,m2 varchar(50),m3 int);
mysql> insert into m values(11,"น้อย",15);
mysql> insert into m values(12,"ต้อง",35);
mysql> insert into m values(13,"ปาน",20);
mysql> insert into m values(14,"ขาว",5);
mysql> insert into m values(15,"ปอง",25);
mysql> show databases;
mysql> show tables;
mysql> show columns from m;
mysql> drop table wow1;
mysql> drop database oho;
ตัวอย่างผลลัพธ์ หรืออธิบาย
# แบบของ Field หรือ Data Type ของ mysql
ที่พบใน phpmyadmin มี 27 แบบ ได้แก่ VARCHAR TINYINT TEXT DATE SMALLINT MEDIUMINT INT BIGINT FLOAT DOUBLE DECIMAL DATETIME TIMESTAMP TIME YEAR CHAR TINYBLOB TINYTEXT BLOB MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT ENUM SET BINARY VARBINARY
# สามารถกำหนดต่อท้าย Data type ได้หลายแบบ
# 1. primary key not null auto_increment
# 2. primary key auto_increment
# 3. primary key
# auto_increment ใช้ insert into w values('',10);
# char varchar เก็บไม่เกิน 255 แต่ text ได้ถึง 65535
# char ใช้พื้นที่เท่าที่ตั้งไว้ แต่ varchar ใช้ตามจริง
ex.0302

zz0302.php
อ่านข้อมูลจาก mysql มาแสดงผล
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select * from m";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->m1 $o->m2 $o->m3<br>";
}
echo "จำนวน ".mysql_num_rows($r);
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
11 น้อย 15
12 ต้อง 35
13 ปาน 20
14 ขาว 5
15 ปอง 25
จำนวน 5
# เพิ่มข้อมูล ถ้าไม่พบ ??? ใน phpmyadmin ก็ ok
# copy SQL จาก IE ไปใน mysql ไม่พบปัญหา
# copy SQL จาก Notepad พบปัญหา ???
ex.0303

zz0303.php
เพิ่มระเบียนใหม่
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "insert into m values(16,'ทอง',26)";
$r = mysql_db_query("test",$q);
echo "result ";
if ($r) echo "ok"; else echo "error";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
result ok
# ฟังก์ชันเชื่อมต่อ คือ mysql_connect
# ฟังก์ชันประมวลผล คือ mysql_db_query
ex.0304

zz0304.php
ลบระเบียนตามเงื่อนไข
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "delete from m where m1 = 16";
$r = mysql_db_query("test",$q);
echo "result ";
if ($r) echo "ok"; else echo "error";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
result ok
ex.0305

zz0305.php
เปลี่ยนข้อมูลตาม m1
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "update m set m2='ใหม่',m3=88 where m1=12";
$r = mysql_db_query("test",$q);
echo "result ";
if ($r) echo "ok"; else echo "error";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
result ok
ex.0306

zz0306.php
รวมฟอร์ม และคำสั่งปรับปรุงด้วยกัน
<form action=''>
m1: <input name=x1><br>
m2: <input name=x2><br>
m3: <input name=x3><br>
<input type=submit value=update>
</form>
<?
if (isset($_GET["x1"])) {
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "update m set ";
$q.= "m2='".$_GET["x2"]."',";
$q.= "m3=".$_GET["x3"]." ";
$q.= "where m1=".$_GET["x1"];
$r = mysql_db_query("test",$q);
echo "result ";
if ($r) echo "ok"; else echo "error";
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
m1: 
m2: 
m3: 
# ฟอร์ม และสั่ง update อยู่ในโปรแกรมเดียวกัน # ส่วนส่ง ตั้งชื่อตัวส่งว่า x1, x2 และ x3
4. มายเอสคิวแอลอีกครั้ง (Again MySQL)
- ตัวอย่างชุดนี้ใช้ แฟ้มสั่งซื้อ แฟ้มสั่งซื้อละเอียด แฟ้มลูกค้า และแฟ้มสินค้า
- ถ้าฝึกทำให้ลองใช้ แฟ้มวิชา แฟ้มนักเรียน แฟ้มครู แฟ้มลงทะเบียน (yr, subj, sid, grade)
- แฟ้มครู ให้เชื่อมต่อกับแฟ้มวิชา .. ลองวางแผนว่าจะเขียนโปรแกรมอย่างไรนะครับ
แบบฝึกหัด
? เขียนโปรแกรมสร้างตาราง และเพิ่มระเบียนใหม่
? สร้างตารางใหม่ที่สัมพันธ์กัน และทำรายงานที่สัมพันธ์กัน
ex.0401
SQL Command for 4 Tables
use test;
create table cust(
cust int key auto_increment,
cname varchar(50));
create table prod(
pro int key auto_increment,
pname varchar(50),
price double,
amt int);
create table o(
oid int key auto_increment,
cust int);
create table odtl(
oid int,
pro int,
quan int);
insert into cust(cname)values("ต้อย");
insert into cust(cname)values("แดง");
insert into cust(cname)values("หวาน");
insert into prod values("","สมุด",10,100);
insert into prod values("","มีด",5,200);
insert into prod values("","เข็ม",20,100);
insert into o values("",1);
insert into odtl values(1,1,20);
insert into odtl values(1,3,5);
insert into o values("",3);
insert into odtl values(2,2,10);
insert into odtl values(2,3,15);
ตัวอย่างผลลัพธ์ หรืออธิบาย
# ถ้าข้อมูลเป็นอังกฤษ จะไม่พบปัญหาอักษรภาษาไทย
# cust คือ แฟ้มลูกค้า
# prod คือ แฟ้มสินค้า
# o คือ แฟ้มสั่งซื้อ
# odtl คือ แฟ้มสั่งซื้อละเอียด
# คำถาม : มีกี่ตาราง
# คำถาม : จำนวน field ทุกตารางรวมกันเท่าใด
# คำถาม : แต่ละตารางมีกี่ระเบียน
# คำถาม : ยอดซื้อของแต่ละคนเป็นเท่าใด
# คำถาม : ลูกค้าคนใดมียอดซื้อสูงสุด
ex.0402

zz0402.php
ใบสั่งแต่ละใบมีสินค้ากี่รายการ
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select pro,count(pro) as p from odtl
group by pro";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->pro $o->p<br>";
}
echo "จำนวน ".mysql_num_rows($r);
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 1
2 1
3 2
จำนวน 3
# count, max, min, avg ต้องใช้ร่วมกับ group by
ex.0403

zz0403.php
ใบสั่งแต่ละใบ มีใคร ซื้ออะไรบ้าง
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "
select o.oid, o.cust, odtl.pro
from (o inner join odtl on o.oid = odtl.oid)
";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->oid $o->cust $o->pro<br>";
}
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 1 1
1 1 3
2 3 2
2 3 3
จำนวน 4
# พบใน Query ของ MS Access อย่างอัตโนมัติ
# หรือใช้ SQL ดังด้านล่าง ก็ให้ผลเหมือนกัน
  select o.oid, o.cust, odtl.pro
  from o,odtl
  where o.oid = odtl.oid
ex.0404

zz0404.php
ยอดซื้อของใบสั่งแต่ละใบ เป็นเงินเท่าใด
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select odtl.oid, sum(odtl.quan * prod.price) as t
from odtl,prod
where odtl.pro = prod.pro
group by odtl.oid
";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->oid $o->t<br>";
}
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 300
2 350
# oid คือ รหัสใบสั่งซื้อ
# quan คือ ปริมาณการสั่งซื้อ
# price คือ ราคาสินค้า
ex.0405

zz0405.php
ยอดซื้อของใบสั่งแต่ละใบ มีใครซื้อ เป็นเงินเท่าใด
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select odtl.oid, o.cust, cust.cname,
sum(odtl.quan * prod.price) as t
from odtl,prod,o,cust
where odtl.pro = prod.pro and o.oid = odtl.oid
and o.cust = cust.cust group by odtl.oid
";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->oid $o->cust $o->cname $o->t<br>";
}
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 1 ต้อย 300
2 3 หวาน 350
# ต้องใช้ทั้ง 4 แฟ้มจึงจะได้ข้อมูลนี้
ex.0406

zz0406.php
ดูข้อมูลอย่างละเอียดของใบสั่งที่ 1
<?
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select o.oid, o.cust, cust.cname
from o,cust
where o.cust = cust.cust and o.oid = 1";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->oid $o->cust $o->cname<br>";
}
$q = "select prod.pro, prod.pname, odtl.oid,
sum(odtl.quan * prod.price) as t
from odtl,prod
where odtl.pro = prod.pro and odtl.oid = 1
group by odtl.pro";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->pro $o->pname $o->t<br>";
}
mysql_close($c);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
1 1 ต้อย
1 สมุด 200
3 เข็ม 100
# SQL แรกเชื่อมด้วย รหัสลูกค้า
# SQL ที่สองเชื่อมด้วย รหัสสินค้า
# ถ้าใช้ form จะเลือกใบสั่งได้
ex.0407

zz0407.php
ลบตาราง ก่อนสร้างตารางใหม่
<?
$db = "test";
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "drop table if exists million1";
$r = mysql_db_query($db,$q);
$q = "CREATE TABLE `million1` (
`a` INT NOT NULL AUTO_INCREMENT ,
`b` INT NOT NULL ,
`c` INT NOT NULL ,
`d` INT NOT NULL ,
PRIMARY KEY ( `a` ) ,
INDEX ( `b` )
)";
$r = mysql_db_query($db,$q);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
ไม่แสดงผลลัพธ์ใด
# drop table ใช้ลบตาราง
# create table ใช้สร้างตาราง
# a เพิ่มอัตโนมัติ
# b เป็น index
# c มีค่าเหมือน b
# d เป็นเลขที่ได้จากการสุ่ม (65 - 90)
ex.0408

zz0408.php
ลบ แล้วเพิ่มระเบียนใหม่จำนวนมาก
<?
$db = "par";
echo "Please wait!<br>";
list($usec, $sec) = explode(" ", microtime());
$start = (float)$usec + (float)$sec;
// ===
$db = "par";
$c = mysql_connect("127.0.0.1:3306","root","");
$q= "delete from million1";
$r= mysql_db_query($db,$q);
for($i=1;$i<=8000;$i++) {
  $a= rand(65,90);
  $q= "insert into million1(b,c,d)values($i,$i,$a)";
  $r= mysql_db_query($db,$q);
}
mysql_close($c);
// ===
list($usec, $sec) = explode(" ", microtime());
$stop = (float)$usec + (float)$sec;
$s = $stop - $start;
echo $s. " Seconds";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Please wait!
23.871053934097 Seconds
# ใช้ตาราง million1 ที่สร้างไว้ก่อนหน้านี้
# เพิ่มครั้งละหมื่นไม่ได้ พบ Maximum execution 30 seconds
# จึงลดเหลือครั้งละ 5000 Records ใช้เวลา 15.8 วินาที
# ถ้าครั้งละหมื่น ใช้เวลาไม่ถึง 30 วินาที ก็จะเพิ่มได้
# ถ้าเพิ่มครั้งละหมื่นไม่หมด .. ก็จะไม่เพิ่มอะไรเลย
# ประมาณที่อยู่ในฐานข้อมูล ไม่มีทำให้เวลา insert เพิ่มขึ้น
# ถ้าเครื่องของท่านไม่ใหม่กว่า 500MHz ให้ลดปริมาณการ insert
# a เป็น auto จึงเพิ่มต่อจากเดิมเสมอ
ex.0409

zz0409.php
เลือกข้อมูลมาแสดง จากข้อมูลปริมาณมาก
<?
echo "Please wait!<br>";
list($usec, $sec) = explode(" ", microtime());
$start = (float)$usec + (float)$sec;
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select d from million1 limit 0,5";
$r = mysql_db_query("test",$q);
while ($o = mysql_fetch_object($r)) {
  echo "$o->d<br>";
}
mysql_close($c);
list($usec, $sec) = explode(" ", microtime());
$stop = (float)$usec + (float)$sec;
$s = $stop - $start;
echo $s. " Seconds";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Please wait!
88
80
79
89
74
0.081300973892212 Seconds
# ให้เปลี่ยนเงื่อนไข แล้วดูเวลาที่แตกต่าง
# เริ่มจากระเบียนที่ 0 นำมา 5 ระเบียน
# ถ้ามี 8000 แล้วใช้ limit 7997,5 ได้ 3 ระเบียน
# limit 0,5 ใช้เวลาน้อยกว่า 7997,5
ex.0410

zz0410.php
เปรียบเทียบการค้นหาจาก index
<?
echo "Please wait!<br>";
$start = microtime();
$c = mysql_connect("127.0.0.1:3306","root","");
$q = "select * from million1";
$r = mysql_db_query("par",$q);
echo mysql_num_rows($r);
gap();
//
$start = microtime();
$q = "select * from million1 where c = 7000";
$r = mysql_db_query("par",$q);
while ($o = mysql_fetch_object($r)) echo "$o->d ";
gap();
//
$start = microtime();
$q = "select * from million1 where b = 7000";
$r = mysql_db_query("par",$q);
while ($o = mysql_fetch_object($r)) echo "$o->d ";
gap();
//
mysql_close($c);
//
function gap (){
global $start;
list($usec1, $sec1) = explode(" ", $start);
list($usec2, $sec2) = explode(" ", microtime());
$s = ($usec2 + $sec2) - ($usec1 + $sec1);
echo "<br>$s Seconds<hr>";
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Please wait!
8000
0.19571304321289 Seconds

69 0.01213812828064 Seconds
69 0.0032780170440674 Seconds # Query ครั้งแรก ช้าเสมอ # b เป็น index จึงได้ผลการค้นเร็วกว่า c # แม้ค้น c อีกครั้งหลังค้น b ก็ได้ผลเหมือน c เดิม # ลดจำนวนบรรทัดด้วย function gap ()
5. มายเอสคิวแอลเก็บภาพ (Image in MySQL)
- สร้างตารางไว้เก็บข้อมูลใน MySQL
- สร้างตัวส่ง ตัวนำไปเก็บ และตัวเรียกใช้
แบบฝึกหัด
? นำไปใช้ร่วมกับตารางอื่น เช่น พนักงาน
? สร้าง Gallery แบบของท่าน
ex.0501
สร้างตารางเก็บภาพ
CREATE TABLE file (
id mediumint(8) unsigned auto_increment,
datatype varchar(60) default 'application/octet-stream',
name varchar(120) default '',
size bigint(20) unsigned default '1024',
filedate datetime default '0000-00-00 00:00:00',
PRIMARY KEY (id) ) TYPE=MyISAM;
CREATE TABLE filedata (
id mediumint(8) unsigned auto_increment,
masterid mediumint(8) unsigned default '0',
filedata blob,
PRIMARY KEY (id),
KEY master_idx (masterid) ) TYPE=MyISAM ;
ตัวอย่างผลลัพธ์ หรืออธิบาย
# file ใช้เก็บข้อมูล ประกอบภาพ
# filedata ใช้เก็บแฟ้มภาพจริง
ex.0502

zz0502.php
ฟอร์มส่งข้อมูล
<form action=zz0503.php method=post
enctype="multipart/form-data">
<input type=file name=file1>
<input type=submit name=submit value=submit>
</form>
ตัวอย่างผลลัพธ์ หรืออธิบาย


# ส่งแฟ้มให้กับ zz0503.php นำไปเก็บใน MySQL
ex.0503

zz0503.php
นำข้อมูลภาพไปเก็บใน MySQL
<?
$c = mysql_connect("127.0.0.1:3306","root","");
mysql_select_db("test", $c);
if (isset($HTTP_POST_FILES["file1"])) {
$SrcPathFile = $HTTP_POST_FILES["file1"]["tmp_name"];
$SrcFileType = $HTTP_POST_FILES["file1"]["type"];
$DstFileName = $HTTP_POST_FILES["file1"]["name"];
clearstatcache();
$time = filemtime($SrcPathFile);
$storedate = date("Y-m-d H:i:s", $time);
if (file_exists($SrcPathFile)) {
$q = "insert into file (datatype, name, size, filedate) values ('";
$q .= $SrcFileType . "', '" . $DstFileName . "', " . filesize($SrcPathFile);
$q .= ", '" . $storedate . "')";
if (!$RES = mysql_query($q, $c)) die("มีปัญหากับ : ". $q);
$fileid = mysql_insert_id($c);
$fp = fopen($SrcPathFile, "rb");
while (!feof($fp)) {
  $binarydata = addslashes(fread($fp, 65535));
  $q = "insert into filedata (masterid, filedata) values (";
  $q .= $fileid . ", '" . $binarydata . "')";
  if (!mysql_query($q, $c)) die("มีปัญหากับ : ". $q);
}
fclose($fp);
echo "Upload Complete<br>";
echo "<img src=zz0504.php?id=". $fileid . "><br>";
echo "<a href=zz0504.php?id=". $fileid . ">click</a>";
} }
?>
ex.0504

zz0504.php
นำภาพออกจาก MySQL มาใช้
<?
$c = mysql_connect("127.0.0.1:3306","root","");
mysql_select_db("test", $c);
$nodelist = array();
if (isset($_GET["id"])) {
$q = "select * from file where id = " . $_GET["id"];
if (!$RES = mysql_query($q, $c)) die("อ่านข้อมูลไม่ได้" . $q);
if (mysql_num_rows($RES) != 1) die("ไม่พบรหัสนี้!" . $q);
$FileObj = mysql_fetch_object($RES);
$q = "select id from filedata
where masterid = " . $_GET["id"] . " order by id";
if (!$RES = mysql_query($q, $c)) die("ไม่พบรหัสนี้!" . $q);
while ($CUR = mysql_fetch_object($RES)) {
  $nodelist[] = $CUR->id;
}
Header ( "Content-Type: $FileObj->datatype" );
Header ( "Content-Length: " . $FileObj->size );
Header ( "Content-Disposition: attachment; filename=$FileObj->name" );
for ($Z = 0 ; $Z < count($nodelist) ; $Z++) {
  $q = "select filedata from filedata where id = " . $nodelist[$Z];
  if (!$RESX = mysql_query($q, $c)) die("ไม่พบรหัสนี้!" . $q);
  $DataObj = mysql_fetch_object($RESX);
  echo $DataObj->filedata;
}
} else { echo "zz0504.php?id=1"; }
?>
ex.0505

zz0505.php
เรียกภาพมาใช้ได้หลายวิธี
<img src=zz0504.php?id=1>
<form action=zz0504.php method=get>
<input name=id value=1>
<input type=submit>
</form>
ตัวอย่างผลลัพธ์ หรืออธิบาย


6. ไมโครซอฟต์แอคเซส (Microsoft Access)
- SQL ในตัวอย่างนี้มีเฉพาะ select และ insert
- ละตัวอย่าง delete และ update ซึ่งเหมือนตัวอย่างก่อนหน้านี้
แบบฝึกหัด
? เพิ่มตารางพนักงาน
? เขียนโปรแกรมเพิ่ม ลบ แก้ไขให้สมบูรณ์
ex.0601

zz0601.php
การเชื่อมต่อฐานข้อมูล แบบ DNSLess
<?
$db_connection = new COM("ADODB.Connection");
$db_connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=";
$db_connstr.= realpath("order497.mdb").";";
$db_connection->open($db_connstr);
$rs = $db_connection->execute("select * from o");
$rs_fld0 = $rs->Fields(0);
$rs_fld1 = $rs->Fields(1);
while (!$rs->EOF) {
  echo $rs_fld0->name . "=".$rs_fld0->value ." ";
  echo $rs_fld1->name . "=".$rs_fld1->value ."<br>";
  $rs->MoveNext();
}
$rs->Close();
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
oid=1 cust=1
oid=2 cust=3
oid=3 cust=3

# ให้ save order497.mdb 108 KB
# นำแฟ้มนี้ไปไว้ในห้องที่เก็บโปรแกรม
# ตัวอย่างนี้เป็นการใช้ php เชื่อมต่อแบบ DNSLess
# ทดสอบใส่ข้อมูลใน .mdb แล้ว ท่านเริ่มใช้งานได้เลย
ex.0602

zz0602.php
เพิ่มระเบียนใหม่ แบบ DNSLess
<?
$db_connection = new COM("ADODB.Connection");
$db_connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=";
$db_connstr.= realpath("order497.mdb").";";
$db_connection->open($db_connstr);
$q = "insert into o (cust)values(6)";
if ($rs = $db_connection->execute($q))
echo "insert : ok"; else echo "insert : error";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
insert : ok
# ใช้ SQL ตามที่เคยใช้ คือ insert
ex.0603

zz0603.php
การเชื่อมต่อฐานข้อมูล แบบ ODBC
<?
$cnx = odbc_connect('o497','','');
$SQL_Exec_String = "select * from o";
$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>";
}
odbc_close($cnx);
?>
ขั้นตอนการเพิ่ม o497 ใน ODBC ของ XP
# Start, Settings, Control Panel,
# Administrative Tools, Data Sources(ODBC),
# System DSN, Add, Microsoft Access Driver(*.mdb),
# Select (file.mdb), Data Source Name กรอก o497
ex.0604

zz0604.php
เพิ่มระเบียนใหม่ แบบ ODBC
<?
$cnx = odbc_connect('o497','','');
$q =  "insert into o(cust)values(17)";
if ($cur= odbc_exec( $cnx, $q ))
echo "insert : ok"; else echo "insert : error";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
insert : ok
# ใช้ SQL ตามที่เคยใช้ คือ insert
7. เขียนแฟ้มภาพ (PNG Header)
- PNG ย่อมาจาก Portable Network Graphics (PNG image format) [ libpng.org ]
- JPEG ย่อมาจาก Joint Photographic Experts Group
- GIF ย่อมาจาก Graphics Interchange Format
แบบฝึกหัด
? วาดรูปอื่นดู
? รับคำสั่งจากฟอร์มไปกำหนดรูป
? เขียนเลขที่อ่านได้จากฐานข้อมูล
ex.0701

zz0701.php
เขียนอักษร 2 บรรทัด
<?
header("Content-type: image/png");
$im = @imagecreate (120,60);
$yellow = ImageColorAllocate($im, 255, 255, 0);
imagefill($im, 0, 0, ImageColorAllocate($im, 0, 0, 0));
imagestring ($im, 1, 5, 10, "thai", $yellow);
imagestring ($im, 5, 50, 20, "lampang", $yellow);
imagepng ($im);
imagedestroy($im);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# imagestring($im , ขนาด , col , row)
# RGB = Red Green Blue
# 0,255,0 = สีเขียว
# 255,255,0 = สีเหลือง
# 255,255,255 = ขาว
# 0,0,0 = สีดำ
ex.0702

zz0702.php
เขียนลายเส้นแบบต่าง ๆ
<?
header("Content-type: image/png");
$im = @imagecreate (120,60);
$yellow = ImageColorAllocate($im, 255, 255, 0);
imagefill($im, 0, 0, ImageColorAllocate($im, 0, 0, 0));
imageline($im, 5, 15, 110, 55, $yellow);
imagerectangle($im, 5, 20, 80, 40, $yellow);
imagearc($im, 30, 30, 15, 50, 0, 280, $yellow);
imagepng ($im);
imagedestroy($im);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# imageline คือ เส้นตรง
# imagerectangle คือ สี่เหลี่ยม
# imagearc คือ เส้นวงกลม วงรี
ex.0703

zz0703.php
อ่านภาพมาแสดง
<?
  header("Content-Type: image/png");
  $fn=fopen("a3.jpg","r");
  fpassthru($fn);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# header png จะ open .jpg .gif .png ก็ได้
# หรือใช้ 2 บรรทัดนี่ก็ load รูปได้
$im = imagecreatefrompng("test.png");
imagepng($im);
ex.0704

zz0704.php
เปิดภาพพร้อมเขียนตัวอักษร
<?php
$im = imagecreatefrompng("a3.png");
$yellow = ImageColorAllocate($im, 255, 255, 0);
imagestring ($im, 5, 1, 10, "THAI", $yellow);
imagepng ($im);
imagedestroy($im);
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# แฟ้มภาพต้องเป็น .png
8. ส่งข้อมูลเข้าเครื่องบริการ (Uploading)
- ถ้ามี FTP หรือ File manager แล้วเทคนิคนี้ก็ไม่จำเป็น
- managefile.php ที่ http://www.thaiall.com/perlphpasp/source.pl?9102
แบบฝึกหัด
? ถ้า upload หบายแฟ้มจะทำอย่างไร
? unlink ใช้ลบแฟ้มได้ แล้วใช้อย่างไร
ex.0801

zz0801.php
ฟอร์มส่งแฟ้ม
<form action=zz0802.php
enctype="multipart/form-data" method=post>
<input type=file name=uploadfile>
<input type=submit>
</form>
ตัวอย่างผลลัพธ์ หรืออธิบาย


# ใช้ type แบบ file
ex.0802

zz0802.php
นำแฟ้มเข้า Server
<?
if (isset($_FILES["uploadfile"]["name"])) {
  $tmp = $_FILES["uploadfile"]["tmp_name"];
  if(copy($tmp,"./".$_FILES["uploadfile"]["name"]))
    echo "upload : process";
  else
    echo "upload : error";
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
upload : ok
# copy จะ copy จากห้องชั่วคราวเข้าห้องที่กำหนด
ex.0803

zz0803.php
ตรวจสอบก่อนลบแฟ้ม
<?
if (file_exists("l.php")) {
  unlink("l.php");
}
?>
# unlink ใช้ลบแฟ้ม
# file_exists ใช้ตรวจสอบการมีอยู่ของแฟ้มก่อนลบ
# ฟอร์มถามชื่อโปรแกรมที่จะลบ ต้องทำอย่างไร
ex.0804

zz0804.php
โปรแกรมส่งแฟ้มแบบมีฟอร์มในตัว
<form action='' 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";
?>
# กำหนดชื่อมาจากฟอร์ม
9. การตรวจสอบ (Verification)
- ไม่มีตัวอย่างการลบ และแก้ไข เพราะน่าจะดูจากส่วนของ MySQL ได้
แบบฝึกหัด
? ลองรับคำสั่งจากฟอร์ม
? ลองเขียนส่วน delete และ update
ex.0901

zz0901.php
การตรวจรหัสผ่าน
<form action=''>
<input name=s value="a">
<input type=submit>
</form>
<?
$p = '$1$WI5.ni4.$B6ZHKHpVRFhzzkMpQRp8b1';
if (isset($_GET["s"]) && crypt($_GET["s"],$p) == $p)
echo "pass";
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย


# คำถาม : ทำไงถึงจะเปลี่ยนรหัสผ่านจาก a เป็นอื่น
# crypt เป็นการเข้ารหัสแบบทางเดียง ถอดไม่ได้
# $p คือ ผลการ crypt อักษร a
# การเข้ารหัสที่ถอดได้ คือ base64_encode
ex.0902

zz0902.php
การเข้ารหัสข้อมูลแบบต่าง ๆ
<pre><?
$a = 'ลอง/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: %C5%CD%A7%2Faaa+%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: ลอง/aaa // \ // \
// Convert all applicable characters to HTML entities
  echo htmlentities($a)."\n";
  # Output: Åͧ/aaa // \ // \
// Encodes data with MIME base64
  echo base64_encode($a)."\n";
  # Output: xc2nL2FhYSAvLyBcIC8vIFwg
// 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$.Q1.tg/.$rH.lR8C2COYhyWZv4Ddkw0
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
# crypt($a) คือ การเข้ารหัสที่ถอดไม่ได้
# ต้องนำค่าที่ถูกต้องมาเปรียบเทียบ ดังตัวอย่างแรก
# ตัวอย่างการเข้ารหัส ที่ถอดรหัสได้
  $a = base64_encode("bb");
  echo base64_decode($a); // result = bb
# ฟังก์ชันจากตัวอย่างนี้
- stripslashes ()
- addslashes ()
- urlencode ()
- urldecode
- htmlspecialchars ()
& => &amp; - htmlentities ()
& => &amp; - base64_encode () - base64_decode () - crypt ()
ex.0903

zz0903.php
ฟอร์มส่งรหัสผู้ใช้ และรหัสผ่าน
<form action=zz0904.php>
<table>
<tr><td>UserName:<td><input name=u><br>
<tr><td>Password:<td><input name=p type=password><br>
</table>
<input type=submit value=Login>
</form>
<form action=zz0904.php>
<input name=u type=hidden>
<input name=p type=hidden value=logout>
<input type=submit value=Logout>
</form>
ตัวอย่างผลลัพธ์ หรืออธิบาย
UserName:
Password:
# สกุลของแฟ้มนี้เป็น .htm ได้ # เปลี่ยน action ตามต้องการ cookie หรือ session # ต้องใช้ user=a และ password=bbbb จึงจะผ่าน
ex.0904

zz0904.php
ตรวจสอบ และส่งค่าเข้า cookie
<?
if (isset($_GET["u"])) {
  if ($_GET["u"]=="a" && $_GET["p"]=="bbbb") {
    setcookie("u","ok",time()+3600);
    echo "Login : Complete<br>";
    echo "<a href=zz0906.php>zz0906.php</a>";
  }
}
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Login : Complete
zz0906.php
# ถ้าไม่ผ่าน setcookie("u","",time()-3600);
# เพิ่มการตรวจสอบในตัวอย่างถัดไป
ex.0905

zz0905.php
ตรวจสอบ และส่งค่าเข้า session
<?
session_start();
if (isset($_GET["u"])) {
  if (strlen($_GET["p"]) < 3) {
    echo "รหัสผ่านต้องมากกว่า 3 ตัวอักษร";
    exit;
  }
  if ($_GET["u"]=="a" && $_GET["p"]=="bbbb") {
    $_SESSION["right"] = "ok";
    echo "Login : Complete<br>";
    echo "<a href=zz0906.php>zz0906.php</a>";
  } else {
    $_SESSION["right"] = "";
    echo "Login : Fail";
    exit;
  }
} else exit;
?>
ตัวอย่างผลลัพธ์ หรืออธิบาย
Login : Fail
# ถ้ารหัสผ่าน้อยกว่า 3 ตัวอักฒร จะไม่ตรวจ
# การพบ Login : Fail อาจหมายถึงการ Logout
# อาจใส่เว็บเพจหลังปิด PHP ก็ได้
# ตัวอย่างนี้เพียงแต่ echo บรรทัดเดียว ถ้ารหัสถูก
ex.0906

zz0906.php
ทดสอบค่า session
<?
session_start();
if ($_SESSION["right"]!="ok") {
 echo "ท่านยังไม่ได้รับสิทธิเข้าใช้";
 exit;
}
?>
<img src=a3.jpg>
ตัวอย่างผลลัพธ์ หรืออธิบาย

# ถ้าต้องการเห็นภาพนี้ ต้อง Login ให้ผ่าน
# ต้องผ่านระบบ Login ที่กำหนดค่า session มาแล้ว
ผู้สนับสนุน + ผู้สนับสนุน
+ รับผู้สนับสนุน

แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : thcity.com : korattown.com : topsiam.com : มหาวิทยาลัยโยนก
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223