รบกวนปรึกษาระบบจองห้องพักหน่อยครับ พอดีมีปัญหานิดหน่อยครับ อยากจะได้คำแนะนำดีๆจากพี่ๆที่มีประสบการณ์ครับ
หลักการของผมคือ จะทำรูปแบบคล้ายๆกับเว็บนี้ครับ
http://www.apphp.com/php-hotel-site/examples/sample2/index.php
Date :
2011-11-19 00:05:29
By :
asustak
คับ ผมคิดว่า (น่าจะตอบถูกประเด็น ถ้าเดาไม่ผิด คือการจองของคุณจองตามชนิดห้อง ไม่สามารถระบุห้องเป็นชื่อห้องได้ แล้ว ทางเราจัดหาห้องตามชนิดนั้นให้เอง)
ในตารางชนิดห้อง ต้องระบุ จำนวนที่จำกัดไว้
ในตารางจอง ต้องมีข้อมูลวัน จอง ของทุกวัน คือถ้าอยู่หลายวัน ก็จะมี reccordของแต่ละวัน
ผมคิดว่า การออกแบบให้ใช้งานได้ง่าย และมีข้อมูลครบเป็นสิ่งจำเป็น ผมไม่แน่ใจว่าวิธีผมจะถูกและดีพอหรือป่าว(มันขึ้นอยู่กับการออกแบบ gui ด้วย) เช่น
ตารางจอง มี primary 3 ตัว
book_id
roomtype_id
use_day
ข้อมูลทั้งสามวันนี้ จะต้องไม่ซ้ำกัน เราสามารถใช้ group by ได้
เช่นหาว่า มีกี่ booking ในวันนั้น group by book_id where use_day='xxx';
เราหาว่า ห้องชนิดนั้น ว่างหรือป่าว อันดับแรก เราต้องรู้ก่อนว่าห้องชนิดนั้น roomtype_id อะไร max เท่าไรถ้าได้แล้ว
ก็เอามาหาโดย select count(book_id) as count1 from tbl where roomtype_id=x and use_day in('day1', 'day2', 'dayx');
if ($count1 < $max)
คุณสามารใช้ select ซ้อนกัน เพื่อ นับทั้งหมดทุกชนิดห้องในคราวเดียวได้
ถ้าหากคุณต้องการให้มีข้อมูลห้องทั้งหมด ถึงแม้จะไม่ค่อยได้ใช้ก็ทำได้
บางทีคุณอาจจำเป็นต้องใส่ข้อมูลที่ซ้ำซ้อนบ้างเพื่อลดภาระ การทำงาน อาจมีฟีลที่ไม่จำเป็นต้องมี แต่ทำให้เขียนโปรแกรมได้ง่ายและทำงานได้เร็วกว่า ผมคิดว่าไม่ได้เป็นเรื่องที่ผิดถ้ามันจำเป็นจริงๆ
แค่เป็นแนวทางนะคับ
ผมเคยทำนานมาแล้วตอนนั้นออกแบบ db ใช้เวลานานมากและมันเยี่ยมมาก แต่ผมลืมไปแล้ว TT ทั้งเว็บเกือบ 20 ตาราง สมุดที่ร่างไว้อยู่ไหนซักที่ ออกแบบฐานข้อมูลให้ดีที่สุดก่อนโดยคิดถึงเว็บที่จะทำ จะทำให้เรามีปัญหาน้อยเวลาพัฒนา
http://www.pjgunner.com
Date :
2011-11-19 09:46:44
By :
pjgunner.com
สมมุติผมให้ค้นหาห้องพักวันที่
2011-11-18 ถึง 2011-11-20
เขียน sql ให้ select ดังนี้
Code (PHP)
SELECT *,count(rtid) as num_room FROM room_order WHERE (chk_in BETWEEN ' 2011-11-19' and '2011-11-20') OR (chk_out BETWEEN ' 2011-11-19' and '2011-11-20') group by rtid
ถูกต้องหรือไม่ครับ
เราก็จะได้ผลลัพธ์คือ
ในช่วงวันที่ 2011-11-19 ถึง 2011-11-20 มีการจองมาทั้งหมดกี่ห้อง
ผมเข้าใจถูกต้องไหมครับ
ตัวอย่าง code ที่ผมจะเขียนจะคล้ายๆกับระบบของ
http://www.apphp.com/php-hotel-site/examples/sample2/index.php ตัวนี้ครับ
ประวัติการแก้ไข 2011-11-19 22:43:50 2011-11-19 22:51:11
Date :
2011-11-19 22:42:33
By :
asustak
ค้นจาก check in กะ check out ? คุณลองคิดดูสิ
ถ้าผม เช็ึคอิน วันที่ 1 เช็ึคเอาท์ วันที่ 31
คุณค้น วันที่ 5 - 8 มันจะเจอไหม
แต่ไม่ใช่ว่าจะใช้สองตัวนี้ไม่ได้ ต้ิงคิดเผื่อปัญหาด้านบนไว้ด้วย
Date :
2011-11-20 08:41:37
By :
pjgunner.com
ตอนนี้ผมติดปัญหาดังนี้ครับ
Code (PHP)
$qryroom = mysql_query("SELECT *,count(rtid) as room_now FROM room_order WHERE ('$chk_in' BETWEEN chk_in and chk_out) OR ('$chk_ou' BETWEEN chk_in and chk_out) group by rtid asc");
<?
while($arr=mysql_fetch_array($qry)) { ?>
<form id="frm_order" name="frm_order" method="post" action="">
<table width="650" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><?=$arr['name']?> (<?=$arr['total_room']?>)</td>
<td width="250" rowspan="3" align="center"><img src="images/<?=$arr['image']?>" width="200" height="157"></td>
</tr>
<tr>
<td height="150" valign="top"><div style="margin-top:15px"><?=$arr['detail']?></div></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<? // while($arr2=mysql_fetch_array($qryroom)){?>
ว่าง (
<?
$arr2=mysql_fetch_array($qryroom);
if($arr2['room_now']!='0' && $arr2['room_now']!='')
{
$room_ready = $arr['total_room']-$arr2['room_now'];
echo $arr['total_room']."<br>".$arr2['room_now'];
}else if($arr2['room_now']==''){
echo $arr['total_room'];
}else{
echo $arr['room_now']."ห้องเต็ม" ;
}
?>
) ห้อง
<br>
Max Adults: 1, Max Children: 0 <br>
Rate per night: $91.00 <br>
Rooms:
<? // } ?>
<select name="select" id="select">
<? for($i=1;$i<=10;$i++){ ?>
<option><?=$i?> (<? $price = $arr['total_price'] * $i; echo "฿ ".number_format($price) ?>)</option>
<? } ?>
</select>
</td>
<td align="center">
<? if($_POST['check_room']!=''){ ?>
<input type="submit" name="Book" id="Book" value="Book Now"><?=$arr['rid']?>
<? } ?>
<input type="hidden" name="room_name" id="room_name" value="<?=$arr['rid']?>">
<input type="hidden" name="chk_in" id="chk_in" value="<?=$chk_in?>">
<input type="hidden" name="chk_out" id="chk_out" value="<?=$chk_out?>">
<input type="hidden" name="D_total" id="D_total" value="<?=DateDiff($chk_in,$chk_out);?>">
<a href="<?=_MYPAGE_?>?booking=true">ทดสอบ</a></td>
</tr>
</table>
<br>
<div style="border-bottom-style:dotted; border-bottom-color:#CCCCCC; border-bottom-width:1px; margin-left:10px; margin-right:10px; height:20px"></div><br>
</form>
<? } // ปิด while
?>
ปัญหาคือว่า
สมมุติ หน้าจอรายชื่อห้อง
มี
A
B
C
D
ห้อง A ถูกจอง 2 ห้อง
ห้อง B ถูกจอง 1 ห้อง
ห้อง C ยังไม่ถูกจอง
ห้อง D ถูกจอง 2 ห้อง
แต่จากตัว code จะแสดงผลเป็น
A ถูกจอง 2 ห้อง
B ถูกจอง 1 ห้อง
C ถูกจอง 2 ห้อง
D
ไม่ทราบว่าจะแก้ query เป็นยังไงดีครับ ถึงจะแสดงผลเป็น
ห้อง A ถูกจอง 2 ห้อง
ห้อง B ถูกจอง 1 ห้อง
ห้อง C ยังไม่ถูกจอง
ห้อง D ถูกจอง 2 ห้อง
ผมรู้ว่าติดช่วง
Code (PHP)
if($arr2['room_now']!='0' && $arr2['room_now']!='')
แต่นึกหลักการไม่ออก
ขอคำแนะนำด้วยนะครับ
Date :
2011-11-21 08:41:06
By :
asustak
ผมไม่รู้ว่าคุณออกแบบฐานข้อมูลอะไรยังไง
ปัญหานี้ คงไม่ยากกระมัง
ไม่เห็นจะมีระบุวันที่การแสดงเลย ล่ะคับ ว่าจองหลังจากวันนี้ หรือใช้งานไปแล้ว ข้อมูลเก่าๆ มันไม่ออกมาด้วย ?
Date :
2011-11-21 11:12:50
By :
pjgunner.com
รายละเอียดที่ต้องการจะคล้ายลักษณะนี้ครับ
ถ้ามีเช็คห้องพักว่างจากฟอร์ม input มา
ก็จะทำการเช็ค และ query ข้อมูลดังกล่าวมาโชว์ ลักษณะคล้ายกับรูปตัวอย่างครับ
ส่วนของฐานข้อมูลอ้างอิง ตามข้อมูลใน comment แรก ครับ
ประวัติการแก้ไข 2011-11-21 13:03:27
Date :
2011-11-21 12:30:07
By :
asustak
ไม่มีใครเข้ามาตอบเลย
Date :
2011-11-21 21:25:29
By :
asustak
ตกลงได้ยังครับ พอดีว่าผมก็เจอปัญหานี้เหมือนกัน ขอคำแนะนำที
Date :
2012-02-22 16:16:36
By :
enland
Load balance : Server 04