44
บทที8 การแสดงรายการข้อมูลจากฐานข้อมูล การนำข้อมูลจากฐานข้อมูลมาใช้งานมักเริ่มต้นจากการแสดงรายการข้อมูลตาม เงื่อนไขรายการที่เหมาะสม เช่น แสดงหัวข้อข่าวสารล่าสุด 5 รายการ แสดงรายชื่อสินค้าที่ลด ราคาหรืออยู่ในรายการส่งเสริมการขาย แสดงรายชื่อภาพยนตร์เข้าใหมหรือภาพยนตร์ประเภท ที่ลูกค้าสนใจ แสดงรายชื่อหนังสือที่ได้รับความนิยม 10 อันดับแรก ฯลฯ เนื่องจากข้อมูลที่เก็บอยูในตารางฐานข้อมูลมักจะมีปริมาณข้อมูล ทั้งจำนวน column และ row เป็นจำนวนมาก ไม่ เหมาะสมที่จะนำข้อมูลทั้งหมดออกมาแสดง เนื่องจากจะยาวเกินไปและไม่เป็นผลดีต่อการตัดสิน ใจเลือกหารายการที่ต้องการเพื่อดำเนินการต่อของผู้ชม ดังนั้นการนำข้อมูลจากฐานข้อมูลออก มาใช้ประโยชน์ด้วยการแสดงรายการเพื่อให้ผู้ชมได้เลือกดำเนินการใดๆ กับรายการที่ต้องการ จึงต้องมีการพิจารณาเลือกการแสดงอย่างเหมาะสม ซึ่งสิ่งที่ต้องพิจารณาได้แกรายการกลุ่มใด หรือเงื่อนไขใดในแนว row ที่จะนำมาแสดง แสดงรายการเป็นจำนวน row เท่าใดต่อ 1 หน้าจอหากมีจำนวนข้อมูลมากๆ และ ส่วนที่เหลือจะแสดงได้อย่างไร รายการที่แสดงนั้นจะจัดเรียงลำดับการแสดงก่อนหลังอย่างไร จะเลือก column ใดแสดงในรายการเพื่อให้เหมาะสมต่อความกว้างของจอภาพ โดยผู้ชมสามารถแยกแยะแต่ละรายการได้ จะแสดงรายการบนจอในรูปแบบอย่างไร จะดำเนินการอะไรต่อรายการที่แสดงต่อไป สามารถเลือกรายการเพื่อดำเนินการได้ครั้งละรายการเดียวหรือหลายรายการ ในบทนี้จะได้กล่าวถึงการสร้างการแสดงรายการจากฐานข้อมูลให้ผู้ชมสามารถเลือก ดำเนินการใดๆ ต่อข้อมูลที่ต้องการต่อไป

Php book-ch8-database inquiry

  • Upload
    -

  • View
    174

  • Download
    0

Embed Size (px)

Citation preview

บทท 8การแสดงรายการขอมลจากฐานขอมล

การนำขอมลจากฐานขอมลมาใชงานมกเร มตนจากการแสดงรายการขอมลตามเงอนไขรายการทเหมาะสม เชน แสดงหวขอขาวสารลาสด 5 รายการ แสดงรายชอสนคาทลดราคาหรออยในรายการสงเสรมการขาย แสดงรายชอภาพยนตรเขาใหม หรอภาพยนตรประเภททลกคาสนใจ แสดงรายชอหนงสอทไดรบความนยม 10 อนดบแรก ฯลฯ เนองจากขอมลทเกบอยในตารางฐานขอมลมกจะมปรมาณขอมล ทงจำนวน column และ row เปนจำนวนมาก ไมเหมาะสมทจะนำขอมลทงหมดออกมาแสดง เนองจากจะยาวเกนไปและไมเปนผลดตอการตดสนใจเลอกหารายการทตองการเพอดำเนนการตอของผชม ดงนนการนำขอมลจากฐานขอมลออกมาใชประโยชนดวยการแสดงรายการเพอใหผชมไดเลอกดำเนนการใดๆ กบรายการทตองการ จงตองมการพจารณาเลอกการแสดงอยางเหมาะสม ซงสงทตองพจารณาไดแก

• รายการกลมใด หรอเงอนไขใดในแนว row ทจะนำมาแสดง• แสดงรายการเปนจำนวน row เทาใดตอ 1 หนาจอหากมจำนวนขอมลมากๆ และ

สวนทเหลอจะแสดงไดอยางไร• รายการทแสดงนนจะจดเรยงลำดบการแสดงกอนหลงอยางไร• จะเลอก column ใดแสดงในรายการเพอใหเหมาะสมตอความกวางของจอภาพ

โดยผชมสามารถแยกแยะแตละรายการได• จะแสดงรายการบนจอในรปแบบอยางไร• จะดำเนนการอะไรตอรายการทแสดงตอไป• สามารถเลอกรายการเพอดำเนนการไดครงละรายการเดยวหรอหลายรายการในบทนจะไดกลาวถงการสรางการแสดงรายการจากฐานขอมลใหผชมสามารถเลอก

ดำเนนการใดๆ ตอขอมลทตองการตอไป

296

1 การสรางฐานขอมลตวอยางดงทไดกลาวมาในบทท 7 เกยวกบระบบฐานขอมลแลววาการเกบบนทกขอมลในระบบฐาน

ขอมล จะจดแบงการเกบขอมลออกเปนตารางตางๆ ทมความสมพนธกน การนำขอมลออกมาใชหรอนำออกมาแสดงในบางขอมลอาจจะใชขอมลจากตารางเดยว ในขณะทการแสดงผลขอมลบางครงตองใชขอมลจากหลายตารางมาประกอบกน การนำขอมลจากตารางเดยวหรอหลายตารางประกอบกนกตามเพอนำมาแสดง list รายการจะตองใชคำสง SQL รวมกบการเขยน script เพอนำรายขอมลออกมาแสดงบนจอของเวบบราวเซอรซงจะขออธบายพรอมกบการยกตวอยางประกอบในหวขอถดไป

การอธบายวธการนำขอมลออกมาแสดงผลดวยเวบโปรแกรมในบทน ไดยกตวอยางการใชฐานขอมลและตารางขอมลตางๆ หลายรายการ เพอใหผศกษาสามารถทำความเขาใจและทดลองได จงขอกลาวถงโครงสรางของตารางตางๆ ทจะใชในตวอยางของบทน และคำสงทใชสรางตารางแตละตาราง เพอใหผศกษาสามารถนำไปสรางตารางและขอมลตวอยาง เพอใชทำการทดลองดงตอไปน

ตวอยางประกอบดวยตารางตางๆ 7 ตาราง ไดแก (1) ตารางสมดเยยม guest book, (2) ตาราง graduated, (3) ตาราง depart (เปนตารางใชงานรวมกบ graduated โดยใชรหสของ department เปน key ทใชเชอม), (4) ตาราง gallery ใชในตวอยางของการใชขอมลรปภาพทเกบในฐานขอมล, (5-6) ตาราง movie เปนขอมลรายชอภาพยนตร ใชรวมกบตาราง movie category เพอแสดงตวอยางการใชขอมลจาก 2 ตาราง, และ (7) ตาราง user เปนตารางเกบขอมลเกยวกบผใชระบบทนำไปใชในทงบทท 8 นและบทท 9

โครงสรางตารางทงเจดแสดงรายละเอยดอยในตารางท 8.1-1 ถง 8.1-7 โดยคำสง SQL ทใชสรางตารางของทกตวอยางแสดงอยใน Listing 8.1-1

ตารางท 8.1-1 ตาราง guestBookชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

recID รายการลำดบท

Integer 6 YY9999 PK, not null, auto increment

signDateTime วนท-เวลาทบนทกสมดเยยม

date-time Not null

guestOpinion ขอคดเหน Text

guestName ชอผเยยม varchar 30

guestEmail e-mail ของผเยยม

varchar 128 [email protected]

ตารางท 8.1-2 ตาราง graduatedชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

stID รหสนกศกษา Integer 7 YY99999 PK,Not null

firstName ชอ varchar 15 Not null

lastName นามสกล varchar 15

gpa เกรด float Not null

deptid รหสภาควชา Integer 3 เปน fk เชอมโยงไปตาราง depart

gradDate วนทสำเรจการศกษา

Date-time

ตารางท 8.1-3 ตาราง depart (department)ชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบต

อนๆdepID รหสภาควชา Integer 3 PK,

Not nullname ชอภาควชา varchar 60 Not null

บทท 8การแสดงรายการขอมลจากฐานขอมล

297

fac รหสคณะ Integer 3 Not null

ตารางท 8.1-4 ตาราง galleryชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

photoID รหสภาพ Integer 5 PK, not null, unsigned, auto-increment

titlename ชอรปภาพ varchar 100 Not null

description คำอธบาย text

imagedata ภาพ mediumblob Not null

imagetype ชนดของรปภาพ

varchar 40 image/type เปน MIME type

ตารางท 8.1-5 ตาราง movieชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

mov_id รหสภาพยนตร

Integer 5 PK, not null, auto-increment

title ชอภาพยนตร varchar 30 Not null

staring ดารานำแสดง varchar 50

director ผกำกบ varchar 20

publish วนทนำมาใหบรการ

date-time

rate เรตของภาพยนตร

varchar 5 Not null

category ประเภท integer 3 Not null เชอมโยงไปยง movie category

totalrent จำนวนครงทใหเชา

integer 5

mediatype ชนดของสอ varchar 5

local ประเทศ varchar 15 Not null

ตารางท 8.1-6 ตาราง moviecategoryชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

cateID รหสประเภทภาพยนตร

Integer 3 PK, not null, auto-increment

description ชอประเภทภาพยนตร

varchar 40 Not null

ตารางท 8.1-7 ตาราง userชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆ

uID รหสผใช varchar 8 PK, not null

uPw รหสผาน varchar 16

uName ชอผใช varchar 60 Not null

uClass1 ระดบของผใชint 1 Not null

Listing 8.1-1 คำสง SQL ทใชสรางตารางตวอยางทใชในบทท 8## Table structure for table 'guestbook'

WEB PROGRAMMING Using PHP. and MySQL.

298

#

CREATE TABLE 'guestbook' ( 'recID' int(6) unsigned NOT NULL auto_increment, 'signDateTime' datetime NOT NULL default '0000-00-00 00:00:00', 'guestName' varchar(30) NOT NULL default '', 'guestEmail' varchar(128) default NULL, 'guestOpinion' text, PRIMARY KEY ('recID')) TYPE=MyISAM;

## Table structure for table 'graduated'#

CREATE TABLE 'graduated' ( 'stID' mediumint(7) unsigned zerofill NOT NULL default '0000000', 'firstName' varchar(15) NOT NULL default '', 'lastName' varchar(15) NOT NULL default '', 'gpa' float NOT NULL default '0', 'deptid' tinyint(3) unsigned NOT NULL default '0', 'gradDate' date NOT NULL default '0000-00-00', PRIMARY KEY ('stID')) TYPE=MyISAM;

## Table structure for table 'depart'#

CREATE TABLE 'depart' ( 'depID' tinyint(3) unsigned NOT NULL default '0', 'fac' tinyint(3) unsigned zerofill NOT NULL default '000', 'name' varchar(60) NOT NULL default '', PRIMARY KEY ('depID')) TYPE=MyISAM;

## Table structure for table 'gallery'#

CREATE TABLE 'gallery' ( 'photoID' mediumint(5) unsigned NOT NULL auto_increment, 'titlename' varchar(100) NOT NULL default '', 'description' text, 'imagedata' mediumblob NOT NULL, 'imagetype' varchar(40) NOT NULL default '', PRIMARY KEY ('photoID')) TYPE=MyISAM;

## Table structure for table 'movie'#

CREATE TABLE 'movie' ( 'mov_id' int(5) unsigned NOT NULL auto_increment,

บทท 8การแสดงรายการขอมลจากฐานขอมล

299

'title' varchar(30) NOT NULL default '', 'staring' varchar(50) default '0', 'director' varchar(20) default '0', 'publish' date default '0000-00-00', 'rate' varchar(5) NOT NULL default 'ALL', 'category' tinyint(3) unsigned zerofill NOT NULL default '000', 'totalrent' int(5) unsigned default '0', 'mediatype' varchar(5) default '0', 'local' varchar(15) NOT NULL default '', PRIMARY KEY ('mov_id'), KEY 'title' ('title','rate','category','local')) TYPE=MyISAM;

## Table structure for table 'moviecategory'#

CREATE TABLE 'moviecategory' ( 'cateID' tinyint(3) unsigned zerofill NOT NULL auto_increment, 'description' varchar(40) NOT NULL default '', PRIMARY KEY ('cateID'), KEY 'description' ('description')) TYPE=MyISAM;

## Table structure for table 'user'#

CREATE TABLE 'user' ( 'uID' varchar(8) NOT NULL default '', 'uName' varchar(60) NOT NULL default '', 'uPw' varchar(16) default NULL, 'uClass' tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY ('uID'), KEY 'uName' ('uName')) TYPE=MyISAM;

WEB PROGRAMMING Using PHP. and MySQL.

300

2 การเลอกวธแสดงรายการการนำขอมลทไดจากตารางในฐานขอมลมาแสดงผล สามารถกำหนดรปแบบการแสดง

รายการ หรอนำมาใชประโยชนไดหลายรปแบบ ตวอยางเชน

• แสดงเปนบรรทดของขอความหรอเปนยอหนา• แสดงในรป list หรอ table ทใชบรรทดเดยวตอ 1 รายการ (อาจมหลายชอง-column หรอ

แสดงในชองเดยวกนแตมตวคนระหวาง field)

• แสดงเปน list หรอ table ทแยก field แสดงหลายบรรทด• แสดงใน table หลายรายการตอ 1 บรรทด• นำไปใชสรางสวนประกอบใน form เชนสราง dropdown list field หรอ check box

• นำขอมลบาง field จากทกๆ record สรางเปนขอความเดยวทคนดวยตวคน เชน "ขอมล1, ขอมล2, …"

• ฯลฯ ไมวาจะแสดงในรปแบบใดๆ กตามการเขยน script จะตองคดถงผลลพธบนหนาจอทเรา

ตองการไดรบ และ HTML code ของหนาจอนน ดงนนเราจงควรออกแบบรปการแสดงผลลพธบนหนาจอดวยการใช web authoring tools สรางผลลพธในลกษณะ static HTML แลวใช HTML code ทไดนำไปสรางหรอแทนทดวย script เพอทำใหกลายเปนสวน dynamic โดยยกตวอยางขอมลเพอสราง static HTML

ตวอยางเชน การแสดงผล guest book ตองการแสดงดงรปท 8.2-1 เมอสรางหนาจอดงรปดงกลาวแลว จะไดรบผล HTML code ดง Listing 8.2-1 จากนนจงนำสวน dynamic ทเขยนโดย script มาแทนทแตละสวนซงจะไดผลดงตวอยาง Listing 8.2-2

รปท 8.2-1 ออกแบบตวอยางผลลพธบนหนาจอทตองการ

Listing 8.2-1 คำสง HTML ทไดรบ จากหนาจอทตองการ<html><head> <title>Dokkae.com : guest book</title></head><body><h1>Guest Book</h1><p>Great.<p>Guest : มหากาพย, ([email protected])<br>0000-00-00 00:00:00<hr><p>ชอบมากคะ<p>Guest : สเมธ, ([email protected])<br>2005-01-23 14:12:43<hr></body></html>

บทท 8การแสดงรายการขอมลจากฐานขอมล

301

Listing 8.2-2 แทนสวนทมการเปลยนแปลงและการใช loop ดวย script<html><head> <title>Dokkae.com : guest book</title></head><body><h1>Guest Book</h1><? include("db-inc.php");

if (!mysql_connect($host,$user,$pw)) die("Cannot open guest book!");mysql_select_db($db);$result = mysql_query ("SELECT * FROM guestbook ORDER BY signDateTime LIMIT 10");if (!$result) die("Cannot get user opinion from guest book<br>\n" . mysql_error());

while ($row=mysql_fetch_object($result)) {?><p><?= $row->guestOpinion ?><p>Guest : <?= $row->guestName ?>, (<?= $row->guestEmail ?>)<br><?= $row->signDateTime ?><hr><? } mysql_free_result($result);mysql_close();?></body></html>

ตวอยางในบทนจะทำการแยกการกำหนดคาตวแปรทเกยวกบ database ไวในไฟล db-inc.php แสดงรายละเอยดดงรายการท 8.2-3

Listing 8.2-3 db-inc.db<?$host = "localhost";$user = "int492";$pw = "s1234";$db = "myphp";?>

ตอไปจะกลาวถงวธการแสดงผลแตละรปแบบ2 1) แสดงเปนบรรทดธรรมดาทชดกนการแสดงผลขอมลจาก row ใน database table ใหอยในบรรทดแตละบรรทดทตดกน ใช

tag <br> ในภาษา HTML เปนตวคนระหวางแตละ row ของขอมล

ผลลพธ HTML ทจะไดMessage line 1<BR>Message line 2<BR>…แนวทาง Script ทสราง dynamic page while (condition) { echo "{$row->col_name} <BR>\n"; }หรออาจเขยนอกรปแบบหนง<? while (condition) { ?> <?= {$row->col_name}?><BR><? } ?>

2 2) แสดงรายการเปนยอหนา (paragraph)

WEB PROGRAMMING Using PHP. and MySQL.

302

รปแบบทแสดงผลผลลพธ HTML ทจะได<P>Message line 1</P><P>Message line 2</P>…แนวทาง Script ทสราง dynamic page while (condition) { echo "<p>{$row->col_name} </p>\n"; }

หรออาจใช expression tag <?= ?> ชวย เชน<? while (condition) { ?> <p><?=$row->col_name ?></p><? } ?>

2 3) แสดงเปน list (Ordered/Unordered list)

การแสดงรายการในลกษณะ list ของ HTML ม 2 ประเภทไดแก ordered list คอ list ทมการระบลำดบ โดยใชหมายเลขอารบก 1,2,3,… หรอ ใชลำดบอกษร a,b,c,… หรอลำดบเลขโรมน i,ii,iii,… และแบบทไมมการระบลำดบแตใชเครองหมายนำหนา (bullet) ในภาษา HTML การแสดง list รายการดงกลาว ประกอบดวย tag 2 สวน ไดแก tag ระบประเภทของ list ทคลมรายการทงหมด คอ <OL> สำหรบการระบลำดบ (ordered list) และ <UL> สำหรบไมระบลำดบ (Unordered list) และ tag ทระบแตละบรรทดของรายการ คอ <LI> (List item)

HTML tag ทตองการไดรบเมอเปน unordered list เปนดงน<UL><LI>Message line 1</LI><LI>Message line 2</LI>…</UL>

หรอหากเปน ordered list ใช HTML tag ดงน <OL><LI>Message line 1</LI><LI>Message line 2</LI>…</OL>

ลกษณะ Script ทใช (ตวอยางแสดงผลเปน list แบบ ordered list

echo "<OL>\n"; while ($row=mysql_fetch_object($result) ) { echo "<LI>{$row->col_name}</LI>\n"; } echo "</OL>\n";

หรออาจเขยนในรปแบบการใช mode HTML และ PHP สลบกน<OL><? while ($row=mysql_fetch_object($result) ) { ?> <LI><?=$row->col_name?></LI><? } ?></OL>

ตวอยางการใช unordered list เพอแสดงรายชอนกศกษาทสำเรจการศกษาเรยงตามลำดบผลการศกษาจากมากไปหานอย แสดงใน listing 8.2-4

Listing 8.2-4 grad-br.php

<html><head><title>Graduated Student List</title></head><?include ("db-inc.php");

บทท 8การแสดงรายการขอมลจากฐานขอมล

303

$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");$query = "SELECT stID,firstName,lastName,gpa FROM graduated ORDER BY gpa desc ";$result = mysql_query($query,$dbcon);

?><body><h1>Graduated Student List</h1><ul><?while ($row=mysql_fetch_object($result)) { ?> <li><?="{$row->stID} {$row->firstName} {$row->lastName}"?> , <?=$row->gpa ?> </li><? } ?></ul></body><?mysql_free_result($result);mysql_close ($dbcon);?></html>

ผลลพธจากการทำงานแสดงไดดงรปท 8.2-2

รปท 8.2-2 ผลการทำงานของตวอยางการแสดงรายชอในลกษณะ unordered list

2 4) การนำขอมลมาใชสราง dropdown list

ในการสราง FORM ทใหผใชปอน แกไข หรอลบขอมล อาจตองการใชตวเลอกทมาจากขอมลใน table กสามารถสราง field ทเปนตวเลอก เชน dropdown list, radio button, check box จากขอมลใน table ได ตวอยางเชน หากตองการสราง dropdown list ชอ category โดยใชขอมลจาก table ประเภทภาพยนตร movieCategory ทประกอบดวย column cateID และ description โดยใน dropdown list ใหแสดงชอ description (cateID) เมอผใชเลอกตวเลอกใดใหสง cateID กลบไปใน field น ในรปท 8.2-3 แสดงตวอยางของ dropdown list

WEB PROGRAMMING Using PHP. and MySQL.

304

รปท 8.2-3 ภาพตวอยาง dropdown list

ผลลพธทตองการคอ HTML tag ทมลกษณะดงน<select name="category"> <option value="id">description (id)</option></select>

สามารถเขยน script ไดดงตวอยางรายการท 8.2-5

Listing 8.2-5 dropdown-exam.php<?include ("db-inc.php");$dbcon=mysql_connect ($host,$user,$pw) or die("Cannot connect database server.");if (!mysql_select_db ($db,$dbcon)) die("Cannot select database");?>

<form name="newmovie" method="get" action="addmovie.php"><? $query = "select * from movieCategory order by description;"; $result = mysql_query ($query,$dbcon); if (!$result) ;?><select name="category"><? while ($row=mysql_fetch_object($result)) { ?> <option value="<?= $row->cateID ?>"><?= $row->description?>(<?= $row->cateID ?>)</option><? } ?></select><input type=submit value=submit name=submit></form><? mysql_free_result ($result); mysql_close($dbcon);?>

ในตวอยางนไดแยกสวนของการเชอมตอ database server การเลอกฐานขอมล และสวนของการปดการเชอมตอฐานขอมล ออกจากสวนของการ query และการวนรอบเพอดง row ของขอมล เนองจากการเชอมตอเพยงครงเดยวสามารถทำการ query ไดหลายครง จากหลายคำสง SQL ในโปรแกรมเดยว ไมจำเปนตองเชอมตอใหม และจะทำการปดการเชอมตอเมอใชงานเสรจสนแลว

2 5) แสดงแยก field หลายบรรทดตวอยาง HTML ของผลลพธทตองการ

<P> <B>ชอรายการหลก</B><BR> <font size='-1' color='blue'>other message line 1</font><BR> other message line 2<BR> … <HR></P>

สามารถเขยน Script ไดในลกษณะดงน<? while ($row=mysql_fetch_object($result)) { ?><P> <B><?= $row->field1 ?></B>

บทท 8การแสดงรายการขอมลจากฐานขอมล

305

<font size='-1' color='blue'><?= $row->field2 ?></font><BR> <?= $row->field3 ?><BR> <?= $row->fieldn ?> <HR></P><? } ?>

ตวอยางของการแสดงในรปแบบนคอตวอยางการแสดง GuestBook ในรปท 8.2-1 ซงไดแสดง ลกษณะของผลลพธ HTML ทตองการใน Listing 8.2-1 และ PHP script ใน Listing 8.2-2 ตงแตตอนตนของหวขอ 8.2 ไวแลว

2 6) การแสดง table บรรทดเดยวListing 8.2-6 HTML tag การแสดงผลใน <TABLE><table><thead> <tr> <td>ชอ column1</td> <td>ชอ column2</td> … </tr></thead> <tr> <td> column1 row1</td> <td> column2 row1</td> … </tr> <tr> <td> column1 row2</td> <td> column2 row2</td> … </tr> …</table>

Listing 8.2-7 PHP Script <?…?><table><thead> <tr> <td>ชอ column1</td> <td>ชอ column2</td> … </tr></thead><? while ( ) { ?> <tr> <td> <? echo $row->… ; ?> </td> <td> <? echo $row->… ; ?> </td> … </tr><? } ?></table><? ….…..?>

ตวอยางเชน

WEB PROGRAMMING Using PHP. and MySQL.

306

รปท 8.2-4 การแสดงผลในรปตาราง <table>

Listing 8.2-8 mysql-ex01.php<?phpinclude ("db-inc.php");

/* Connecting, selecting database */$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");

$query = "SELECT * FROM user";$result = mysql_query($query) or die("Query failed : " . mysql_error());

echo "<table>\n";$first = true;while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { if ($first) { echo "\t<tr>\n"; foreach ($line as $key => $col_value) { echo "\t\t<th>$key</th>\n"; } echo "\t</tr>\n"; $first = false; } echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td bgcolor=\"cyan\"> $col_value</td>\n"; } echo "\t</tr>\n";}echo "</table>\n";

/* Free resultset and close the connection */mysql_free_result($result);mysql_close($dbcon);?>

ในการแสดงผลขอมล row ในตาราง 1 บรรทด อาจรวมเอาขอมลหลาย column (field) ไวในตารางชองเดยวกน ซงสามารถรวมโดยใช SQL expression หรอ PHP expression กไดเชนกน และการแสดงผลตารางในบางครงอาจตองการแสดงขอมลใหมการสลบสพนกนระหวางบรรทด เชน แสดงสพนเปนสเขยวออนบรรทดเวนบรรทด กสามารถทำไดโดยใชคำสงทำใหเกดการสลบสพนภายใน while loop ซงอาจมวธใชคำสงไดหลายแบบ เชน ใช conditional operator หรอใชคำสง if ( )// conditional operator usage$color = ($color==SOMECOLOR?ANOTHERCOLOR:SOMECOLOR;);

// if statement usage$oddEvent = ($oddEvent+1) % 2;if ($oddEvent) $color=COLOR1; else $color=COLOR2;

บทท 8การแสดงรายการขอมลจากฐานขอมล

307

ตวอยางการแสดงรายชอภาพยนตรในบรรทดทสลบสพนกบผลลพธ แสดง PHP code ไดดง Listing 8.2-9

Listing 8.2-9 movielist.php<html><head><title>Movie List</title><meta http-equiv="Content-Type" content="text/html; charset=windows-874"><?include ("db-inc.php");define (BGCOLOR,"#FFF799");

$dbcon = mysql_connect($dbhost,$dbuser,$dbpass);if (!mysql_select_db($dbname)) die ("Cannot Select Database $db");$query = "SELECT CONCAT(title, '(', mov_id, ')') AS item FROM movie ORDER BY title ;";$result = mysql_query($query,$dbcon);$color = BGCOLOR;?></head>

<body><H1>Movie List</H1><TABLE width="80%"><? while ($row=mysql_fetch_object($result)) { ?> <TR bgcolor="<?= $color ?>"><TD> <?= $row->item ?> </TD></TR><? $color = ($color=="white")?BGCOLOR:"white";} ?>

</TABLE></body><? mysql_free_result($result);mysql_close($dbcon);?></html>

2 7) แสดง table มหลายรายการตอ 1 row

หากจะแสดงผลขอมลจาก row ตางๆ แตละ row ใน 1 column ของ table และใหแสดง table นนหลาย column เชน การแสดงสนคา 3 รายการตอ 1 บรรทดโดยใช table ของ HTML จดรปแบบ จะทำโดยการแทรก tag <tr> เมอแสดงทกๆ จำนวนรายการทตองการซงอาจจะใช operator modulo % ชวยในการคำนวณได ตวอยางเชน<?echo "<table>\n";$col = 0;while (cond) { if ($col == 0) echo "<tr>\n"; echo "<td>….</td>"; $col = ++$col % 3 ;}echo "<table>\n";

ตวอยางการแสดงรายการสนคา 3 รายการใน 1 บรรทด โดยใช <table> ผลลพธทตองการแสดงดงรปท 8.2-5

WEB PROGRAMMING Using PHP. and MySQL.

308

รปท 8.2-5 การแสดงผลหลายรายการตอ 1 แถวบนตาราง<table>

จากผลทตองการไดรบในรป 8.2-5 สามารถเขยนโปรแกรมแสดงผลไดดง Listing 8.2-10

Listing 8.2-10 diamond3col.php

<html><head><title>My Wish List</title><? define("COLSperROW",3);include ("db-inc.php");$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");?></head>

<body><H1>Wish list</H1><table border="1"><?$query = "SELECT * FROM diamond ;";$result = mysql_query($query,$dbcon);$col=0;while ($row=mysql_fetch_object($result)) { if ($col==0) { ?> <tr> <? } ?> <td> <?= $row->name ?><br> <img src="../images/<?= $row->pict ?>" alt="<?= $row->name ?> picture" width=150><br> <?= $row->desc ?> </td><? $col= ($col+1) % COLSperROW;} ?>

</table></body><?mysql_free_result($result);mysql_close($dbcon);

?></html>

บทท 8การแสดงรายการขอมลจากฐานขอมล

309

3 การเลอกบางสวนของขอมลเพอแสดงในรายการการสรางรายการขอมลทนำขอมลมาจากตารางฐานขอมล อาจมการใชตารางเดยวหรอหลาย

ตาราง ซงในฐานขอมลจะเกบขอมลอยเปนจำนวนมากทง column ตางๆ ทสนบสนนการใชงานรวมกนในหลายมมมองและจำนวนขอมลใน row ทอาจมขอมลสะสมอยมากมาย การนำขอมลออกมาแสดงในแตละหนาจอจะเลอกเอาขอมลทเหมาะสมกบสารสนเทศทตองการใช จงตองมการเลอกใชขอมลเพยงบางสวนซงจะกลาวถงการใช expression ในคำสง SELECT ในกรณตางๆ

3 1) การเลอกคอลมนขอมลทเกบใน table ของ database มกประกอบดวย column/field มากมายทเปนราย

ละเอยดของขอมลนน การนำขอมลมาแสดงในรายการหวขอทงดาน row และ column ควรเลอกใหเหมาะสมกบพนทบนจอภาพ ในดาน column ควรเลอกเฉพาะ column หรอ field ทเปนประโยชนและเพยงพอตอการมองเหนแลวสามารถแยกแยะหรอตดสนใจหรอตความไดวาขอมลนนคอรายการอะไร เพอตดสนใจเลอกดำเนนการตอไปกบรายการนนหรอเลอกดำเนนการอนๆ

อาจใช column ทเปนขอความ ขอมลตวเลข หรอภาพ image ตามความเหมาะสมกบประเภทของสารสนเทศ เชน หากเปนรายการหวขอขาวอาจจะใชเฉพาะขอความหวขอขาว หากเปนรายการสนคาอาจใชภาพของสนคาประกอบรวมกบชอรายการ หากเปนรายการซอสนคาอาจมวนท ประกอบกบขอมลสวนอนๆ หรอหากเปน photo/image gallery ควรจะใชภาพ thumb nail ฯลฯ เปนตน

การแสดงรายการอาจใชขอมลจาก table เดยวหรอหลาย table ประกอบกนเพอใหแสดงความหมายไดอยางสมบรณ

ในการแสดงผลจะตองกำหนดลำดบของการแสดง field ทเหมาะสมตอการใชงานของผใชโดยไมตองเรยงตามลำดบการเกบใน table และอาจจะมเครองหมาย คำหรอขอความประกอบแทรกเขามาเพอใหดแลวเขาใจสอความไดงาย

ผลจากการเลอก column ทจะนำมาแสดงหรอใชในการประมวลผล จะถกนำมากำหนดชอ field หรอ column ของ result set ทตองการ ในคำสง SQL ซงไมควรจะใชเครองหมาย * แทนการเลอกทกๆ field หรอ column ในทกกรณ เนองจากการระบใชใชเครองหมาย * นนจะทำใหการใชพนทหนวยความจำของแมขาย web ในการเกบผลลพธ result set ตองใชพนทมากขนโดยไมจำเปนและยงเกดการสงผานขอมลระหวาง database server ไปยง web server เปนปรมาณมากดวย ซงหากเปนการใชแมขายแยกจากกนจะทำใหการทำงานชามาก โดยเฉพาะหากใน table นนม field ประเภท TEXT, LONGTEXT, BLOB, LONG BLOB ทเกบขอมลขนาดใหญมากๆ จงควรระบในคำสง SQL เฉพาะ column ทจะนำมาใชในการแสดงหรอประมวลผลเทานน

การระบ column ทตองการจะระบเปน column ทมาจาก table เดยวหรอหลาย table หรออาจจะสราง column จากการประมวลผล เชน จากการนบจำนวน row ของกลมตางๆ ตามเงอนไข การหาคาผลรวม (summation) หรอนำหลาย column จาก table สรางเปนผลลพธใน column เดยวกน หรอมการคำนวณคณตศาสตร เปนตน การดำเนนการตางๆ ตามทกลาวมาเหลานสามารถกระทำไดโดยใช select expression .ในคำสง SELECT ทไดกลาวถงในแลวบทท 7

ตวอยางของการสราง column ใหมจากการใช expression เชนSELECT stID, cancat(firstName, " ", lastName) AS stName from graduated

ตวอยางนเลอกเฉพาะ column stID, firstName และ lastName โดยนำ column firstName และ lastName มาตอกนสรางเปน column ใหมชอ stName

SELECT deptid,MAX(gpa) AS maxGPA FROM graduated GROUP BY deptid ;

เปนคำสงเลอกขอมล gpa ทสงสดของแตละ department ขนมาพรอมกบ department id. โดยใช function MAX( ) ทเปนฟงกชนทางสถตทสามารถแบงขอมลทจะหาคาสงสดโดยแบงขอมลเปนกลมไดSELECT deptName, MAX(gpa) AS maxGPA FROM graduated, department WHERE graduated.deptid=department.deptid GROUP BY deptid ;

ตวอยางนทำการเชอม 2 ตารางไดแก graduated และ department โดยใช deptid ของ graduated table เปน column สำหรบเชอม (foreign key) ไปยง column deptid ทเปน primary key ของ department table และนำ column deptName จาก department table มาใชเปนผลลพธรวมกบ maxGPA ทมาจากการหาคา gpa สงสดของขอมลแตละกลม

3 2) การเลอก row

การนำขอมลมาใชแสดงหรอประมวลผลในบางกรณจะนำขอมลทงหมดมาใช หากขอมลนนมจำนวน row ไมมากนกหรอเปนผลลพธทควรจะเหนทกรายการในหนาเดยวกน แตบอยครงทเราจะตอง

WEB PROGRAMMING Using PHP. and MySQL.

310

คดเลอกขอมลบาง row ทจะนำมาใชแสดงตามเงอนไขของผลลพธทตองการ เชน การแสดงขอมลของลกคาเฉพาะคน การแสดงขอมลทอยในชวงเวลาทกำหนด การแสดงขอมลเฉพาะรายการทมสถานะตามทเลอก หรอมคาใน field ตามทตองการ นอกจากนยงรวมถงการจำกดจำนวน row ทตรงกบเงอนไข เชน การแสดงรายการวดโอทมการยมสงสด 10 อนดบแรก การแสดงรายการขาวลาสด 5 หวขอขาว การแบงแสดงผลขอมลทมจำนวน row มากๆ เปน page ทมขนาดจำนวน row ทเหมาะสม เชน 10-20 row ฯลฯ เปนตน

การเลอก row ของขอมลจาก database table ทตองการควรจะกำหนดเงอนไขของการเลอกขอมลลงในคำสง SQL ใน WHERE clause เพอใหเปนหนาทของ database engine ซงจะทำงานไดมประสทธภาพมากกวาการขอขอมลทก row โดยไมกำหนดเงอนไข WHERE แลวเขยน server side script เพอคดเลอกขอมล เนองจากจะทำใหมปรมาณการสงขอมลจาก database engine ไปยง web server เปนจำนวนมาก ซงมผลกระทบตอปรมาณ network traffic และใน web server กยงตองใชพนทมากมายในการเกบขอมลทเปนผลลพธหากดงมาทกรายการ

นอกจากการเลอก row ตามทตองการแลวสำหรบการแสดงผล การจดลำดบกอนหลงของขอมลผลลพธ กมความสำคญกบผลลพธบางประเภททตองการ เชน แสดงสนคาตามลำดบราคา แสดงรายการขาวตามลำดบความใหม (ลำดบการปอนเขา) แสดงรายชอนกเรยนตามลำดบคะแนนผลการศกษา เปนตน ซงการแสดงขอมลตามลำดบน สามารถใช ORDER BY clause ในคำสง SELECT โดยใหเรยงจากคานอยไปมาก (ascending) หรอมากไปนอย (descending) ซงโดยปกตการใช ORDER BY จะเรยงลำดบแบบ ascending หากจะใหเรยงแบบ descending ตองระบ DESC

ตวอยางการใช ORDER เชน SELECT … ORDER BY price เปนการเรยงโดยใช column price เรยงจากนอยไปมาก หรอ SELECT … ORDER BY entryDate DESC เรยงลำดบจาก column entryDate โดยเรยงจากมากไปนอย (วนทลาสดไปหาวนทเกากวา) เปนตน

สำหรบการจำกดจำนวนผลลพธทตองการกสามารถใช LIMIT clause ในคำสง SELECT ของ SQL. ชวย ซงมรปแบบ SELECT … LIMIT num หรอ LIMIT start,num โดยท num คอจำนวน row ทตองการ สวน start คอ ลำดบทของ row แรกตามขอมลทตรงตามเงอนไขทจะนำออกมาเปนผลลพธ เชน หากคำสง SELECT ไดขอมลทตรงกบเงอนไขจำนวน 300 row จากจำนวนขอมลทงหมด 20000 row การกำหนด LIMIT 100,20 ในคำสง SELECT จะดงเอาเฉพาะขอมลลำดบท 101-120 ของขอมลใน 300 row ทตรงเงอนไขออกมาเปนผลลพธ (ขอมลรายการแรกคอลำดบท 0)

ตวอยางของการใช WHERE, LIMIT และ ORDER BY clause เชน• การเลอกแสดงชอนกศกษาทมผลการศกษาตงแต 3.00 ขนไป

SELECT stID, cancat(firstName,lastName) AS stName from graduated WHERE gpa >= 3.00;

• ตวอยางการแสดงรายการขาวลาสด 5 รายการSELECT msgID,headline,entryTime FROM news ORDER BY entryTime DESC LIMIT 5 ;

ตวอยางการแสดงรายชอนกศกษาทมผลการเรยนดทสด จำนวน 10 คนแรก และตองมผลการเรยนเกนกวา 3.00

SELECT stID,concat(firstName,lastName) AS stName FROM graduated WHERE gpa > 3.00 ORDER BY gpa DESC LIMIT 10 ;

การเลอกเฉพาะ row ทมขอมลตรงกบใน list สามารถใช operator IN เชนหากตองการเลอกเฉพาะรายการภาพยนตรทม rate เปน ALL หรอ PG-13 เทานน (รายการใน list ของ IN สามารถกำหนดไดหลายรายการคนดวย comma , )

SELECT title,rate,movID FROM movie WHERE rate IN ("ALL","PG-13") ;

การเลอกขอมลทอยในชวง (ขอมลตวเลข ขอมลวนท) เชน เลอกรายการขาวสารทจะประกาศวนน (โดยม column ทกำหนดวาจะเรมประกาศเมอใด pubDate และประกาศถงเมอใด endDate) หรอ รายการสนคาทมราคาอยในชวง 1000-5000 บาท ฯลฯ สามารถใช BETWEEN operator ใน WHERE expression ได

SELECT prdID,title,unitPrc FROM product WHERE unitPrc BETWEEN 1000 AND 5000 ORDER BY unitPrc ;

SELECT headLine FROM news WHERE CURDATE() BETWEEN pubDate AND endDate;

การเลอกขอมลทมคาใน column ตามทกำหนด หากเปน column ทเปนตวเลข สามารถใชเครองหมายดำเนนการเปรยบเทยบเชนเดยวกบ operator ในภาษาโปรแกรมทวไปได ไดแก >, <, >=,

บทท 8การแสดงรายการขอมลจากฐานขอมล

311

<=, =, != เชน WHERE gpa < 2.00 หรอ WHERE totalIncome >= 100000 หรอ WHERE YTDamount != 0 หากเปน column ชนด string เชน CHAR, VARCHAR, TEXT, LONGTEXT การเปรยบเทยบดวยเครองหมาย = จะตองมขอมลทตรงกนเทานน แตหากตองการเปรยบเทยบในลกษณะของการคนหาหรอการกรองโดยมคำคนหาปรากฏในสวนใดสวนหนงของ column เชนตองการคนรายชอภาพยนตรทมคำวา "บาน" ไมวาเปนสวนใดของชอภาพยนตร จะตองใช LIKE operator ประกอบกบการใช wide card % หรอ _ โดยท % แทนอกขระใดๆ กตวกได สวน _ แทนอกขระ 1 ตว

ตวอยาง เชน

• แสดงรายการภาพยนตรทในชอมคำวา man

SELECT title FROM movie WHERE title LIKE "%man%" ;

• แสดงรายการสนคาทลงทายดวยคำวา "mug"

SELECT prdID,title FROM product WHERE title LIKE "%mug" ;

• แสดงรายชอภาควชาทขนตนดวยคำวา Computer

SELECT name FROM department WHERE name LIKE "Computer%" ;

• แสดงรายการทมรหสเปน MUGxx-x ซง xx เปนอกขระใดๆ กได

SELECT prID,title FROM product WHERE prID LIKE "MUG__-_" ;

WEB PROGRAMMING Using PHP. and MySQL.

312

4 การกำหนดจำนวนรายการตอหนาและแบงหนาแมวาจะเลอกเงอนไขของขอมลแลว จำนวนเรคคอรดขอมลทตรงเงอนไงกอาจจะยงมจำนวน

มาก การนำขอมลจำนวนมากออกมาแสดงอาจไมเหมาะสม หลายประการคอ• จำนวนบรรทดทแสดงรายการมาก ทำใหจอยาวมาก ผใชตองดขอมลจำนวนมากเกนไป• เวลาทใชในการโหลด / ประมวลผล เพอสราง page นาน ทำใหผชมตองรอนาน Script

Engine บางตวจะม buffer สงผล HTML กลบกตอเมอประมวลผลจบแลว• เวลาทใชในการประมวลผลโดย Script engine อาจจะนานเกนกวากำหนด ซงบาง Script

engine จะกำหนด connection time limit

จงควรกำหนดจำนวนรายการทจะแสดงตอ 1 หนาจอซงสามารถสราง list รายการทกำหนดจำนวน row โดยมการทำงานรวมกนระหวาง Script กบ SQL statement สำหรบคำสง SQL ทใชกำหนดจำนวนรายการ row จะใชคำสง SELECT ทกำหนด LIMIT ดงรปแบบSELECT field_list FROM table WHERE condition ORDER BY field_list LIMIT start, rows" ;

การใชคำสงนจะตองคำนวณหา start คอลำดบทของ row แรกทตองการแสดงและกำหนดจำนวน row ตอ 1 หนา ซงการกำหนดจำนวน row ตอ 1 หนาอาจจะกำหนดเปนคาคงท หรอสรางเปน field ทผใชสามารถกำหนดเองได และนอกจากจะคำนวณหาลำดบทของ row แรกทจะแสดงแลวยงจะตองสราง navigation ใหผใชไดสามารถเลอกไปยงหนาใดๆ กได ตวอยางดงรปท 8.4-1

รปท 8.4-1 แสดงตวอยางการแสดง list ทจำกดจำนวนรายการตอ 1 หนาจอโดยแบงขอมลออกเปนหลายหนา ผใชสามารถเลอกหนาใดๆ ทตองการได

ในการสราง page เชนนจะตองคำนวณหา จำนวนหนา และมตวแปรหรอคาคงททเกยวของไดแก

• $rowsperpage – กำหนดจำนวน rows ทจะแสดงตอ 1 หนาจอ อาจจะกำหนดเปนคาคงทหรอใหผใชสามารถเลอกคาได

• $currentpage – เลขทหนาปจจบนทตองการแสดง เปนตวเลขตงแต 1 ถงจำนวนหนาทงหมด (กำหนดในตวแปร $pages)

• $rowstotal – จำนวน rows ทงหมดทตรงตามเงอนไขทตองการแสดง• $pages – จำนวน pages ทถกแบงออก• $rowstart – ลำดบทของรายการแรกทตองการแสดง

ตวแปรแรก $rowsperpage เปนคาคงททกำหนดในโปรแกรมหรอเปนคาทผใชกำหนดมาทาง parameter หรออาจเกบไวใน cookie หรอ session เพอสะดวกในการสงคาระหวาง page ตวแปรทสองคอ $currentpage หมายเลขทของหนาทแสดงใน page ปจจบนจะไดจากการสง parameter เชนผใชเลอกหนาทตองการแสดง สวนตวแปร $rowstotal หาไดจากการนบจำนวน rows ทตรงกบเงอนไขขอมลทตองการแสดงดวยคำสง SQL ดงรปแบบตอไปนSELECT COUNT(*) AS aliasname FROM table WHERE condition

เราจะตองคำนวณเพอใหไดจำนวนหนากำหนดคาใหตวแปร $pages ซงมวธคำนวณไดแก

บทท 8การแสดงรายการขอมลจากฐานขอมล

313

$pages = round ($rowstotal / $rowsperpage + 0.5);

คำสงดงกลาวจะกำหนดคาใหแกตวแปร $pages โดยคำนวณไดจาก จำนวน row หารดวยจำนวน row ตอ 1 หนา ปดเศษขน เชน หากม 23 rows แบงแสดงหนาละ 10 rows จะมทงหมด 3 หนา (ฟงกชน round จะทำการปดเศษโดยหากเศษนอยกวา 0.5 จะปดทง หากมคาตงแต 0.5 ขนไปจะปดขน การบวกผลของการหารดวย 0.5 จะชวยใหเศษทมจากการหารเพมเปน 0.5 ขนไป

และเราจะหา $rowstart คอลำดบทของ row แรกทจะแสดงใน page ไดจาก$rowstart = ($currentpage – 1) * $rowperpage;

หมายเลขของ row จะเรมจากหมายเลข 0 เปน row ลำดบแรกสด และเรากำหนดหมายเลข page แรกสดเปน 1 จงตองลบ $currentpage ดวย 1 ตวอยางเชน หากแสดงรายการจำนวน 10 รายการตอหนา หนาแรก ($currentpage=1) จะมรายการลำดบท 0-9 หนาทสอง ($currentpage=2) จำมรายการลำดบท 10-19 หนาทสามจะมรายการลำดบท 20-29 ฯลฯ เปนตน

เมอมการเลอกใหแสดง page อน ๆ เชน next page จะตองสงหมายเลข page ตอไปทจะแสดงเปน parameter ในการเรยก Script ดวยเชน showpage.php?currentpage=3

คำสง Script สราง SQL Command

$query = "SELECT …FROM…WHERE… ORDERBY … LIMIT $rowstart, $rowsperpage";

4 1) วธการเลอก page ตาง ๆ

รปแบบแสดงผลสำหรบการเลอก page ทนยมใชกนม 3 แบบไดแก• แสดงหมายเลขหนาเปนตวเลขทม link 1 | 2 | 3 | 4 | 5

• ใช dropdown list แสดงและใหเลอกหมายเลขหนาโดยอาจมปม GO หรอไมกได• แสดงขอความใหเลอกหนาถดไปหรอยอนไปหนาทแลว next | prev

การสราง Script

หาจำนวน page ทงหมดทจะม สอบถามจำวน row จาก table ใน database โดยคำสง SQL

"SELECT COUNT(*) AS ROWSTOTAL FROM table WHERE condition"

จากผลลพธจำนวน row ทไดนำมาคำนวณจำนวน page ไดจากสตร จำนวน page = จำนวน row / จำนวน row ทจะแสดงตอ 1 หนา ปดเศษขน$rows = $row->rowstotal;$pages = round($rows / $srowsperpage + 0.5);

การสรางสวนเลอกแสดงหนาอนๆ ทำไดดงนกรณสรางเปน ขอความแสดงเลขหนา 1 | 2 | 3 | 4 หากด static HTML tag จะไดเปน

<A HREF = "SHOW PAGE ? page = 1"> 1 </A> | <A HREF = "SHOW PAGE ? page = 2"> 2 </A> | …

สามารถเขยน Script สราง page list พรอม link ใหไดผลตาม HTML ขางตนไดดงน for ($i = 1; $i <= $pages; i++) { if ($i !=1) echo "|"; echo "<A HREF = 'SHOW PAGE ? page = $i'> $i </A> }

หากตองการสรางเปน dropdown list ผลลพธของ HTML tag ทตองการคอ<SELECT name = "gotopage" id = "gotopage"> <OPTION VALUE = 1> 1 </OPTION> <OPTION VALUE = 2> 2 </OPTION> <OPTION VALUE = 3> 3 </OPTION> <OPTION VALUE = 4> 4 </OPTION> …</SELECT>

สามารถเขยน Script ไดดงน<? echo "<SELECT name = 'gotopage' id = 'gotopage'> \n "; for ($i = 1;$i <=$pages; i++) {

WEB PROGRAMMING Using PHP. and MySQL.

314

$SEL = ($i == $currentpage)? " SELECTED " : " "; echo " <OPTION VALUE = $i $SEL> $i </OPTION> \n"; } echo "</SELECT>";?>

หรอ<SELECT name = 'gotopage' id = 'gotopage'><? for ($i = 1;$i <=$pages; i++) { $SEL = ($i == $currentpage)? " SELECTED " : " "; ?> <OPTION VALUE =<?= "$i $SEL"?>> $i </OPTION>?></SELECT>

การแสดง next , prev

$haveprev = ($currentpage != 1);$have nect = ($currentpage !=$pages);$nextpage = $cuurentpage + 1;$prevpage = $currnetpage – 1;echo ($havenext ? "<A HREF = 'page = $nextpage'> "<A HREF = 'SHOWPAGE .php? page=$nextpage'>" : " "). "NEXT". ($havenext?" </A>" : " "). " | ". ($haveprev ? " <A HREF = 'SHOWPAGE.php? page = $prepage'>" : " "). "PREV" . ($havenext?" </A> " : " ");

ตวอยางการแสดงรายชอภาพยนตรจากตาราง movie โดยแบงแสดงขอมลครงละ 10 รายการ ผลลพธดงรปท 8.4-2 เปนผลลพธทไดจาก Script ใน Listing 8.4-1

รปท 8.4-2 รายการภาพยนตรแบง 10 รายการตอหนา vdolist.php

Listing 8.4-1 vdolist.php

<?include_once ("./lib/conf.php");define ("TABLECOLOR","#FFFF99");

if ($_GET["page"]) {$page=$_GET["page"];}if (!$page) $page=1; $rowsperpage = 10;$connect = mysql_connect ($dbhost,$dbuser,$dbpass) or die ("DB.SERVER ERROR! ");

// Get row count$query = "SELECT COUNT(*) as rows FROM movie";$resultset = mysql_db_query ($dbname,$query) OR die ("DB.QUERY ERROR! ");$row = mysql_fetch_object ($resultset);

บทท 8การแสดงรายการขอมลจากฐานขอมล

315

$totalrows = $row->rows;

// calculate total pages and first row of current page$totalpages = round((0+$totalrows)/$rowsperpage + 0.5);$firstrow = ($page-1) * $rowsperpage;setcookie ("page",$page);?><html><head><title>Dokkae VDO Manager</title><meta http-equiv="Content-Type" content="text/html; charset=tis-620"></head>

<body><form action="vdocart.php" method="post" name="vform"><h1>รายชอ VDO</h1><table width="50%"><tr><td><table width="100%" border="0"> <tr> <td><input name="submit" type="submit" id="submit" value="Add Cart"></td> <td align="right">Page <?= $page ?> / <?= $totalpages ?></td> </tr></table> <table width="100%" border="0" cellpadding="0" cellspacing="1" bordercolor="#FFFFFF"><?$query = "SELECT * FROM movie ORDER BY title LIMIT $firstrow, $rowsperpage;";$resultset = mysql_db_query ($dbname,$query) OR die ("DB.QUERY ERROR! ");$bgcolor = TABLECOLOR;while ($row=mysql_fetch_object ($resultset)) { ?> <tr bgcolor="<?= $bgcolor ?>"> <td width="20" align="center"><input type="checkbox" name="vsel[]" value="<?= $row->mov_id ?>"></td> <td><p><A HREF="manager/movie-showdetail.php?ref=<? echo $row->mov_id; ?>"><? echo $row->title, ($row->prod_year)?" (ป{$row->prod_year})":"") ?></A></p></td> </tr> <? $bgcolor = $bgcolor==TABLECOLOR?"white":TABLECOLOR; }mysql_free_result ($result);mysql_close ($connect);?> </table> <table width="100%"> <tr><td><hr></td></tr> <tr> <td bgcolor="#999966">Page : <a href="vdolist.php?page=<?= $page==1?1:($page-1) ?>">&lt;</a> | <? for ( $p=1;$p<=$totalpages;$p++) { ?> <a href="vdolist.php?page=<?= $p ?>"> <?= $p ?></a>&nbsp;|&nbsp; <? } ?> <a href="vdolist.php?page=<? echo ($page>=$totalpages?$page :($page+1)) ?>">&gt;</a> </td> </tr> <tr><td>&nbsp;</td></tr> <tr>

WEB PROGRAMMING Using PHP. and MySQL.

316

<td align="center"><a href="vdocart.php">Show Cart</a> | Home</td> </tr></table></td></tr></table></form></body></html>

บทท 8การแสดงรายการขอมลจากฐานขอมล

317

5 การสราง Navigation เพอเลอกดำเนนการกบรายการเมอมการแสดงรายการขอมลจากฐานขอมลในรปแบบของรายการทมเฉพาะหวขอสาระสำคญ

(คอ column ทเลอกนำมาแสดง) หากตองการแสดงผลรายละเอยดของรายการบางรายการ โดยใหผใชทำการ click เพอเลอกรายการทตองการกทำไดโดยการสราง navigator หรอ link เพอเชอมโยงไปยง page ทใชแสดงผลรายละเอยดพรอมทงสงหมายเลขรายการ ซงมกเปน primary key เพอใหเลอกรายการนนมาแสดงผลได โดยสงเปน query string ตอทายชอ URL ของปลายทาง

การสรางรายการ list ทสามารถเลอกแสดงรายละเอยดหรอเลอกเพอนำไปใชประมวลผลอนๆ ตอไดประกอบดวย

• หนาทแสดง list รายการ มการสราง link ทรายการไปยง หนาทแสดงรายละเอยด พรอมทงสงตวแปรเพอช record

• หนาทแสดงรายละเอยดรายการ จะรบชอตวแปรเพอชตำแหนง record จาก query string เพอนำไปใชใน WHERE clause ของคำสง query SELECT

5 1) การสรางรายการทม link สำหรบเลอกดำเนนการทละ 1 รายการคำสง HTML ทใชเชอมโยงหรอสราง link ไปยง page อนๆ คอ Anchor tag

<A HREF="url" >…</A>

หมายเหต url ใชไดทง absolute และ relative และใน tag <A> ยงม attribute อนๆ อกการเรยกไปยง page ทดำเนนการกบรายการทเลอก เชน แสดงรายละเอยดของรายการท

เลอก เพมรายการทเลอกลงในตะกราในระบบ e-commerce ฯลฯ จะตองสง parameter ยง page ทเปนเวบโปรแกรมเพอใชเปน key ในการเลอกรายการขอมลจาก table ใน database

การสง parameter จาก link จะตองสงเปน parameter ตอทายชอ URL ในรปแบบดงนurl?param1=value1[&param2=value2]…

ตวอยางเชนshowmovie.php?movieid=10314addcart.jsp?prod=97-1363-05&quan=7popup-detail.asp?member=sakda&since=1967

Script ทใชแสดงรายการทสามารถ link ได จงตองสราง tag <A HREF= และสง parameter เปนคา key สำหรบการเลอกรายการในฐานขอมลทจะดำเนนการ

ตวอยางเชน<UL> <? while ($ref=…) { ?> <LI><A HREF="show-movie.php?movieid=<? echo $row->movieid ?>"> <? echo $row->title; ?> </A></LI> <? } ?></UL>

หากม link ใหดำเนนการไดหลายอยางกสามารถสราง link โดย <A HREF= เพอ link ไปยงแตละ page ได เชน หากใหแสดงรายละเอยดภาพยนตรโดยการ click ทชอภาพยนตรในรายการ หรอใหเพมชอภาพยนตรนนใสตะกราเมอ click ทรปรถเขนทอยทายชอภาพยนตร

• The Lord of the Ring : Return of the King

• Chicago

ลกษณะของ Sript ทใช<UL> <? while($ref=mysql_fetch_object($result)) { ?> <LI> <A HREF="show-movie.php?movieid=<? echo $row->movieid ?>"> <? echo $row->title; ?></A>&nbsp; <A HREF="addcart.php?movieid=<? echo $row->movieid ?>"> <IMG SRC="images/cart-mini.gif"></A> </LI> <? } ?></UL>

WEB PROGRAMMING Using PHP. and MySQL.

318

ตวอยางการแสดงรายชอภาพยนตรจากตาราง movie ทสามารถ click link แสดงรายละเอยดได ผลลพธทตองการแสดงดงรปท 8.5-1 แสดง script ไดดง Listing 8.5-1

รปท 8.5-1

บทท 8การแสดงรายการขอมลจากฐานขอมล

319

Listing 8.5-1 movielist-wlink.php<html><head><title>Movie List</title><meta http-equiv="Content-Type" content="text/html; charset=windows-874"><?include ("db-inc.php");define (BGCOLOR,"#FFF799");$dbcon = mysql_connect($dbhost,$dbuser,$dbpass);if (!mysql_select_db($dbname)) die ("Cannot Select Database $db");$query = "SELECT mov_id AS id, CONCAT(title, '(', mov_id, ')') AS item FROM movie ORDER BY title ;";$result = mysql_query($query,$dbcon);$color = BGCOLOR;?></head>

<body><H1>Movie List</H1><TABLE width="80%"><? while ($row=mysql_fetch_object($result)) { ?> <TR bgcolor="<?= $color ?>"><TD> <?= $row->item,"<font size='-1' color='cyan'><a href='movieshow.php?id={$row->id}'> detail ...</a>" ?> </TD></TR><? $color = ($color=="white")?BGCOLOR:"white";} ?>

</TABLE></body><? mysql_free_result($result);mysql_close($dbcon);?></html>

5 2) การสราง page เพอแสดงรายละเอยดจากรายการทเลอกสำหรบ page ทถก link มาจากการ click เลอกรายการเพอนำขอมลรายละเอยดของรายการ

ทผใชเลอกมาแสดงผล ซงการเรยกมายง page นจะมการสง record id มาใหทาง query string หรอ parameter ดงนนใน script นสามารถตรวจสอบและนำคา record id. มาเพอกำหนดเปนเงอนไขของการคนหาขอมลจาก database table ได การรบคานจะทำไดดวยการรบจากตวแปร $_GET[] หรอ $HTTP_GET_VARS เชนเดยวกบทกลาวถงมาแลวตงแตบทท 3 ดงนนอาจเขยนคำสงใหรบคาเขามาในตวแปร เชนif (isset($_GET['param_name'])) $recID = $_GET['param_name'];else { include('movielist-wlink.php') ; exit( ); }

จากนนจงนำตวแปรนไปใชสรางเงอนไข WHERE clause ใน query

$query = "SELECT * FROM movie WHERE mov_id='$recID'; "

ผลจากการ query ดวยคำสงขางตนควรจะใหผลเปนขอมล row เดยว จากการใช record id. ทมขอมลไมซำกน หรอไมพบขอมล เนองจาก record id. ทสงมาผดพลาด ซงเราสามารถตรวจสอบจำนวน row ของผลลพธไดจากฟงกชน mysql_num _rows ($result )

$result = mysql_query ($query);if (mysql_num_rows($result) < 1) {// แสดงผลในกรณทไมพบรายการจากผลการ query} else { $row = mysql_fetch_object ($result); // การนำขอมลจาก $row ทไดไปแสดงผล}

WEB PROGRAMMING Using PHP. and MySQL.

320

ตวอยางการแสดงรายละเอยดภาพยนตรทเลอกจากตวอยางรายการในรปท 8.5-1 ใหแสดงรายละเอยดภาพยนตรดงรปท 8.5-2 สามารถเขยน script ไดดง Listing 8.5-2

รปท 8.5-2 แสดงรายการรายละเอยดภาพยนตร

Listing 8.5-2 movieshow.php<html><head><title>Movie Detail</title><meta http-equiv="Content-Type" content="text/html; charset=tis-620"><link href="movie.css" rel="stylesheet" type="text/css"></head>

<body><?php if (isset($_GET['id'])) $recID = $_GET['id'];else { include('movielist-wlink.php') ; exit( ); }

include ("db-inc.php");$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");

$query = "SELECT * FROM movie WHERE mov_id='$recID'; ";$result = mysql_query($query,$dbcon) or die("Query error!");

if (mysql_num_rows($result) < 1) {// แสดงผลในกรณทไมพบรายการจากผลการ query?><p>ไมพบภาพยนตรทระบ (code: <?= $recID ?>)</p><?} else { $row = mysql_fetch_object ($result); // การนำขอมลจาก $row ทไดไปแสดงผล ?> <h1>Movie Detail</h1> <h2>Title <font color=red><?= $row->title?> </font></h2> <p><span class="mvsLabel">Staring .. </span> <?= $row->staring?><br> <span class="mvsLabel">Directed by </span><?= $row->director?> </p> <p><span class="mvsLabel">category </span><?= $row->category?> | <span class="mvsLabel">Rate </span><?= $row->rate?></p><? } ?> <hr>

บทท 8การแสดงรายการขอมลจากฐานขอมล

321

<p><a href="movielist-wlink.php">Back to Movie list </a></p></body></html>

WEB PROGRAMMING Using PHP. and MySQL.

322

6 การสรางรายการทสามารถเลอกรายการไดหลายรายการการเลอกรายการหลายรายการพรอมกน อาจนำไปใชในงานลกษณะตางๆ เชน การเลอก

สนคาทตองการเพมลงในตะกรา การเลอกรายการขอความเพอยายไปยง folder การเลอกรายการขอมลเพอลบขอมลเปนกลม หรอการเลอกเพอสงขอมลไปยงระบบอนๆ ฯลฯ เปนตน การเลอกขอมลทแสดงเปนรายการ (List) ไดหลายๆ ขอมลพรอมๆ กน มกจะนยมใช ฟอรมใน HTML (<FORM>) และเลอกใชฟลดประเภท checkbox

<INPUT TYPE="CHECKBOX" NAME="field_name" VALUE="value">

ดงนนหากตองการสราง List แสดงรายการขอมลทสามารถเลอกหลายๆ รายการไดพรอมๆ กน ดงตวอยางผลลพธในรป 8.6-1 จะตองสรางผลลพธ HTML ในลกษณะตามรายการ Listing 8.6-1

รปท 8.6-1 ตวอยางการแสดง List ทสามารถเลอกรายการไดหลายรายการพรอมๆ กน

Listing 8.6-1 รปแบบผลลพธ HTML ทตองการ<FORM name="name" METHOD="POST" ACTION="action"> <TABLE> <TR><TD> <INPUT TYPE="CHECKBOX" NAME="field_name[]" VALUE="value1"> Item from database record # 1 </TD></TR> <TR><TD> <INPUT TYPE="CHECKBOX" NAME="field_name[]" VALUE="value2"> Item from database record # 2 </TD></TR> . . .</FORM>

จาก Listing 8.6-1 หากนำมาเขยนเปน Script php จะไดรปแบบดง Script ใน Listing 8.6-2

Listing 8.6-2 รปแบบ Script สำหรบการแสดงขอมลจากฐานขอมลใหเลอกไดหลาย record พรอมกน<? // connect DBMS server// select database // then send query section ?><FORM name="name" METHOD="POST" ACTION="action"> <TABLE>

บทท 8การแสดงรายการขอมลจากฐานขอมล

323

<? while ($row = mysql_fetch_object($result)){ ?> <TR><TD> <INPUT TYPE="CHECKBOX" NAME="field_name[]" VALUE="<?= $row->id_column ?>"> <?= $row->data_display_column ?> </TD></TR><? } ?></FORM><? // Close database section ?>

ตวอยาง การแสดงรายการสนคาจากตาราง diamond นำหนาดวย checkbox ใหผใชเลอกไดหลายรายการพรอมๆ กน แสดงใน listing 8.6-3 และแสดงตวอยางของ action script ทนำรายการทผใชเลอกแสดงผลแบบหลายรายการตอ 1 บรรทดแสดงใน listing 8.6-4

Listing 8.6-3 diamond-select.php<html><head><title>Your wishes list : select list</title><link href="productlist.css" rel="stylesheet" type="text/css"></head><body><h1>Your Wishes List</h1><? include ("db-inc.php");// connect DBMS server$dbcon = mysql_connect($host,$user,$pw);// select database if (!mysql_select_db($db)) die ("Cannot Select Database $db");// then send query section $query = "SELECT * FROM diamond";$result = mysql_query($query);?><FORM name="wishForm" METHOD="POST" ACTION="diamond-sel-list.php"><input type="submit" name="submit" value="Send"><table width="90%"><? echo mysql_error();while ($row = mysql_fetch_object($result)){ ?> <TR valign="top"> <TD><span class="productName"> <INPUT TYPE="CHECKBOX" NAME="wishID[]" VALUE="<?= $row->DmID ?>"> </TD> <TD><span class="productName"><?= $row->name ?></span><br> <span class="productDesc"><?= $row->desc ?></span> </TD> </TR> <TR><TD colspan="2"><hr></TD></TR><? } ?></table><input type="submit" name="submit" value="Send"></FORM><? // Close database section mysql_free_result($result);mysql_close($dbcon);?></body></html>

Listing 8.6-4 diamond-sel-list.php<?// If no item was selected, tell user to select someif (!isset ($_POST["wishID"])) { echo ("Please select some item. <a href=\"diamond-select.php\">Back to select</a>");

WEB PROGRAMMING Using PHP. and MySQL.

324

exit();}// There are selected items// Get select list from field$wishesList = "";$wishesSelected = $_POST["wishID"]; // get list from fieldif (!is_array($wishesSelected)) $wishesList = $wishesSelected;else { $comma = ""; foreach ($wishesSelected as $item) { $wishesList .= $comma . $item; $comma = ","; }}include ("db-inc.php");$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");$query = "SELECT * FROM diamond WHERE DmID IN ($wishesList);";$result = mysql_query($query,$dbcon);?><html><head> <title>My Wish List</title> <link href="productlist.css" rel="stylesheet"></head><body><H1>Wishes list</H1><table border="1"><?$col=0;while ($row=mysql_fetch_object($result)) { if ($col==0) { ?> <tr><? } ?> <td><span class="productName"><?= $row->name ?></span><br> <img src="../images/<?= $row->pict ?>" alt="Diamond picture" width=150><br> <span class="productDesc"><?= $row->desc ?></span> </td><? $col= ($col+1) % 3;} ?></table></body></html><?mysql_free_result($result);mysql_close($dbcon);?>

บทท 8การแสดงรายการขอมลจากฐานขอมล

325

7 การคนหาขอมลการคนหาขอมลโดยระบขอความ ใหคนหาขอมลใดๆ ทมขอความทตองการสามารถทำการ

คนหาโดยใช operator LIKE และเครองหมาย wide card _ เพอแทนอกขระใดๆ 1 ตวหรอ % แทนอกขระใดๆ จำนวนเทาใดกได (สวนใหญมกจะใช %) ใน WHERE clause ของคำสง SELECT ผลทไดจะแสดงเปน list ทประกอบดวยรายการทตรงกบเงอนไขของการคนหา

คำสง SQL

SELECT col_expression FROM tab_list WHERE col_name LIKE "%key_word%" …

หากตองการใชคำเดยวกนแตสบคนจาก column หลาย column จะตองเขยน expression เปรยบเทยบแตละ column เองโดยเชอมดวย or

SELECT col_expression FROM tab_list WHERE col_name1 LIKE "%key_word%" or col_name2 LIKE "%key_word%" or …

ตวอยางการคนหารายการจาก movie table โดยใหผใชกำหนดไดวาจะคนหาจาก column title, director, staring ใน column ใดบาง แบงเปน search-frm.html แสดง form ใหผใชปอนคำคนหา และเลอก column และ search-result.php แสดงผลการคนหาListing 8.7-1 search-frm.html<html><head><title>Search</title><meta http-equiv="Content-Type" content="text/html; charset=windows-874"></head>

<body><h1>Movie Search</h1><form action="search-result.php" method="post" name="mSrch" id="mSrch"> <table border="0" bgcolor="#66CCCC"> <tr> <td>Enter search word </td> <td ><input name="srchKey" type="text" id="srchKey" size="40" maxlength="80"></td> </tr> <tr> <td colspan="2">Search from</td> </tr> <tr> <td colspan="2"> <table><tr> <td width="100"><input name="srchField[]" type="checkbox" id="srchField[]" value="title"> Title</td> <td width="100"><input name="srchField[]" type="checkbox" id="srchField[]" value="staring">Staring</td> <td width="100"><input name="srchField[]" type="checkbox" id="srchField[]" value="director">Director</td> </tr></table> </tr> <tr> <td colspan="3"><input type="submit" name="Submit" value="Search"></td> </tr> </table></form><p>&nbsp;</p></body></html>

Listing 8.7-2 search-result.php<?// Prepare Query String

WEB PROGRAMMING Using PHP. and MySQL.

326

if (!isset($_POST["srchKey"])) $srchKey="%"; else $srchKey=$_POST["srchKey"];if (isset($_POST['srchField'])) { $srchFields = $_POST['srchField']; if (!is_array($srchFields)) $whereClause = "$srchFields=$srchKey"; else { $_or_ = ""; $_slash_ = ""; $whereClause = ""; $srchFieldList = ""; foreach ($srchFields as $fieldName) { $whereClause .= " $_or_ $fieldName LIKE '%$srchKey%'"; $srchFieldList .= "$_slash_ $fieldName "; $_or_ = "or"; $_slash_ = "/"; } }}else $whereClause="";$query = "SELECT title,staring,director,mov_id FROM movie WHERE $whereClause ORDER BY title";

// Access movie Databaseinclude ("db-inc.php");$dbcon = mysql_connect($host,$user,$pw);if (!mysql_select_db($db)) die ("Cannot Select Database $db");$result = mysql_query($query,$dbcon);

?><html><head><title>Search Result</title><meta http-equiv="Content-Type" content="text/html; charset=windows-874"></head>

<body><h1>Movie List</h1><p>ภาพยนตรทมขอความ &quot;<u><?= $srchKey ?></u>&quot; ใน <?= $srchFieldList ?></p><? if (mysql_num_rows($result)<1) { ?><p><b>ไมพบรายชอภาพยนตรตามเงอนไขทตองการ</b></p><? } else { ?><table width = "90%"><? while ($row=mysql_fetch_object($result)) { ?> <tr> <td><a href="moviedetail.php?movie=<?=$row->mov_id?>"><?= $row->title ?>, <?= $row->staring ?> , directed by <?= $row->director ?></a></td> </tr><? } // end while ?></table><? } // end else ?></body></html><?mysql_free_result($result);mysql_close($dbcon);

?>

บทท 8การแสดงรายการขอมลจากฐานขอมล

327

8 การแสดงขอมลรปภาพจากฐานขอมลในระบบฐานขอมลสามารถเกบขอมลทเปนรปภาพลงใน column ของ table และนำออกมาใช

งานได การเกบขอมลรปภาพในฐานขอมลจะเกบขอมลในลกษณะทเปนขอมลขนาดใหญ โดยมชนดขอมลทเรยกวา BLOB. ยอมาจาก Binary Large OBject ซงการนำขอมลเกบลงในขอมล BLOB สามารถทำไดเชนเดยวกนกบชนดขอมลอนๆ

การใชขอมลรปภาพในฐานขอมลกบเวบโปรแกรมมรายละเอยดทควรศกษาไดแก• การกำหนด column และชนดของ column

• การสงขอมลจากผใช• การนำขอมลบนทกลงส table

• การนำขอมลภาพกลบไปแสดงผล• การดดแปลงภาพ

8 1) การกำหนดชนดของ column เพอใชเกบขอมลภาพในระบบฐานขอมลตางๆ มกจะมชนดขอมลทใชรองรบการเกบขอมลขนาดใหญเรยกวา BLOB

หรอ Binary Large Object ซงใน MySQL. กเชนกน มชนดขอมลทรองรบขอมลขนาดใหญไมวาจะใชเกบไฟลเอกสารทงไฟล การเกบขอมล binary ใดๆ รวมไปถงรปภาพ ซงใน MySQL มชนดขอมลขนาดใหญ 4 ชนดไดแก

1. TINYBLOB หรอ TINYTEXT เกบขอมลได 255 Bytes

2. BLOB หรอ TEXT เกบขอมลได 65535 Bytes (64KB.)

3. MEDIUMBLOB หรอ MEDIUMTEXT เกบขอมลได 16777215 Bytes (6MB.)

4. LONGBLOB หรอ LONGTEXT เกบขอมลได 4294967295 Bytes (4GB.)

ดงนนหากเราจำกดขนาดของรปใหใหญเทาใดกสามารถเลอกใชชนดของ column ทเหมาะสมไดตามตองการ เชน หากเปนรปสมาชกทมขนาดไมเกนดานละ 200 pixels ชนด JPEG กสามารถกำหนดขนาดไฟลไมเกน 64Kbytes และเลอกใช column ชนด BLOB ไดแตหากเปนการสงรปถายขนาด 800x600 หรอใหญกวาน (2-6Mega pixel) ทเกบแบบ JPEG กสามารถกำหนดชนด column เปน MEDIUMBLOB ได เปนตน

ตวอยางคำสงการสราง table ทประกอบดวย column สำหรบเกบรป gallery table ทมการเกบไฟลขอมลภาพ ชอภาพ คำอธบายและชนดของไฟลแสดงใน Listing 8.8-1

Listing 8.8-1 คำสงสราง gallery tableCREATE TABLE 'gallery' ( 'photoID' mediumint(5) unsigned NOT NULL auto_increment, 'titlename' varchar(100) NOT NULL default '', 'description' text, 'imagedata' mediumblob NOT NULL, 'imagetype' varchar(40) NOT NULL, PRIMARY KEY ('photoID')) TYPE=MyISAM;

การสราง member table ทม column เกบรปสมาชกแสดงใน Listing 8.8-2

Listing 8.8-2 คำสงสราง member tableCREATE TABLE 'member' ( 'acct' varchar(12) NOT NULL default '', 'name' varchar(50) NOT NULL default '', 'since' date NOT NULL default '0000-00-00', 'password' varchar(16) default NULL, 'address' varchar(200) default NULL, 'email' varchar(60) default NULL, 'pict' blob, 'status' char(1) NOT NULL default 'D', PRIMARY KEY ('acct'), KEY 'account' ('acct')) TYPE=MyISAM;

WEB PROGRAMMING Using PHP. and MySQL.

328

ตวอยางการสรางตารางขอมลเกบรปหนาปกแผนวซดภาพยนตรทมขนาดใหญกวา 16Kbytes โดยใชชนด MEDIUMBLOB แสดงใน Listing 8.8-3

Listing 8.8-3 คำสงสราง movie tableCREATE TABLE 'movie' ( 'mov_id' int(5) unsigned NOT NULL auto_increment, 'title' varchar(30) NOT NULL default '', 'staring' varchar(50) default '0', 'director' varchar(20) default '0', 'publish' date default '0000-00-00', 'rate' varchar(5) NOT NULL default 'ALL', 'category' tinyint(3) unsigned zerofill NOT NULL default '000', 'totalrent' int(5) unsigned default '0', 'mediatype' varchar(5) default '0', 'local' varchar(15) NOT NULL default '', 'coverPict' mediumblob, PRIMARY KEY ('mov_id'), KEY 'title' ('title','rate','category','local')) TYPE=MyISAM;

8 2) การสงขอมลภาพจากผใชเพอบนทกลงใน table

การนำขอมลจากผใชเพมลงในตารางฐานขอมล เรมตนจาก FORM ของการปอนขอมล ซงการสงขอมลรปภาพ (รวมถงไฟลตางๆ) สามารถใช FORM ของ HTML โดยใช <FORM> tag ตามปกต แตจะมสวนอนๆ ทเกยวของไดแก

• การกำหนด attribute ของ form เพอรองรบ• การกำหนด field เพอสงรปภาพจากไฟลในเครองผใช

การกำหนด attribute ของ form เพอรองรบการสงไฟลรปภาพเปนเชนเดยวกนกบการสงไฟลหรอ upload ไฟลในหวขอ 4.3 ของบทท 4 ซงจะนำมากลาวถงอกครง โดย attribute ทตองกำหนดไดแก

1. METHOD ตองกำหนดให method เปน POST เทานน2. กำหนด ENCTYPE="multipart/form-data"

และในสวนของ field จะตองใชชนดของ field เปน "file" โดยใช HTML tag

<INPUT TYPE="FILE" name="field_name">

ตวอยางของ page ทมฟอรมสำหรบการสงไฟลภาพแสดงดงตอไปนListing 8.8-4 gallery-form.html<html><head><title>Photo uploading</title></head>

<body><h1>Send your picture</h1><form action="gallery-save.php" method="post" enctype="multipart/form-data" name="form1"> <table border="0" cellpadding="3"> <tr> <td>Picture name : </td> <td><input name="title" type="text" id="title" size="60"></td> </tr> <tr> <td>Select image : </td> <td><input name="imgFile" type="file" id="imgFile" size="50"></td> </tr> <tr> <td valign="top">Description : </td> <td><textarea name="describe" cols="60" rows="5" id="describe"></textarea></td> </tr> <tr>

บทท 8การแสดงรายการขอมลจากฐานขอมล

329

<td>&nbsp;</td> <td><input type="submit" name="Submit" value="Submit"></td> </tr> </table></form></body></html>

จากตวอยางนไดกำหนด field สำหรบการสงไฟลภาพชอ imgFile ซงจะนำไปใชในเวบโปรแกรมเพอรบขอมลภาพเขาเกบใน table ตอไป โดยจะใชบนทกลงใน gallery table

การบนทกขอมลภาพลงใน table จากไฟลททำการ upload ขนไปสามารถทำไดโดย• ทำการตรวจสอบความถกตองของไฟลททำการ upload เชน สามารถ upload ได

สำเรจ, ชนดของไฟลเปน image ซงสามารถตรวจสอบโดยใช $_FILES['ชอfield']['type'] จะใหชนดของไฟลเปน MIME type เชน "image/gif" หรอ "text/html"

• อานไฟลท upload จากตำแหนง temporary directory เขาสตวแปร โดยอาจใชฟงกชนอานไฟล เชน file_get_contents (filename) โดยมการใชฟงกชน addslashes( ) เพอแทรกเครองหมาย \ ลงทหนารหสบางตวทอาจทำใหขอความ query เสยหายได

• นำตวแปรนนไปใชสรางคำสง INSERT เหมอนการบนทกขอมลลงใน table ตามปกต

ตวอยางของการบนทกขอมลทไดรบจาก form แสดงไดดงตวอยาง gallery-save.php ทใชรวมกบ gallery-form.html ในตวอยางทผานมา ดงนListing 8.8-5 gallery-save.php1 <html> 2 <head> 3 <title>อ.รงนภา องคะศรกล</title> 4 <meta http-equiv="Content-Type" content="text/html; charset=windows-874"> 5 </head> 6 <body> 7 <h1>เพมขอมลใน Gallery ใหม</h1> 8 <? 9 $uploadMsg = array( 10 UPLOAD_ERR_OK=>"", 11 UPLOAD_ERR_INI_SIZE=>"Image oversize.", 12 UPLOAD_ERR_FORM_SIZE=>"Image oversize.", 13 UPLOAD_ERR_PARTIAL=>"Error loading image file", 14 UPLOAD_ERR_NO_FILE=>"Error, no image file was specified."); 15 16 $pictField = 'imgFile'; 17 $pictFile = $_FILES[$pictField]['tmp_name']; 18 $uLoadErr = $_FILES[$pictField]['error']; 19 20 if ($uLoadErr==UPLOAD_ERR_OK) { 21 $validFileType=strstr($_FILES[$pictField]['type'],'image'); 22 if ($validFileType) { 23 $pictData = addslashes(file_get_contents ($pictFile)) ; 24 $imgType = $_FILES[$pictField]['type'] ; 25 26 include ("db-inc.php"); 27 $dbcon = mysql_connect($host,$user,$pw); 28 if (!mysql_select_db($db)) die ("Cannot Select Database $db"); 29 30 $photoTitle = $_POST['title']; 31 $photoDesc = $_POST['describe']; 32 33 $query = "insert into gallery (photoID,titlename,description,imagedata,imagetype) ".

WEB PROGRAMMING Using PHP. and MySQL.

330

34 " values (DEFAULT, '$photoTitle', '$photoDesc', '$pictData', '$imgType' )"; 35 if ($result = mysql_query($query,$dbcon)) echo "<p> บนทกขอมลใหมแลว</p> "; 36 else $ErrMsg ="Error : ไมสามารถบนทกขอมลได <br>" .mysql_error(); 37 } // if ($validFileType) 38 else { 39 $ErrMsg = "Invalid file type ."; 40 } 41 } 42 else { 43 $ErrMsg=$uploadMsg[$uLoadErr]; 44 } 45 echo $ErrMsg; 46 ?> 47 </body> 48 </html>

อธบายตวอยางโปรแกรม ในบรรทดท 17 เปนการนำชอไฟลทอยใน temporary directory เกบในตวแปรเพอใชเปดอานขอมลเขามาเกบใน table บรรทดท 18 อานคา error status จากการ upload file และตรวจสอบในบรรทดท 20 หากไมเกด error จะทำการตรวจสอบชนดของไฟลทสงมา (บรรทดท 21) โดยดงชนดของไฟลทสงมา และเปรยบเทยบวามคำวา image อยในชนดไฟลหรอไม (หากเปน image file ชนดจะไดเปน "image/ชนด". เชน "image/gif")

หากเปนชนดทถกตองจะทำการอานขอมลจากไฟล (บรรทดท 23) โดยใชฟงกชนสงผลลพธจากไฟล file_get_contents ( ) รวมกบฟงกชน addslashes( ) เพอแทรกเครองหมาย \ นำหนาอกขระทอาจทำใหขอมลผดพลาดใน string บางตวเชนเครองหมายคำพดเนองจากจะตองนำขอมลจากไฟลไปประกอบใน string ของคำสง query และเตรยมชอชนดของไฟล (บรรทดท 24) แลวทำการ connect DBMS. และ select database (บรรทด 26-28) จากนนจะเตรยมการสรางคำสง query เพอใชแทรกขอมลใหมโดยใชขอมลชอภาพและคำอธบายจาก field ทสงเขามา (บรรทด 30-31)

การบนทกขอมลใหมลงในไฟลใชคำสง SQL คอ INSERT ซงเตรยมคำสง INSERT ในบรรทดท 33-34 จากนนจะสงคำสง query ไปยง DBMS และทำการตรวจสอบวาไดผลสำเรจหรอไม (บรรทด 35) หากสำเรจจะแสดงขอความ "บนทกขอมลใหมแลว" แตหากเกดขอผดพลาดจะแสดงขอความ "ไมสามารถบนทกขอมลได" ตามดวยขอความแสดง error จาก MySQL (บรรทด 36)

บรรทดท 38-39 กำหนดขอความในกรณชนดไฟลทสงมาไมใชไฟลภาพ และในบรรทดท 42-43 เปนการกำหนดขอความในกรณทการสงไฟลไมสำเรจ โดยขอความจะถกแสดงในบรรทดท 45

8 3) การแสดงผลภาพทเกบใน table

ขอมลภาพทถกเกบอยใน table ของ database จะนำกลบไปแสดงบนเวบบราวเซอรไดจะตองสงภาพทเกบใน table นนกลบมาเปนไฟลทม HTTP header ระบชนดของไฟลใหเปนไฟลภาพ ซงในภาษา PHP สามารถกำหนดไดโดยใชฟงกชน header ( ) และนำเนอหาของขอมลภาพสงกลบมาในไฟล การแสดงผลภาพใน page จะใช <IMG> tag ซงเปน HTML tag ทใชแสดงภาพ โดยระบชอ URL ของภาพเปนชอเวบโปรแกรมทจะดงขอมลจาก table สงกลบมาเปนไฟลภาพ

ในตวอยาง gallery-img.php แสดง script ของการใชเวบโปรแกรมเพอสรางภาพทจะสงภาพกลบไปจาก table ซงจะกำหนดภาพทจะแสดงโดยสง imgid เพอระบ row ใน query string (ตวอยาง เชน gallery.php?imgid=15) และใน gallery-show.php เปน page ทแสดงรายการภาพทมใน table ทงหมด โดยอางถง gallery-img.php แทนชอไฟลภาพ

บทท 8การแสดงรายการขอมลจากฐานขอมล

331

Listing 8.8-6 gallery-img.php 1 <? 2 include ("db-inc.php"); 3 define ('DUMMY','dummy.gif'); 4 define ('DUMMYtype','image/gif'); 5 $dbcon=mysql_connect($host,$user,$pw); 6 if (!mysql_select_db($db)) { 7 header('Content-type: '. DUMMYtype); 8 readfile(DUMMY); 9 exit() }; 10 $query = "SELECT imagetype,imagedata FROM gallery WHERE photoid='{$_GET['imgid']}' "; 11 $result = mysql_query($query,$dbcon); 12 $row = mysql_fetch_object($result); 13 if ( $row->imagedata) { 14 header("Content-type: {$row->imagetype}"); 15 echo $row->imagedata; 16 } 17 else { 18 header('Content-type: '. DUMMYtype); 19 readfile(DUMMY); 20 } 21 ?>

สวนทสำคญใน script นคอการระบ key ของขอมลทจะดงภาพจาก table ในตวอยางนกำหนด key โดย column photoid ซงระบโดยตวแปร imgid สงมาทาง query string

การเตรยมคำสง query ขอมลทำในคำสงในบรรทดท 10 โดยใชเงอนไข WHERE photoid= ระบขอมล argument imgid ทมาจาก query string โดยใช $_GET['imgid'] และทำการ query ในคำสงบรรทดท 11-12 หากไดรบขอมลกลบมาจะนำขอมลทไดไปสงเปนชนดและเนอหาของไฟล โดยการสงชนดไฟลใชฟงกชน header ("Content-type: ชอ type") (บรรทดท 14) ซงชอ type ไดจากขอมลใน column imagetype ทเกบใน table สวนการสงขอมลไฟลภาพออกไปกจะใชคำสง echo ระบขอมลจาก column imagedata (บรรทดท 15) ซงเปน BLOB field ทเกบเนอขอมลของไฟลภาพเอาไว

ในตวอยางนไดทำการตรวจสอบกรณไมปกต 2 กรณไดแก ในบรรทดท 6 หากไมสามารถเลอก database จาก database server ไดบรรทดท 13,17 เมออานขอมลจาก table ใน database แลวตรวจสอบกรณไมมขอมลใน column imagedata ทง 2 กรณคอหากไมสามารถเลอกใช database จาก DBMS. server และกรณไมมขอมลภาพเกบอย จะทำการสงภาพสำรองเพอแสดงวาไมสามารถแสดงภาพทตองการได (บรรทดท 7-8 และ 18-19)

ตวอยางของการเรยกใช gallery-img.php เพอแสดงภาพจาก database table แสดงในตวอยาง gallery-show.php ซงจะแสดงรายชอภาพทงหมดทมใน gallery table พรอมกบแสดงภาพและขอความบรรยายซงการแสดงภาพประกอบจะใช HTML tag <IMG> และกำหนดชอไฟลภาพใน attribute SRC= เปน gallery-img.php พรอมทงสง query string imgid=photoid เพอระบภาพทจะแสดงดงรายการตอไปน

WEB PROGRAMMING Using PHP. and MySQL.

332

Listing 8.8-7 gallery-show.php1 <html> 2 <head> 3 <title>Photo Gallery</title> 4 <meta http-equiv="Content-Type" content="text/html; charset=tis-620"> 5 <style type="text/css"> 6 <!-- 7 .imgTitle { 8 color: #0000A0; 9 font-size:x-large; 10 font-weight:bold 11 } 12 .imgDesc { 13 color: #333333; 14 font-size:medium 15 } 16 --> 17 </style> 18 </head> 19 20 <body> 21 <h1>Photo Gallery</h1> 22 <p><a href="gallery-form.html">Add new photo</a></p> 23 <? 24 include ("db-inc.php"); 25 $dbcon = mysql_connect($host,$user,$pw); 26 if (!mysql_select_db($db)) die ("Cannot Select Database $db"); 27 $query = "SELECT photoid,titlename,description FROM gallery "; 28 $result = mysql_query($query,$dbcon); 29 ?> 30 <table border="0" cellspacing="0" cellpadding="3"> 31 <? 32 while ($row=mysql_fetch_object($result)) { ?> 33 <tr> 34 <td valign="top"><img src="gallery-img.php?imgid=<?= $row->photoid ?>"></td> 35 <td align="left" valign="top"> 36 <p class="imgTitle"><?= $row->titlename?></p> 37 <p class="imgDesc"><?= $row->description?></p> </td> 38 </tr> 39 <tr><td colspan="2"><hr></td></tr> 40 <? } 41 mysql_free_result($result); 42 mysql_close($dbcon); 43 ?> 44 </table> 45 </body> 46 </html>

การทำงานของโปรแกรมนเปนการอานขอมลทก row จาก gallery table (ในบรรทดท 24-28) แลวทำการวนนำขอมลแตละ row มาแสดงผลในรปแบบตาราง HTML (คำสงวนรอบบรรทด 32-40) ในบรรทดท 34 แสดงตวอยางการเรยกใช gallery-img.php ใน <IMG> tag

<img src="gallery-img.php?imgid=<?= $row->photoid ?>">

เมอถกเรยกใหทำงานจะไดผลลพธเปนรหส HTML ดงเชนตวอยาง<img src="gallery-img.php?imgid=1">

ซงจะทำการเรยกขอไฟลภาพไปยง server และโปรแกรม gallery-img.php กจะทำการประมวลผลแลวสงภาพกลบมาให ตวอยางผลลพธบนจอภาพเวบบราวเซอรทได แสดงดงรป 8.8-1

บทท 8การแสดงรายการขอมลจากฐานขอมล

333

รปท 8.8-1 การแสดงผลบนเวบบราวเซอรของ gallery-show.php

WEB PROGRAMMING Using PHP. and MySQL.

334 บทท 8การแสดงรายการขอมลจากฐานขอมล

335

9 สรปประจำบทในบทท 8 นเปนบททกลาวถงการนำขอมลจากฐานขอมลมาใชในการแสดงผลแบบตางๆ ตงแต

รปแบบการแสดงผลรายการขอมลจากฐานขอมล การเลอก column ของขอมลมาแสดงในรายการ การเลอก row ของขอมลทเหมาะสมกบหวขอสารสนเทศทจะใชประโยชน การแสดงรายการทกำหนดจำนวนรายการตอ 1 หนาจอ การสราง link จากรายการเพอไปแสดงรายละเอยดขอมลของรายการทเลอก การสรางรายการใหสามารถเลอกขอมลหลายๆ record หรอหลาย row พรอมกน การคนหาขอมลโดยกำหนดคำคนหาอยภายใน field และการเกบและแสดงขอมลภาพในฐานขอมล

เนอหาในสวนการเลอกรปแบบการแสดงผลมสวนสำคญคอการใช HTML tag เพอสรางรปแบบการแสดงผลตามทตองการ และนำสวนทเปน dynamic คอคำสงเวบโปรแกรมเขาไปแทรก ซงการใช expression tag <?= expression ?> เปนรปแบบทเหมาะสมกบการนำขอมลจากแตละ column ของ row ทไดจาก table มาแสดงแทนเนอหาทเปน static ซงในบทนไดยกตวอยางรปแบบการแสดงรายการขอมลแบบตางๆ ไดแก การแสดงแตละ row เปนบรรทดทวางอยชดกน การแสดงเปนยอหนา การแสดงเปน ordered/bullet list การนำมาแสดงเปน drop down list การแสดงในรปแบบตารางขอมลทง 1 record ตอ 1 บรรทดของตารางหรอแสดงหลาย record ใน 1 บรรทด เปนตน

สวนทมความสำคญทไดกลาวถงสำหรบการนำขอมลมาแสดงในรปรายการ (list) 2 เรองไดแก การเลอก column และ row ของขอมลทเหมาะสมในการนำมาแสดงผล โดยขอมลทใชอาจจะนำมาจาก table เดยวหรอหลาย table ทมความสมพนธกน ซงควรจะกำหนดใหคำสง SQL จำกดการนำขอมลออกจากฐานขอมลใหตรงกบความตองการและนำออกมาเฉพาะทจะตองใช เปนการใชระบบบรหารฐานขอมลใหทำงานตามหนาททควร ซงจะเปนผลในดานประสทธภาพ ความเรว และลดภาระของแมขายและการสอสารในเครอขายดวย

การสรางเวบโปรแกรมเพอแสดงขอมลจากฐานขอมลจะตองมความสมพนธกนระหวาง 3 ภาษา ไดแก ภาษาทแสดงผลบนเวบบราวเซอรไดแก HTML ภาษาทใชประมวลผลบนแมขายไดแก PHP และภาษาสำหรบการเขาถงฐานขอมลไดแกภาษา SQL ซงการแสดงรายการขอมลจากฐานขอมลจะใชคำสง SQL ทเปนหลกคอคำสง SELECT และ clause ตางๆ ของ SELECT ไดแก column expression คอการกำหนด column ทตองการผลลพธ FROM table1,table2,.. กำหนดชอ table ทใช WHERE expression กำหนดเงอนไขการเลอก row ทตรงตามความตองการ ORDERED BY column expression [DESC]กำหนดการจดเรยงลำดบขอมล และอาจจะมสวนเพมเตมคอ LIMIT [start,] rows กำหนดตำแหนง row เรมตนและจำนวน row ทจะเลอกออกมา

LIMIT clause ในคำสง SQL. ถกนำมาใชเปนสวนสำคญทใชจำกดจำนวนรายการตอ 1 หนาจอ หากกรณทมจำนวนขอมลทจะแสดงรายการเปนจำนวนมาก ควรจะมการแบงเปนหลายหนาจอ ซงสวนสำคญนอกเหนอจากการกำหนด LIMIT clause แลวจะตองมการคำนวณการแบงหนาวาจะมจำนวนหนาเทาใด ในหนาทแสดงปจจบนเปนหมายเลขหนาใดๆ จะเรมแสดงรายการแรกของหนานนจากรายการลำดบทเทาใด เพอนำไปกำหนดคา start ของ LIMIT clause และการรจำนวนหนาเพอนำไปแสดงหมายเลขหนาใหผใชเลอกขามไปแสดงหนาตางๆ ไดสะดวก โดยการหาจำนวนรายการทงหมดหรอจำนวน row ทตองการแสดงจากตารางจะใช aggregate function ของ SQL. คอ count (*) ใน column expression ของคำสง SELECT

การแสดงรายการของขอมลมกจะเปนการแสดงขอมลใหเหนเฉพาะบาง column ทเปนสวนสำคญของขอมลนน สวนขอมลรายละเอยดหรอ column อนๆ อาจไมไดแสดงไวทงหมดในรายการ โดยทวไปมกจะมการสราง link หรอ navigator เพอเชอมโยงไปยง page ทแสดงรายละเอยดของขอมลแตละ record เมอผใช click เลอก โดยสวนทสำคญของการสรางสวนเชอมโยงคอการใช <A HREF="URL ของ page"> และมการกำหนดคา argument ใน query string เพอเลอกขอมลของ row ทจะแสดง โดยทมการสราง argument ทแตกตางกนสำหรบแตละ record เพอใหเลอกเปดแสดงรายละเอยดของขอมลทเลอกไดถกตอง ดงนนเราสามารถนำเวบโปรแกรมไปสรางสวน dynamic ใน query string ของ tag <A HREF=""> ไดนอกเหนอจะนำขอมลจากฐานขอมลมาแสดงผลเพยงอยางเดยว

การสรางสวนเชอมโยงดวย <A HREF="URL"> เปนการสราง link ทผใชจะ click เพอเลอกขอมลใดขอมลหนง แตหากตองการสราง page ทแสดงรายการใหเลอกขอมลไดหลายขอมลพรอมกน กควรจะใช HTML form และ checkbox เขามาชวย <input type='checkbox' name='fieldname' value='value'> โดยใชสวน dynamic ทสรางจากเวบโปรแกรมเพอกำหนดคา value สำหรบ checkbox ใหเปนคา primary key หรอเปนขอมลทใชระบ row ของขอมลทเลอกได ซงเมอมการเลอกหลายรายการพรอมกนประกอบการตงชอ field เปน array จะทำให PHP สามารถรบขอมลจาก field เปน array ทมรายการทถกเลอกหลายๆ รายการนำไปใชประโยชนตอไป เชน การเลอกสนคาหลายรายการลงในรถเขนในระบบ e-commerce การเลอกสนคาหลายๆ รายการนำมาแสดงราย

WEB PROGRAMMING Using PHP. and MySQL.

336

ละเอยดเปรยบเทยบกน หรอแมกระทงการเลอกขอมลเพอลบออกจากรายการขอมลทงหมด ฯลฯ เปนตน

กรณทมขอมลเปนจำนวนมากอาจมการสรางเงอนไขใหผใชเลอกแสดงขอมล หรอใหผใชไดคนหาขอมลโดยกำหนดขอความคนหา ซงขอความนจะใชเพอเปนเงอนไขคดเลอกขอมลสำหรบดงออกมาแสดง หรอสรางรายการ การเลอกแสดงรายการทตรงกบเงอนไขหรอแสดงรายการตามคำคนหาขอมลของผใช จะเลอกขอมลทมคำทผใชระบเปนสวนหนงในขอมลของ column ทตองการ การคดเลอกขอมลในลกษณะน จะใช operator LIKE ของ SQL ใน WHERE clause รวมกบอกขระพเศษ wildcard character % หนาและหลงขอความทตองการคนหา %คำคนหา% เพอใหเลอกรายการทมคำคนหาอยอาจจะนำหนาหรอตอทายดวยขอความใดๆ กได และหากมการเรยก page ตางๆ เชอมโยงตอเนองกนเปนลำดบหลาย page จะตองสงคำคนหานตอเนองไปทก page ซงอาจจะใช session หรอ cookie ชวยเกบขอความคำคนหาน

ในการเกบขอมลลงในฐานขอมลนอกเหนอจากขอมลทเปนขอความ ตวเลข อกขระตางๆ แลว ขอมลชนดอนๆ เชนรปภาพ ไฟลเอกสาร (PDF., word,…) หรอไฟลขอมลทกชนด กสามารถเกบลงใน column ของ database table ดวยโดยมาตรฐานทวไปของ database system มกจะม field ชนด BLOB (binary large object) ทใชเกบขอมลชนดทใดๆ กได ในบทนไดยกตวอยางการสงไฟลขอมลภาพจากผใชเกบลงในฐานขอมลทงไฟลและการนำขอมลไฟลทถกเกบไวนนกลบออกมาแสดงหรอใหทำการ download กลบไปหาผใชทางเวบบราวเซอรได โดยสวนทสำคญคอการใชเวบโปรแกรมสรางไฟลสงกลบไปยงเวบบราวเซอรทมการสง HTTP response header เพอระบวาเปนไฟลขอมลชนดใด ตามดวยเนอหาของไฟลเพอสงกลบไปยงเวบบราวเซอรคอเราสามารถใชชอไฟลเวบโปรแกรมแทนชอไฟลชนดอนๆ ใดและเวบโปรแกรมกสามารถสรางกลบออกมาเปนไฟลขอมลสงกลบไปยงเวบบราวเซอรจากขอมลทเกบอยในฐานขอมลได

บทท 8การแสดงรายการขอมลจากฐานขอมล

337

10 แบบฝกหด1. การกำหนด expression ใน SQL เพอใหไดผลลพธทตองการไดอยางไร ตามกรณดงตอไปน

a. การเลอก column บาง column จาก table และกำหนดชอ column ใหมb. การเลอก row ทตองการตามเงอนไขc. การเรยงลำดบขอมล

d. การสราง column ทมาจากการหาคาสงสด ตำสด คาเฉลย การนบจำนวนe. การสราง column ตามขอ 1.d. โดยแยกผลลพธเปนกลมตาม field บาง field

f. การสรางผลลพธจากขอ 1.e โดยเลอกออกมาตามเงอนไขทขนกบผลลพธของ column ทได เชน สราง column นบจำนวนรายการแยกตามกลมและนำออกมาเฉพาะทมจำนวนรายการมากกวา 10 เทานน

g. การกำหนดจำนวน row ทตองการ และการกำหนด row เรมตนทตองการh. เลอก row โดยเรมจาก row ใดๆ ไปจนจบตามเงอนไข เชน ตองการขอมลทตรงตาม

เงอนไขตงแต row ท 20 จนถง row สดทาย

2. จากตาราง graduated ในหวขอ 8.1

a. จงเขยนคำสง SQL SELECT เพอใหได column stID, stName (มาจาก firstName เวนวรรค และตอดวย lastName), gpa. โดยใหเลอกนกศกษาเฉพาะปของ gradate เปนปทแลวและมผลการเรยน gpa. สงกวา 3.5 โดยใหเรยงลำดบตาม gpa. สงลงมาหาตำ

b. สราง page เพอแสดงรายชอนกศกษาตามขอ 2.a. โดยใช table ทไมมขอบ

3. จากตาราง graduated และ depart ในหวขอ 8.1

a. จงเขยนคำสง SQL SELECT เพอนบจำนวนนกศกษาทสำเรจการศกษาในปทกำหนดและหา gpa. เฉลยแยกตามแตละ dept ใหได column deptName (ชอ department), totalGradCount (จำนวนนกศกษาของ department ทนบได) , gpaAvg (gpa เฉลยของทง department) ใหเลอกเฉพาะ department ทมผสำเรจการศกษา เรยงลำดบขอมลตามชอ department

b. สราง page ทแสดงขอมลทไดจาก 3.a.โดยใช monospace font ใหแสดงแตละ column ตรงกน โดย page นจะกำหนดปเพอสรางคำสง SQL แบบ dynamic ใหรบขอมลปมาจาก field ชอ reqYear ของ FORM ทกำหนด method เปน POST

4. จากตาราง gallery ทกำหนดในหวขอ 8.1 จงเขยนเวบโปรแกรมทม 2 page ไดแก photoSearch.html และ SearchPhoto.php โดย page แรก photoSearch.html แสดง FORM เพอใหผใชกำหนดขอความทตองการคนหา และเมอผใชทำการ submit จะเรยก page SearchPhoto.php เพอใหทำการคดเลอก row จาก gallery table ทมขอความทผใชกำหนดอยในสวนใดสวนหนงของขอมล column description ใหแสดงชอภาพจาก column titlename และรหสภาพในวงเลบ titlename (photoID) โดยแสดงในลกษณะ Unordered list แบงหนาละไมเกนจำนวนรายการทกำหนดในตวแปร cookie ชอ photoListLPP เชนหากตวแปร photoListLPP ใน cookie มขอมล 15 กใหแสดงหนาละ 15 บรรทด แตหากไมมการกำหนดตวแปร cookie photoListLPP หรอกำหนดเปนคาทนอยกวา 1 จะใหแสดงหนาละ 20 บรรทด

ขอแนะนำ ใหแยกคดขอกำหนดแตละสวน เชน คำสง SQL ตามเงอนไขแบบ static การสรางสวน dynamic ใหคำสง SQL การสราง page ทมการแบงหนา การนำคาจาก cookie มาใชเปนตวกำหนดจำนวนรายการตอหนา เปนตน

5. ดดแปลงขอ 4 ใหแสดง photo แตละรายการในรปแบบ table ใหม 3 รายการตอ 1 row ใน table (หวขอ 8.2.7)

WEB PROGRAMMING Using PHP. and MySQL.

338

6. ดดแปลงขอ 4 ใหม navigation จากขอมลทแสดงแตละรายการเพอเรยกไปยง page showPhoto.php โดยสง photoID ทาง query string ตอทายดวย

7. จากขอ 4-6 สราง page showPhoto.php ใหรบ photoID สราง page เพอแสดงขอมลตางๆ ใน table gallery รวมทงแสดงภาพทถกเกบใน field ดวย

8. แสดงรายการใบสงซอประจำสปดาหน จาก table purchaseOrder และ POitems ทมโครงสรางตามทแสดงดานลางนในรปแบบ table ใหออกแบบรายการใหเหมาะสม เชน การเลอก field ทจะแสดงใหมเฉพาะขอมลทสำคญ โดยเลอกได 2 รปแบบคอรปแบบทมการแบงเปนหนาทเหมาะกบจอภาพ และรปแบบทไมมการแบงหนา

table purchaseOrderชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆPOID เลขทใบสงซอ varchar 6 999999 PK, not null,

auto incrementVendor ผจำหนาย varchar 30 Not null

PDate วนทสง Date Not null

Dept แผนกทสง varchar 30 Not null

table POitemชอ column คำอธบาย ชนดขอมล ความยาว รปแบบขอมล คณสมบตอนๆPOID เลขทใบสงซอ Integer 6 YY9999 PK, not null,

auto incrementitemNo ลำดบท Integer 2 PK, notnull

ProdTitle ชอสนคา varchar 50 Not null

Quan จำนวน integer 3 Not null

UnitPrc ราคาตอหนวย

float

9. สราง application จากขอ 8 ดดแปลงใหบนทกรายการในขอ 8 ลงใน CSV file ทคนดวยเครองหมายทเหมาะสม เพอนำไปเปดในโปรแกรม Microsoft Excel ได

บทท 8การแสดงรายการขอมลจากฐานขอมล