ปรับปรุง : 2564-11-11 (เพิ่มรูปแบบ) |
บทเรียน
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. อาร์เรย์ (Array)
- ตัวแปรชื่อเดียว แต่มีได้หลายสมาชิก โดยอาศัยเลขระบุสมาชิก - ตัวบ่งชี้สมาชิกของอาร์เรย์สามารถเป็นข้อความได้ | แบบฝึกหัด ? สร้างอาร์เรย์เก็บชื่อภาพ และเรียกใช้ ? สร้างอาร์เรย์เก็บชื่อแฟ้มเอกสาร และเรียกใช้ |
ex.0101 zz0101.php |
ประกาศอาร์เรย์ทีละค่า<?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 |
ประกาศอาร์เรย์ครั้งเดียว<?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 กับอาร์เรย์<?php $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 |
การประกาศแบบต่าง ๆ<?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 |
แสดงการแยก และรวมอาร์เรย์<?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 กับอาร์เรย์<?php $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<?php $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 |
แสดงข้อมูลพจนานุกรม<?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<?php $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 แล้วเน้นคำ<?php $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> <?php $a = array(); $a["ant"] = "มดเป็นแมลงชนิดหนึ่ง"; $a["cat"] = "แมวเป็นสัตว์สี่เท้า"; $a["fish"] = "ปลาเป็นสัตว์น้ำ"; foreach($a as $k => $v) echo "<tr><td>$k</td><td>$v</td></tr>"; ?> </table> | ตัวอย่างผลลัพธ์ หรืออธิบาย
|
ex.0112 zz0112.php |
พิมพ์ตารางแยกสีละบรรทัด<table width=50% bgcolor=yellow> <?php $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> | ตัวอย่างผลลัพธ์ หรืออธิบาย
# เมื่อใช้ % 2 จึงได้เศษคือ 0 หรือ 1 |
ex.0113 zz0113.php |
การจัดเรียงค่าในอาร์เรย์<?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 เป็นข้อความ<?php $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 <?php $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 |
จับความเร็ว เมื่อทำงานกับอาร์เรย์ <?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 |
รายงานแยกหน้า กับอาร์เรย์ <?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 |
สร้างแฟ้ม และเขียนทับข้อมูลเดิม <?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 <?php 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 |
อ่านข้อมูล แบบตรวจค่าก่อนแสดงผล <?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 |
ตรวจแฟ้มก่อนอ่านข้อมูลมาแสดง <?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 |
พิมพ์เลขลำดับนำหน้าระเบียน <?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 ลงตาราง <?php 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>"; ?> | ตัวอย่างผลลัพธ์ หรืออธิบาย
|
ex.0207 zz0207.php |
หาผลรวมเฉพาะบางเขตข้อมูล <?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 ระเบียน <?php $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> <?php 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> <?php 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> <?php 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 <?php echo "<pre>"; $f = fopen("training492.htm","r"); while(!feof($f)) { echo fgetss($f,10000); } fclose($f); ?> | ตัวอย่างผลลัพธ์ หรืออธิบาย ข้อมูลทั้งหมดในแฟ้ม training492.htm จะถูกนำมาแสดง # fgetss จะอ่านแบบตัด html ออก |
ex.0213 zz0213.php |
เลือกบางส่วนของเว็บเพจมาแสดง <?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 ปัจจุบันมาแสดงเป็นภาพ <?php $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 มาแสดงผล <?php $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 |
เพิ่มระเบียนใหม่ <?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 |
ลบระเบียนตามเงื่อนไข <?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 <?php $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> <?php 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 |
ใบสั่งแต่ละใบมีสินค้ากี่รายการ <?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 |
ใบสั่งแต่ละใบ มีใคร ซื้ออะไรบ้าง <?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 |
ยอดซื้อของใบสั่งแต่ละใบ เป็นเงินเท่าใด <?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 |
ยอดซื้อของใบสั่งแต่ละใบ มีใครซื้อ เป็นเงินเท่าใด <?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 <?php $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 |
ลบตาราง ก่อนสร้างตารางใหม่ <?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 |
ลบ แล้วเพิ่มระเบียนใหม่จำนวนมาก <?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 |
เลือกข้อมูลมาแสดง จากข้อมูลปริมาณมาก <?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 <?php 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 <?php $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 มาใช้ <?php $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
<?php $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
<?php $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 <?php $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 <?php $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 บรรทัด <?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)); 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 |
เขียนลายเส้นแบบต่าง ๆ <?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 |
อ่านภาพมาแสดง <?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 <?php 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 |
ตรวจสอบก่อนลบแฟ้ม <?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> <?php 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> <?php $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><?php $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 () & => & - htmlentities () & => & - 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> | ตัวอย่างผลลัพธ์ หรืออธิบาย
# สกุลของแฟ้มนี้เป็น .htm ได้ # เปลี่ยน action ตามต้องการ cookie หรือ session # ต้องใช้ user=a และ password=bbbb จึงจะผ่าน |
ex.0904 zz0904.php |
ตรวจสอบ และส่งค่าเข้า cookie <?php 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 <?php 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 <?php session_start(); if ($_SESSION["right"]!="ok") { echo "ท่านยังไม่ได้รับสิทธิเข้าใช้"; exit; } ?><img src=a3.jpg> | ตัวอย่างผลลัพธ์ หรืออธิบาย # ถ้าต้องการเห็นภาพนี้ ต้อง Login ให้ผ่าน # ต้องผ่านระบบ Login ที่กำหนดค่า session มาแล้ว |
ตัวอย่าง members กับการ signin และ การจัดการ ที่ตรวจสอบสิทธิ์ในแต่ละ script และเก็บ log การเข้าใช้
ตัวอย่าง 2 โปรแกรมที่ผิดพลาด (error code) 63 บรรทัดใน 8 แฟ้ม และ 194 บรรทัดใน 14 แฟ้ม (#) Short code : php+mysql+insert+delete+update (2563) /* 1 - use phpmyadmin in test database */ create table members (uid int not null auto_increment, u varchar(50), p varchar(50), listmem boolean, addmem boolean, updmem boolean, addr text, tid varchar(1), sid varchar(1), primary key (uid)); insert into members values (0,"admin","nation",true,true,true,"123 lampang","a","a"); insert into members values (0,"burin","nation",true,true,false,"456 lampang","s","a"); insert into members values (0,"jojo","nation",true,false,false,"789 lampang","c","a"); insert into members values (0,"romeo","nation",true,true,true,"999 lampang","a","r"); insert into members (addmem) values (true); insert into members (addmem) values (0); insert into members (u,p) values ("test","test"); create table types (tid varchar(1), tdesc text); insert into types values ("a","admin"); insert into types values ("s","staff"); insert into types values ("c","customer"); create table status (sid varchar(1), sdesc text); insert into status values ("a","active"); insert into status values ("r","retire"); insert into status values ("l","leave"); create table log (logid int not null auto_increment, u varchar(50), act varchar(20), ip varchar(20), dt varchar(30), primary key (logid)); /* 2 - index.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || strlen($_SESSION["tid"]) == 0) exit("<a href=signin.php>signin.php</a>"); else { echo '<a href="signout.php">signout.php</a><br/>'; if($_SESSION["sid"] != "a") { exit("status: inactive"); } if($_SESSION["listmem"] == true) echo '<a href="listmem.php">listmem.php</a><br/>'; if($_SESSION["addmem"] == true) echo '<a href="addmem.php">addmem.php</a><br/>'; if($_SESSION["updmem"] == true) echo '<a href="updmem.php">updmem.php</a><br/>'; if($_SESSION["tid"] == "a") echo '<a href="delmem.php">delmem.php</a><br/>'; } ?> /* 3 - signin.php */ <form action="check.php" method="post"> <input name=u><input name=p type=password> <input type=submit></form> /* 4 - signout.php */ <?php session_start(); include("keeplog.php"); session_destroy(); echo 'Signout : completely<br/><a href=index.php>back</a>'; ?> /* 5 - check.php */ <?php session_start(); $connect = new mysqli("127.0.0.1", "root", "", "test"); $su = $connect->real_escape_string($_POST["u"]); /* for ' or 1=1 or ' */ $sp = $connect->real_escape_string($_POST["p"]); /* $result = $connect->query("select * from members where u='" . $su ."' and p='" . $sp ."'"); */ $result = $connect->query("select * from members where u='" . $_POST["u"] ."' and p='" . $_POST["p"] ."'"); if ($result->num_rows > 0) { if($row = $result->fetch_assoc()) { $_SESSION["u"] = $row['u']; $_SESSION["tid"] = $row['tid']; $_SESSION["sid"] = $row['sid']; $_SESSION["listmem"] = $row['listmem']; $_SESSION["addmem"] = $row['addmem']; $_SESSION["updmem"] = $row['updmem']; } echo 'Signin : completely'; } else { echo 'Signin : fail'; } echo '<br/><a href=index.php>back</a>' ; $connect->close(); include("keeplog.php"); ?> /* 6 - listmem.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["listmem"] == false || $_SESSION["sid"] != "a") exit('Access denied<br/><a href=index.php>back</a>'); include("keeplog.php"); $connect = new mysqli("127.0.0.1", "root", "", "test"); $result = $connect->query("select * from members"); echo $result->num_rows . "<ol>"; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "<li>user:" . $row['u'] . " password : ". $row['p'] . " type: " . $row['tid'] . " status: " . $row['sid'] . " addr: " . $row['addr'] . "</li>"; } } echo '</ol><a href=index.php>back</a>' ; $connect->close(); ?> /* 7 - addmem.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["addmem"] == false || $_SESSION["sid"] != "a") { exit('Access denied<br/><a href=index.php>back</a>'); } include("keeplog.php"); ?> <form action="addmem_submit.php" method="post"> <input name=u><input name=p><br/> <input name=tid type=radio value=a checked> Active<br/> <input name=tid type=radio value=s> Staff<br/> <input name=tid type=radio value=c> Customer<br/> <input name=listmem type=checkbox checked> List member<br/> <input name=addmem type=checkbox> Add member<br/> <input name=updmem type=checkbox> Update member<br/> <select name=sid size=4> <option value=a selected>Active</option> <option value=r>Retire</option> <option value=l>Leave</option> </select><br/> <textarea name=addr rows=5 cols=40></textarea><br/><input type=submit value=add> </form> /* 8 - addmem_submit.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["addmem"] == false || $_SESSION["sid"] != "a") exit('Access denied<br/><a href=index.php>back</a>'); include("keeplog.php"); $connect = new mysqli("127.0.0.1", "root", "", "test"); $sql = "insert into members (u,p,tid,listmem,addmem,updmem,sid,addr) values ( '". $_POST["u"] ."','" . $_POST["p"] ."','" . $_POST["tid"] ."', ". onoff("listmem") .",". onoff("addmem") .",". onoff("updmem") .", '" . $_POST["sid"] ."','". $_POST["addr"] ."')"; $result = $connect->query($sql); if($result === FALSE) echo "$sql : failed"; else echo "$sql : succeeded"; echo '<br/><a href=index.php>back</a>' ; $connect->close(); /* on to true */ function onoff($v) { if (isset($_POST[$v])) return 1; else return 0; } ?> /* 9 - updmem.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["updmem"] == false || $_SESSION["sid"] != "a") exit('Access denied<br/><a href=index.php>back</a>'); include("keeplog.php"); ?> <form action="updmem_load.php" method="post"> <input name=u><br/><input type=submit value=update> </form> /* 10 - updmem_load.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["updmem"] == false || $_SESSION["sid"] != "a") { exit('Access denied<br/><a href=index.php>back</a>'); } include("keeplog.php"); $connect = new mysqli("127.0.0.1", "root", "", "test"); $result = $connect->query("select * from members where u='" . $_POST["u"] . "'"); if ($result->num_rows > 0) if($row = $result->fetch_assoc()) { ?> <form action="updmem_submit.php" method="post"> user <input name=u value='<?php echo $row['u']; ?>' readonly><br/> password <input name=p value='<?php echo $row['p']; ?>'><br/> <input name=tid type=radio value=a <?php if ($row['tid'] == 'a') echo 'checked'; ?>> Active<br/> <input name=tid type=radio value=s <?php if ($row['tid'] == 's') echo 'checked'; ?>> Staff<br/> <input name=tid type=radio value=c <?php if ($row['tid'] == 'c') echo 'checked'; ?>> Customer<br/> <input name=listmem type=checkbox <?php if ($row['listmem'] == TRUE) echo 'checked'; ?>> List <br/> <input name=addmem type=checkbox <?php if ($row['addmem'] == TRUE) echo 'checked'; ?>> Add <br/> <input name=updmem type=checkbox <?php if ($row['updmem'] == TRUE) echo 'checked'; ?>> Update <br/> <select name=sid size=4> <option value=a <?php if ($row['sid'] == 'a') echo 'selected'; ?>>Active</option> <option value=r <?php if ($row['sid'] == 'r') echo 'selected'; ?>>Retire</option> <option value=l <?php if ($row['sid'] == 'l') echo 'selected'; ?>>Leave</option> </select><br/><textarea name=addr rows=5 cols=40><?php echo $row['addr']; ?></textarea><br/> <input type=submit value=action></form><?php } echo 'update members : step 2<br/><a href=index.php>back</a>' ; $connect->close(); ?> /* 11 - updmem_submit.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["updmem"] == false || $_SESSION["sid"] != "a") { exit('Access denied<br/><a href=index.php>back</a>'); } include("keeplog.php"); $connect = new mysqli("127.0.0.1", "root", "", "test"); $sql = "update members set p = '". $_POST["p"] ."',tid = '". $_POST["tid"] ."', listmem = ". onoff("listmem") .",addmem = ". onoff("addmem") .",updmem = ". onoff("updmem") .", sid = '" . $_POST["sid"] ."',addr = '" . $_POST["addr"] ."' where u = '". $_POST["u"] ."'"; $result = $connect->query($sql); if($result === FALSE) echo "$sql : failed"; else echo "$sql : succeeded"; echo '<br/><a href=index.php>back</a>' ; $connect->close(); /* on to true */ function onoff($v) { if (isset($_POST[$v])) return 1; else return 0; } ?> /* 12 - delmem.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["tid"] != 'a' || $_SESSION["sid"] != "a") exit('Access denied<br/><a href=index.php>back</a>'); include("keeplog.php"); ?> <form action="delmem_submit.php" method="post"> <input name=u> <br/><select name=sid size=3> <option value=a>Active</option><option value=r>Retire</option><option value=l>Leave</option> </select><input type=submit value=delete></form> /* 13 - delmem_submit.php */ <?php session_start(); if(!isset($_SESSION["tid"]) || $_SESSION["tid"] != 'a' || $_SESSION["sid"] != "a") { exit('Access denied<br/><a href=index.php>back</a>'); } include("keeplog.php"); $connect = new mysqli("127.0.0.1", "root", "", "test"); $sql = "update members set sid = '" . $_POST["sid"] ."' where u = '". $_POST["u"] ."'"; $result = $connect->query($sql); if($result === FALSE) echo "$sql : failed"; else echo "$sql : succeeded"; echo '<br/><a href=index.php>back</a>' ; $connect->close(); ?> /* 14 - keeplog.php */ <?php /* session_start(); can not repeat this function in include */ if(isset($_SESSION["u"]) && strlen($_SESSION["u"]) > 0) { $datetime = new DateTime(); $connect = new mysqli("127.0.0.1", "root", "", "test"); $sql = "insert into log (u,act,ip,dt) values( '". $_SESSION["u"] ."','" . $_SERVER["SCRIPT_NAME"] ."','". $_SERVER["REMOTE_ADDR"] ."', '". $datetime->format('Y/m/d H:i:s') ."')"; $result = $connect->query($sql); $connect->close(); } ?> |
|
|
"ไม่เริ่มต้นในวันนี้ จะไม่มีทางสำเร็จในวันพรุ่ง" โดย โยฮัน ว็อล์ฟกัง ฟ็อน เกอเทอ |