SlideShare a Scribd company logo
บทที่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 name@host.dom
ain
ตารางที่ 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 null
name ชื่อภาควิชา 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 : มหากาพย์, (greatest@aaa.com)<br>
0000-00-00 00:00:00<hr>
<p>ชอบมากค่ะ<p>Guest : สุเมธ, (123@444.com)<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
<?php
include ("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 "tt<th>$key</th>n";
}
echo "t</tr>n";
$first = false;
}
echo "t<tr>n";
foreach ($line as $col_value) {
echo "tt<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=10314
addcart.jsp?prod=97-1363-05&quan=7
popup-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 some
if (!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 field
if (!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 Database
include ("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 table
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,
PRIMARY KEY ('photoID')
) TYPE=MyISAM;
การสร้าง member table ที่มี column เก็บรูปสมาชิกแสดงใน Listing 8.8-2
Listing 8.8-2 คำสั่งสร้าง member table
CREATE 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 table
CREATE 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.php
1 <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.php
1 <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 increment
Vendor ผู้จำหน่าย varchar 30 Not null
PDate วันที่สั่ง Date Not null
Dept แผนกที่สั่ง varchar 30 Not null
table POitem
ชื่อ column คำอธิบาย ชนิดข้อมูล ความยาว รูปแบบข้อมูล คุณสมบัติอื่นๆ
POID เลขที่ใบสั่งซื้อ Integer 6 YY9999 PK, not null,
auto increment
itemNo ลำดับที่ 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
การแสดงรายการขอมูลจากฐานขอมูล

More Related Content

PDF
1436 التقويم الهجري
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
1436 التقويم الهجري
2024 Trend Updates: What Really Works In SEO & Content Marketing
Storytelling For The Web: Integrate Storytelling in your Design Process
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
Ad

Php book-ch8-database inquiry

  • 1. บทที่8 การแสดงรายการข้อมูลจากฐานข้อมูล การนำข้อมูลจากฐานข้อมูลมาใช้งานมักเริ่มต้นจากการแสดงรายการข้อมูลตาม เงื่อนไขรายการที่เหมาะสม เช่น แสดงหัวข้อข่าวสารล่าสุด 5 รายการ แสดงรายชื่อสินค้าที่ลด ราคาหรืออยู่ในรายการส่งเสริมการขาย แสดงรายชื่อภาพยนตร์เข้าใหม่ หรือภาพยนตร์ประเภท ที่ลูกค้าสนใจ แสดงรายชื่อหนังสือที่ได้รับความนิยม 10 อันดับแรก ฯลฯ เนื่องจากข้อมูลที่เก็บอยู่ ในตารางฐานข้อมูลมักจะมีปริมาณข้อมูล ทั้งจำนวน column และ row เป็นจำนวนมาก ไม่ เหมาะสมที่จะนำข้อมูลทั้งหมดออกมาแสดง เนื่องจากจะยาวเกินไปและไม่เป็นผลดีต่อการตัดสิน ใจเลือกหารายการที่ต้องการเพื่อดำเนินการต่อของผู้ชม ดังนั้นการนำข้อมูลจากฐานข้อมูลออก มาใช้ประโยชน์ด้วยการแสดงรายการเพื่อให้ผู้ชมได้เลือกดำเนินการใดๆ กับรายการที่ต้องการ จึงต้องมีการพิจารณาเลือกการแสดงอย่างเหมาะสม ซึ่งสิ่งที่ต้องพิจารณาได้แก่ • รายการกลุ่มใด หรือเงื่อนไขใดในแนว row ที่จะนำมาแสดง • แสดงรายการเป็นจำนวน row เท่าใดต่อ 1 หน้าจอหากมีจำนวนข้อมูลมากๆ และ ส่วนที่เหลือจะแสดงได้อย่างไร • รายการที่แสดงนั้นจะจัดเรียงลำดับการแสดงก่อนหลังอย่างไร • จะเลือก column ใดแสดงในรายการเพื่อให้เหมาะสมต่อความกว้างของจอภาพ โดยผู้ชมสามารถแยกแยะแต่ละรายการได้ • จะแสดงรายการบนจอในรูปแบบอย่างไร • จะดำเนินการอะไรต่อรายการที่แสดงต่อไป • สามารถเลือกรายการเพื่อดำเนินการได้ครั้งละรายการเดียวหรือหลายรายการ ในบทนี้จะได้กล่าวถึงการสร้างการแสดงรายการจากฐานข้อมูลให้ผู้ชมสามารถเลือก ดำเนินการใดๆ ต่อข้อมูลที่ต้องการต่อไป
  • 2. 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 name@host.dom ain ตารางที่ 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 null name ชื่อภาควิชา varchar 60 Not null บทที่ 8 การแสดงรายการขอมูลจากฐานขอมูล
  • 3. 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.
  • 4. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 5. 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.
  • 6. 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 : มหากาพย์, (greatest@aaa.com)<br> 0000-00-00 00:00:00<hr> <p>ชอบมากค่ะ<p>Guest : สุเมธ, (123@444.com)<br> 2005-01-23 14:12:43<hr> </body> </html> บทที่ 8 การแสดงรายการขอมูลจากฐานขอมูล
  • 7. 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.
  • 8. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 9. 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.
  • 10. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 11. 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.
  • 12. 306 รูปที่ 8.2-4 การแสดงผลในรูปตาราง <table> Listing 8.2-8 mysql-ex01.php <?php include ("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 "tt<th>$key</th>n"; } echo "t</tr>n"; $first = false; } echo "t<tr>n"; foreach ($line as $col_value) { echo "tt<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 การแสดงรายการขอมูลจากฐานขอมูล
  • 13. 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.
  • 14. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 15. 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.
  • 16. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 17. 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.
  • 18. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 19. 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.
  • 20. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 21. 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.
  • 22. 316 <td align="center"><a href="vdocart.php">Show Cart</a> | Home</td> </tr> </table> </td></tr></table> </form> </body> </html> บทที่ 8 การแสดงรายการขอมูลจากฐานขอมูล
  • 23. 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=10314 addcart.jsp?prod=97-1363-05&quan=7 popup-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.
  • 24. 318 ตัวอย่างการแสดงรายชื่อภาพยนตร์จากตาราง movie ที่สามารถ click link แสดงรายละเอียด ได้ ผลลัพธ์ที่ต้องการแสดงดังรูปที่ 8.5-1 แสดง script ได้ดัง Listing 8.5-1 รูปที่ 8.5-1 บทที่ 8 การแสดงรายการขอมูลจากฐานขอมูล
  • 25. 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.
  • 26. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 27. 321 <p><a href="movielist-wlink.php">Back to Movie list </a></p> </body> </html> WEB PROGRAMMING Using PHP. and MySQL.
  • 28. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 29. 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 some if (!isset ($_POST["wishID"])) { echo ("Please select some item. <a href="diamond-select.php">Back to select</a>"); WEB PROGRAMMING Using PHP. and MySQL.
  • 30. 324 exit(); } // There are selected items // Get select list from field $wishesList = ""; $wishesSelected = $_POST["wishID"]; // get list from field if (!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 การแสดงรายการขอมูลจากฐานขอมูล
  • 31. 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.
  • 32. 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 Database include ("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 การแสดงรายการขอมูลจากฐานขอมูล
  • 33. 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 table 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, PRIMARY KEY ('photoID') ) TYPE=MyISAM; การสร้าง member table ที่มี column เก็บรูปสมาชิกแสดงใน Listing 8.8-2 Listing 8.8-2 คำสั่งสร้าง member table CREATE 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.
  • 34. 328 ตัวอย่างการสร้างตารางข้อมูลเก็บรูปหน้าปกแผ่นวีซีดีภาพยนตร์ที่มีขนาดใหญ่กว่า 16Kbytes โดยใช้ชนิด MEDIUMBLOB แสดงใน Listing 8.8-3 Listing 8.8-3 คำสั่งสร้าง movie table CREATE 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 35. 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.php 1 <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.
  • 36. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 37. 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.
  • 38. 332 Listing 8.8-7 gallery-show.php 1 <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 การแสดงรายการขอมูลจากฐานขอมูล
  • 41. 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.
  • 42. 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 การแสดงรายการขอมูลจากฐานขอมูล
  • 43. 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.
  • 44. 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 increment Vendor ผู้จำหน่าย varchar 30 Not null PDate วันที่สั่ง Date Not null Dept แผนกที่สั่ง varchar 30 Not null table POitem ชื่อ column คำอธิบาย ชนิดข้อมูล ความยาว รูปแบบข้อมูล คุณสมบัติอื่นๆ POID เลขที่ใบสั่งซื้อ Integer 6 YY9999 PK, not null, auto increment itemNo ลำดับที่ 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 การแสดงรายการขอมูลจากฐานขอมูล