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
การแสดงรายการขอมูลจากฐานขอมูล
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry
Php book-ch8-database inquiry

More Related Content

Featured

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
marketingartwork
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
Skeleton Technologies
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
SpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Lily Ray
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
Rajiv Jayarajah, MAppComm, ACC
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
Christy Abraham Joy
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
Vit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
MindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
GetSmarter
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
Alireza Esmikhani
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
Project for Public Spaces & National Center for Biking and Walking
 

Featured (20)

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 

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 การแสดงรายการขอมูลจากฐานขอมูล