Thu 24 Jan 2008 08:46:54
ขอทดสอบตั้งกระทู้น้ะครับ เพราะทำเข้าต้อง 2-3 ครั้งก็ไม่ได้ ขึ้นว่า some error occure. Your message can not be save, please try again.
Thu 24 Jan 2008 09:08:34
พอดีผมได้โหลดโค้ด php+Ajax เพื่อทำฟอร์ม listbox ในการดึงข้อมูล จังหวัด อำเภอ ตำบล มีข้อสงสัยครับที่ว่า ในหน้าฟอร์มเมื่อระบุเลือก listbox จังหวัด ข้อมูลก็จะไปดึงมาเป็น จังหวัดทั้งหมดก็ถูกต้องครับ, แต่เมื่อระบุหน้าฟอร์มเลือก listbox อำเภอ ข้อมูลจะไปดึงมาเป็น อำเภอทั้งหมดปนกับตำบลทั้งหมดด้วย ซึ่งไม่ถูกต้อง, และเมื่อระบุหน้าฟอร์มเลือก listbox ตำบลแล้ว ข้อมูลจะไปดึงมาเป็น ตำบลทั้งหมด ซึ่งถูกต้อง
ปัญหาที่วิเคราะห์ : จะต้องแก้ไขที่โค้ดหรือว่าใน MySQL อาจจะเพิ่มฟิลด์ หรือแยกฟิลด์ ฯลฯ ??? โปรดชี้แนะด้วยครับ
===============================================
ไฟล์ locale_dropdown.php (มีเว็บไซด์ต้นทางด้วย)
<!--- ====================================
<a href="http://php-ajax-code.blogspot.com/"><img src="images/php_ajax_code.gif" border=0></a><br><br>
================================= --->
<body bgcolor="#F0FFF0">
<?
echo "<form name=sel>\n";
echo "จังหวัด : <font id=province><select>\n";
echo "<option value='0'>============</option> \n" ;
echo "</select></font>\n";
echo "อำเภอ : <font id=amper><select>\n";
echo "<option value='0'>==== ไม่มี ====</option> \n" ;
echo "</select></font>\n";
echo "ตำบล : <font id=tumbon><select>\n";
echo "<option value='0'>==== ไม่มี ====</option> \n" ;
echo "</select></font>\n";
?>
<script language=Javascript>
function Inint_AJAX() {
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} //IE
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} //IE
try { return new XMLHttpRequest(); } catch(e) {} //Native Javascript
alert("XMLHttpRequest not supported");
return null;
};
function dochange(src, val) {
var req = Inint_AJAX();
req.onreadystatechange = function () {
if (req.readyState==4) {
if (req.status==200) {
document.getElementById(src).innerHTML=req.responseText; //รับค่ากลับมา
}
}
};
req.open("GET", "locale.php?data="+src+"&val="+val); //สร้าง connection
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=tis-620"); // set Header
req.send(null); //ส่งค่า
}
window.onLoad=dochange('province', -1);
</script>
<!--- ***************** หมายเหตุ ************
<br><br>source from : <a href="http://php-ajax-code.blogspot.com/">php-ajax-code.blogspot.com</a> ***************** --->
==================================================
ไฟล์ locale.php
<html>
<title>การเลือก</title>
<body bgcolor="#F0FFFF">
<!-- <body bgcolor="#C6E2FF"> -->
<!-- <body bgcolor="#FFE1FF"> -->
</body>
</html>
<?
//กำหนดให้ IE อ่าน page นี้ทุกครั้ง ไม่ไปเอาจาก cache
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
header("content-type: application/x-javascript; charset=tis-620");
$data=$_GET['data'];
$val=$_GET['val'];
//ค่ากำหนดของ ฐานข้อมูล
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "17491749";
$dbname = "db_mysql";
mysql_pconnect($dbhost,$dbuser,$dbpass) or die ("Unable to connect to MySQL server");
if ($data=='province') {
echo "<select name='province' onChange=\"dochange('amper', this.value)\">\n";
echo "<option value='0'>==== เลือก จังหวัด ====</option>\n";
$result=mysql_db_query($dbname,"select loc_code,loc_abbr from location where loc_name = location_name and loc_code != '000000' and flag_disaster is null order by loc_abbr");
while(list($id, $name)=mysql_fetch_array($result)){
echo "<option value=\"$id\" >$name</option> \n" ;
}
} else if ($data=='amper') {
echo "<select name='amper' onChange=\"dochange('tumbon', this.value)\">\n";
echo "<option value='0'>======== เลือก ========</option>\n";
$val2=$val;
$val = substr($val,0,2);
$result=mysql_db_query($dbname,"SELECT loc_code, loc_abbr FROM location WHERE loc_code != '000000' and loc_code != '$val2' AND loc_code LIKE '$val%' AND flag_disaster IS NULL ORDER BY loc_code, loc_abbr ");
while(list($id, $name)=mysql_fetch_array($result)){
echo "<option value=\"$id\" >$name</option> \n" ;
}
} else if ($data=='tumbon') {
echo "<select name='tumbon' >\n";
echo "<option value='0'>======== เลือก ========</option>\n";
$val2=$val;
$val = substr($val,0,4);
$result=mysql_db_query($dbname,"SELECT loc_code, loc_abbr, loc_name, location_name FROM location WHERE loc_code != '000000' and loc_code != '$val2' AND loc_code LIKE '$val%' AND flag_disaster IS NULL ORDER BY loc_code, loc_abbr");
while(list($id, $name)=mysql_fetch_array($result)){
echo "<option value=\"$id\" >$name</option> \n" ;
}
}
echo "</select>\n";
?>
======================================================
ไฟล์ location.sql (เป็นตัวอย่างส่วนหนึ่ง)
CREATE TABLE `location` (
`id` int(7) NOT NULL auto_increment,
`loc_code` varchar(255) default NULL,
`loc_abbr` varchar(255) default NULL,
`loc_name` varchar(255) default NULL,
`location_name` varchar(255) default NULL,
`loc_order_name` varchar(255) default NULL,
`flag_disaster` char(1) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=8437 ;
--
-- dump ตาราง `location`
--
INSERT INTO `location` VALUES (1, '000000', 'ไม่ระบุ', '-', '-', 'รายการนี้สำหรับใช้ในการ convert ข้อมูลห้ามลบ', NULL);
INSERT INTO `location` VALUES (2, '100000', 'กรุงเทพมหานคร', 'กรุงเทพมหานคร', 'กรุงเทพมหานคร', 'กรุงเทพมหานคร', NULL);
INSERT INTO `location` VALUES (3, '100100', 'พระนคร', 'เขตพระนคร', 'เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร', NULL);
INSERT INTO `location` VALUES (4, '100101', 'พระบรมมหาราชวัง', 'แขวงพระบรมมหาราชวัง', 'แขวงพระบรมมหาราชวัง เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงพระบรมมหาราชวัง', NULL);
INSERT INTO `location` VALUES (5, '100102', 'วังบูรพาภิรมย์', 'แขวงวังบูรพาภิรมย์', 'แขวงวังบูรพาภิรมย์ เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงวังบูรพาภิรมย์', NULL);
INSERT INTO `location` VALUES (6, '100103', 'วัดราชบพิธ', 'แขวงวัดราชบพิธ', 'แขวงวัดราชบพิธ เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงวัดราชบพิธ', NULL);
INSERT INTO `location` VALUES (7, '100104', 'สำราญราษฎร์', 'แขวงสำราญราษฎร์', 'แขวงสำราญราษฎร์ เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงสำราญราษฎร์', NULL);
INSERT INTO `location` VALUES (8, '100105', 'ศาลเจ้าพ่อเสือ', 'แขวงศาลเจ้าพ่อเสือ', 'แขวงศาลเจ้าพ่อเสือ เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงศาลเจ้าพ่อเสือ', NULL);
INSERT INTO `location` VALUES (9, '100106', 'เสาชิงช้า', 'แขวงเสาชิงช้า', 'แขวงเสาชิงช้า เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงเสาชิงช้า', NULL);
INSERT INTO `location` VALUES (10, '100107', 'บวรนิเวศ', 'แขวงบวรนิเวศ', 'แขวงบวรนิเวศ เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงบวรนิเวศ', NULL);
INSERT INTO `location` VALUES (11, '100108', 'ตลาดยอด', 'แขวงตลาดยอด', 'แขวงตลาดยอด เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงตลาดยอด', NULL);
INSERT INTO `location` VALUES (12, '100109', 'ชนะสงคราม', 'แขวงชนะสงคราม', 'แขวงชนะสงคราม เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงชนะสงคราม', NULL);
INSERT INTO `location` VALUES (13, '100110', 'บ้านพานถม', 'แขวงบ้านพานถม', 'แขวงบ้านพานถม เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงบ้านพานถม', NULL);
INSERT INTO `location` VALUES (14, '100111', 'บางขุนพรหม', 'แขวงบางขุนพรหม', 'แขวงบางขุนพรหม เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงบางขุนพรหม', NULL);
INSERT INTO `location` VALUES (15, '100112', 'วัดสามพระยา', 'แขวงวัดสามพระยา', 'แขวงวัดสามพระยา เขตพระนคร กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตพระนคร แขวงวัดสามพระยา', NULL);
INSERT INTO `location` VALUES (16, '100200', 'ดุสิต', 'เขตดุสิต', 'เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต', NULL);
INSERT INTO `location` VALUES (17, '100201', 'ดุสิต', 'แขวงดุสิต', 'แขวงดุสิต เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต แขวงดุสิต', NULL);
INSERT INTO `location` VALUES (18, '100202', 'วชิรพยาบาล', 'แขวงวชิรพยาบาล', 'แขวงวชิรพยาบาล เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต แขวงวชิรพยาบาล', NULL);
INSERT INTO `location` VALUES (19, '100203', 'สวนจิตรลดา', 'แขวงสวนจิตรลดา', 'แขวงสวนจิตรลดา เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต แขวงสวนจิตรลดา', NULL);
INSERT INTO `location` VALUES (20, '100204', 'สี่แยกมหานาค', 'แขวงสี่แยกมหานาค', 'แขวงสี่แยกมหานาค เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต แขวงสี่แยกมหานาค', NULL);
INSERT INTO `location` VALUES (21, '100206', 'ถนนนครไชยศรี', 'แขวงถนนนครไชยศรี', 'แขวงถนนนครไชยศรี เขตดุสิต กรุงเทพมหานคร', 'กรุงเทพมหานคร เขตดุสิต แขวงถนนนครไชยศรี', NULL);
Thu 24 Jan 2008 15:25:17
ลองทำการใส่ print_r($_GET) ในไฟล์ locale.php ตรงไหนก็ได้ครับ แล้วดูการแสดงผลว่าถูกต้องหรือไม่ เข้าใจว่า function ใน javascript ของคุณจะทำการส่งค่ามาไม่ถูกต้องครับ และลองทำการ echo คำสั่ง sql ใส่ส่วนของ ampher ออกมาด้วยครับว่ามีการส่งคำสั่งใดเข้าไปใน mysql
Fri 25 Jan 2008 13:07:27
ตัวอย่างที่ให้มารันใน fire fox ได้ไหมคับ ผมลองแล้วมันขึ้น ERROR ว่า XMLHttpRequest not supported คับ
Fri 25 Jan 2008 14:29:13
Fri 25 Jan 2008 15:53:17
ผมว่าจะเป็นที่กำหนด field ใน table หรือเปล่าครับ เพราะเวลาเลือกอำเภอ โค้ดจะเอาจากฟิลด์ loc_abbr ซึ่งฟิลด์นี้จะเป็นข้อมูลทั้งรวมกันทั้งอำเภอและตำบล
ตัวอย่างเช่นฟิลด์นี้มีข้อมูลดังนี้ ไม่ระบุ, กรุงเทพมหานคร, พระนคร, พระบรมมหาราชวัง, วังบูรพาภิรมย์ ... วัดสามพระยา, ดุสิต, ดุสิต สังเกตุว่า พระนคร (เป็นเขต/อำเภอ), พระบรมมหาราชวัง (เป็นตำบล)... เรื่อยไป ๆ จนถึง ดุสิต(เป็นเขต/อำเภอ), ดุสิต (เป็นแขวง/ตำบล)
ตรงนี้เป็นจุดที่เป็นปัญหาหรือเปล่าครับ แต่ตรงโค้ดน่ะผมดูไม่ค่อยออกหรอกครับ เพราะมือใหม่จริง ๆ คิดไม่ออก ช่วยดูให้หน่อยครับ
Fri 25 Jan 2008 16:50:21
แต่จริงๆการออกแบบ recursive entity นั้นส่วนมากผมจะใช้แบบนี้ครับ
-----------------------------------------------------------
| id | parentid | name |
-----------------------------------------------------------
| 1 | 0 | กรุงเทพมหานคร |
-----------------------------------------------------------
| 2 | 0 | นนทบุรี |
-----------------------------------------------------------
.......
-----------------------------------------------------------
| 234 | 1 | พระนคร |
-----------------------------------------------------------
| 235 | 1 | ป้อมปราบฯ |
-----------------------------------------------------------
........
-----------------------------------------------------------
| 560 | 234 | ตำบลใดๆ |
------------------------------------------------------------
จะสามารถระบุความสัมพันธ์ของแต่ละสิ่งได้ สามารถสร้างระดับได้ไม่จำกัด เมื่อคุณต้องการจังหวัดซึ่งเป็นระดับสูงสุดจะมี parentid เป็น 0 ก็ระบุ condition parentid=0 เท่านั้น เมื่อสมมติว่ามีการเลือกจังหวัดกรุงเทพฯก็ส่ง id ของกรุงเทพฯ มา query โดยระบุ condition parentid=1 ก็จะได้รายชื่ออำเภอภายในกรุงเทพฯ สมมติว่ามีการเลือกอำเภอพระนคร ก็ส่ง id มา query โดยระบุ condition parentid=234 ก็จะได้ ตำบลในเขตพระนคร ลองเอาไปประยุกต์ดูได้ครับ
Fri 25 Jan 2008 17:57:52
ขอบคุณน้ะครับ จะพยายามลองประยุกต์ดู แต่อย่างว่ามือใหม่ งง มึน
Thu 10 Jul 2008 16:18:17
ขอถามหน่อยค่ะ
พอดีใช้โค้ดเดียวกันกับกระทู้นี้ แต่มีปัญหาตรงที่เวลา save ข้อมูลจังหวัด อำเภอ และตำบลลงฐานข้อมุลแล้ว พอเปิดหน้านี้ครั้งต่อไป จะทำยังงัยให้มันเช็คค่าว่าถ้ามีข้อมูลอยู่ให้ selected ไว้ที่ค่าของข้อมูลนั้นค่ะ
Fri 11 Jul 2008 23:19:20
ส่วนอีกวิธีก็ใช้ javascript สั่งให้เลือกค่าที่ต้องการเอาครับ
Mon 14 Jul 2008 10:10:36
นึกภาพไม่ค่อยออกเลยค่ะ คุณ webmaster
พอจะมี code ตัวอย่างหรือเปล่าค่ะ
ขอบคุณค่ะ
Mon 14 Jul 2008 10:51:46
for(....){
echo "<option value=\"".$value."\">".$name."</option>";
}
คุณก็ตรวจสอบว่ามันใช่ค่าที่ส่งมาหรือไม่อยู่ใน loop จะง่ายที่สุด

















