การวนลูปดึงข้อมูลแสดงผลแบบ 2 มิติ จัดทำโดย : อ้ายคำปัน
     ในความเป็นจริงการเขียนโปรแกรมทำงานร่วมกับ Database ที่ผ่านการ Normalizations มาอย่างดีนั้น
เป็นเรื่องที่ค่อนข้างละเอียดและซับซ้อนมากพอควร คนเขียนโปรแกรมจะต้องเข้าใจ Database และจังหวะของ
การแสดงผลจีงจะสามารถทำข้อมูลใน Database ที่มีอยู่ขึ้นมาแสดงผลได้ตามต้องการ
    ในบทความนี้จะแสดงตัวอย่างการดึงข้อมูลจาก Database 3 table เพื่อแสดงผลในตารางเดียว ในตัวอย่าง
นี้จะดูไม่ค่อยสวยเท่าไหร่เนื่องจากผู้เขียนไม่ใช้ CSS เพราะเกรงว่าโค้ดจะเยิ่นเย้อเกินไป ซึ่งผู้อ่านสามารถนำไป
ประยุกต์เองได้เมื่อเข้าใจหลักการ


ขั้นตอนการทำ

1. สมมติมีตารางฐานข้อมูลดังนี้ (ข้อมูลสมมติ)
tb_area เก็บชื่อ(พื้นที่)

CREATE TABLE `tb_area` (
`id` int(2) NOT NULL auto_increment,
`name` varchar(100) default NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `tb_area` VALUES (1,'เขต 1');
INSERT INTO `tb_area` VALUES (2,'เขต 2');


tb_type เก็บประเภท(คน)

CREATE TABLE `tb_type` (
`type_id` int(2) NOT NULL auto_increment,
`type_name` char(100) default NULL,
PRIMARY KEY (`type_id`)
);
INSERT INTO `tb_type` VALUES (1,'เด็ก');
INSERT INTO `tb_type` VALUES (2,'วัยรุ่น');
INSERT INTO `tb_type` VALUES (3,'คนชรา');


tb_value ตางรางในการเก็บข้อมูลหลัก

CREATE TABLE `tb_value` (
`id` int(2) NOT NULL default '0',
`type_id` int(2) NOT NULL default '0',
`number` int(11) default NULL,
PRIMARY KEY (`id`,`type_id`)
);
INSERT INTO `tb_value` VALUES (1,1,1000);
INSERT INTO `tb_value` VALUES (1,2,2000);
INSERT INTO `tb_value` VALUES (1,3,1500);
INSERT INTO `tb_value` VALUES (2,1,800);
INSERT INTO `tb_value` VALUES (2,2,3000);
INSERT INTO `tb_value` VALUES (2,3,2000);


2.สร้าง PHP ใหม่แล้วสร้างตารางดังนี้

<table width="350" border="0" bgcolor="#000000">
<tr bgcolor="#FFFFFF">
<td align="center"><strong>ปี</strong></td>
<td align="center"><strong>พื้นที่</strong></td>
<td align="center"><strong>&nbsp;</strong></td>
</tr>
<tr bgcolor="#FFFFFF">
<td align="center">&nbsp;</td>
<td align="center">&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>


3.เขียนโค้ดติดต่อ Database และดึงข้อมูลจาก Database
<?
$host = "localhost"; //ชื่อ database server
$user = "ชื่อผู้ใช้"; //ชื่อผู้ใช้ databse ที่มีสิทธิ์
$pass = "รหัสผ่าน"; //รหัสผ่าน
$dbase = "ฐานข้อมูล"; //ชื่อฐานข้อมูลที่จะใช้

$link = mysql_connect($host,$user,$pass) or die("Connect error : ".mysql_error()); //ติดต่อ database
mysql_select_db($dbase); //เลือกฐานข้อมูลที่จะใช้
?>


4.ตลุยโค้ดกันเลย
<? $sql = "SELECT type_id, type_name FROM tb_type ORDER BY type_id"; //selec ข้อมูลสำหรับแสดงผลเป็นหัวตาราง
$rsItem = mysql_query($sql) or die("Select error : ".mysql_error()); //สร้าง result set
$item_id = array();
$item = array();
$i = 0;
while($value = mysql_fetch_assoc($rsItem)){/*วนลูปดึงข้อมูลเก็บเข้า array อาจจะใช้ mysql_fetch_array ก็ได้การใช้งานเหมือนกันแต่
mysql_fetch_array จะกว้างกว่าตรงที่สามารถระบะได้ทั้งตำแหน่งและชื่อของฟิลด์*/

$item_id[$i] = $value['type_id']; //เก็บ id สำหรับกำหนดเงื่อนไขในการวนลูปแนวกว้าง
$item[$i] = $value['type_name']; //เก็บตัวแปร item สำหรับแสดงผลหัว column
$i ++;
}
mysql_free_result($rsItem); //สั่งคืนค่าหน่วยความจำเพราะ $rsTopic ไม่มีการใช้งานอีกแล้ว

$sql = "SELECT DISTINCT(tb_value.id),name FROM tb_value RIGHT JOIN tb_area ON tb_area.id = tb_value.id ORDER BY tb_value.id";
$rsValue = mysql_query($sql) or die("Select error : ".mysql_error());// SELECT ข้อมูล id,name จากตาราง tb_value โดยมีการตรวจสอบกับตาราง tb_area ซึ่งเป็น lookup table
$num_rows = mysql_num_rows($rsValue);//นับจำนวนแถวว่ามีข้อมูลหรือไม่
?>


5.แทรกโค้ดในตารางที่สร้างไว้ก่อนหน้า
<?
if($num_rows>0){//ถ้ามีก็ให้แสดงผลตารางข้อมูล
?>
<table width="350" border="0" bgcolor="#000000">
<tr bgcolor="#FFFFFF">
<td align="center"><strong>พื้นที่</strong></td>
<?
for($i=0;$i<count($item_id);$i++){
?>
<td align="center"><strong><?=$item[$i]//แสดงผลหัวคอลัมน์?></strong></td>
<?
}
?>
</tr>
<?
while($ListValue = mysql_fetch_assoc($rsValue)){//วนลูปแสดงผลข้อมูลมิติที่ 1 ตามแนวตั้ง /แถว
?>
<tr bgcolor="#FFFFFF">
<td align="left">&nbsp;<?=$ListValue['name']//แสดงผลชื่อพื้นที่?></td>
<?
/*วนลูปแสดงผลข้อมูลมิติที่ 2 ตามแนวขวาง /คอลัมน์*/
for($i=0;$i<count($item_id);$i++){ //วนลูปให้เท่ากับจำนวน item
$sql = "SELECT number FROM tb_value WHERE id={$ListValue['id']} AND type_id={$item_id[$i]}";//วนลูปหาค่าในแต่ละเชลล์ของตารางตามค่าในคีย์หลักของแถว และ คอลัมน์
$rsColValue = mysql_query($sql) or die("Select error : ".mysql_error());
$ColValue = mysql_fetch_assoc($rsColValue); //แน่ใจว่าในแต่ละเชลล์มีค่าเดียว จึงไม่ต้อวนลูป ทำ mysql_fetch_assoc เพราะถึงแม้วนลูปค่าที่ได้ก็จะมีแค่ค่าเดียวเหมือนกัน
?>
<td align="center"><?=number_format($ColValue['number'])?></td>
<?
mysql_free_result($rsColValue); //คืนค่าเมื่อไม่ได้ใช้แล้ว
}//end for
}//end while
mysql_free_result($rsValue); //คืนค่าหน่วยความจำ
?>
</tr>
</table>
<?
}
else{
echo "<p align=\"center\"><strong>ไม่มีข้อมูล</strong></p>";
}
?>


6. ปิดการติดต่อฐานข้อมูลเมื่อใช้เสร็จแล้ว
<?
mysql_close($link); //ปิดการติดต่อฐานข้อมูล
?>


7. ผลลัพธ์


***ลองเอาไปประยุกต์ดูนะครับ หากมีปัญหาสงสัยติดต่อผมได้ตามข้างล่างครับ ^^***

Download Source Code

ผู้จัดทำ : วิวัฒน์ มณีจันสุข
ที่อยู่อีเมลล์ :
winnerww@hotmail.com
website : http://computerpsycho.boxchart.com

คุณอาจสนใจ
การสร้างนามบัตรอย่างง่าย
Lek (55,629 - 27 มิ.ย. 49)
เทคนิคการแสดงรูปภาพแทนตัวเลข
Mr.GuruZ (33,581 - 03 มิ.ย. 49)
การทำก้อนเมฆ
ดินสอ (147,777 - 17 ก.ค. 49)
เครื่องหมายตัวดำเนินการ และสัญลักษณะที่ใช้ในการคำนวณ
นายนุก (58,986 - 04 มี.ค. 51)
การกำหนดวัตถุประสงค์ และการออกแบบฐานข้อมูล
Mr.N (23,960 - 30 เม.ย. 50)
วิธีลงโปรแกรม jdk
Mr.POP (44,340 - 05 พ.ย. 49)
การสร้าง webboard ตอน 5 (การสร้าง Link ให้กับกระทู้)
Mr.GuruZ (59,442 - 03 มิ.ย. 49)
การกำหนดภาษาไทยใน Windows XP
เว็บไทยดีดี (14,002 - 28 ก.ค. 50)