พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com | บล็อกอาหาร
PHP development / listbox ดึงข้อมูล
twin
twin
Thu 24 Jan 2008 08:46:54

ขอทดสอบตั้งกระทู้น้ะครับ เพราะทำเข้าต้อง 2-3 ครั้งก็ไม่ได้  ขึ้นว่า some error occure. Your message can not be save, please try again.

twin
twin
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);

webmaster
webmaster
Thu 24 Jan 2008 15:25:17
ต้องขออภัยด้วยครับ ที่ต้องตั้ง filter ไว้เนื่องจากมีหลายท่านที่ไม่รู้จักมารยาท และช่วงนี้ไม่มีเวลามานั่งลบครับ

ลองทำการใส่ print_r($_GET) ในไฟล์ locale.php ตรงไหนก็ได้ครับ แล้วดูการแสดงผลว่าถูกต้องหรือไม่ เข้าใจว่า function ใน javascript ของคุณจะทำการส่งค่ามาไม่ถูกต้องครับ และลองทำการ echo คำสั่ง sql ใส่ส่วนของ ampher ออกมาด้วยครับว่ามีการส่งคำสั่งใดเข้าไปใน mysql
หนุ่ย
หนุ่ย
Fri 25 Jan 2008 13:07:27

ตัวอย่างที่ให้มารันใน fire fox ได้ไหมคับ ผมลองแล้วมันขึ้น ERROR ว่า XMLHttpRequest not supported คับ

webmaster
webmaster
Fri 25 Jan 2008 14:29:13
น่าจะได้นะครับ แต่โค๊ดข้างต้นนี้น่าจะมีปัญหาอยู่ครับ
twin
twin
Fri 25 Jan 2008 15:53:17

ผมว่าจะเป็นที่กำหนด field ใน table หรือเปล่าครับ เพราะเวลาเลือกอำเภอ โค้ดจะเอาจากฟิลด์ loc_abbr ซึ่งฟิลด์นี้จะเป็นข้อมูลทั้งรวมกันทั้งอำเภอและตำบล

ตัวอย่างเช่นฟิลด์นี้มีข้อมูลดังนี้    ไม่ระบุ, กรุงเทพมหานคร, พระนคร, พระบรมมหาราชวัง, วังบูรพาภิรมย์ ... วัดสามพระยา, ดุสิต, ดุสิต       สังเกตุว่า พระนคร (เป็นเขต/อำเภอ), พระบรมมหาราชวัง (เป็นตำบล)... เรื่อยไป ๆ จนถึง ดุสิต(เป็นเขต/อำเภอ), ดุสิต (เป็นแขวง/ตำบล)

ตรงนี้เป็นจุดที่เป็นปัญหาหรือเปล่าครับ แต่ตรงโค้ดน่ะผมดูไม่ค่อยออกหรอกครับ เพราะมือใหม่จริง ๆ คิดไม่ออก  ช่วยดูให้หน่อยครับ

webmaster
webmaster
Fri 25 Jan 2008 16:50:21
ถ้าอย่างนั้นคงต้องมี field ระบุคุณสมบัติของ record ด้วยครับ เช่นผมใช้เลขแทนระดับ เช่นถ้า record ชื่อจังหวัดผมใช้ 1 ชื่ออำเภอผมใช้ 2 ตำบลผมใช้ 3 ดังนั้นเวลาผมต้องการเฉพาะจังหวัดผมก็ใช้ 1 ในการระบุ condition

แต่จริงๆการออกแบบ 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 ก็จะได้ ตำบลในเขตพระนคร ลองเอาไปประยุกต์ดูได้ครับ
twin
twin
Fri 25 Jan 2008 17:57:52

ขอบคุณน้ะครับ จะพยายามลองประยุกต์ดู แต่อย่างว่ามือใหม่ งง มึน

ja
ja
Thu 10 Jul 2008 16:18:17

ขอถามหน่อยค่ะ
พอดีใช้โค้ดเดียวกันกับกระทู้นี้ แต่มีปัญหาตรงที่เวลา save ข้อมูลจังหวัด อำเภอ และตำบลลงฐานข้อมุลแล้ว พอเปิดหน้านี้ครั้งต่อไป จะทำยังงัยให้มันเช็คค่าว่าถ้ามีข้อมูลอยู่ให้ selected ไว้ที่ค่าของข้อมูลนั้นค่ะ

webmaster
webmaster
Fri 11 Jul 2008 23:19:20
ก็ต้องไปเช็คตอนที่ add option ของแต่ละ select ว่าเป็นค่าที่เลือกมาหรือไม่แล้วก็เพิ่ม selected เข้าไป ซึ่งก็ต้องทำตั้งแต่ create html code ที่ server-side script
ส่วนอีกวิธีก็ใช้ javascript สั่งให้เลือกค่าที่ต้องการเอาครับ
ja
ja
Mon 14 Jul 2008 10:10:36

นึกภาพไม่ค่อยออกเลยค่ะ คุณ webmaster
พอจะมี code ตัวอย่างหรือเปล่าค่ะ
ขอบคุณค่ะ

webmaster
webmaster
Mon 14 Jul 2008 10:51:46
โดยมากถ้าจะใช้คุณต้อง loop ในการสร้าง option เช่น
for(....){
    echo "<option value=\"".$value."\">".$name."</option>";
}

คุณก็ตรวจสอบว่ามันใช่ค่าที่ส่งมาหรือไม่อยู่ใน loop จะง่ายที่สุด
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login