喜悦国际村 » 代码共享 » 为国际村做点贡献!我写了个三级连动!

页: [1]
菜虫2005-2-18 02:04 AM
为国际村做点贡献!我写了个三级连动!

代码冗余挺多的,我想不到别的好办法了,请大家多提批评意见

<?php
/****************************************用javascript实现的无刷新三级连动*************************************/
//以国家,省份和城市为程序的模型,
//数据库中3张表分别为:country,province,city;
//代码中变量名称尽量接近模型涉及范畴;
//<p>说明     :一级类:国家; 二级类:省份; 三级类:城市;当然你也可以用它来表示别的内容;
//$first_id   :国家的唯一标识,其他类似;
//$first_name :国家的名称;
//$first_table:国家的表的名字;
//-----------------------------表结构-----------------------------------------------------------------------
//first_table :1.country_id; 2.country_name;(表名:country)
//second_table:1.province_id;2.country_id;  3.province_name;(表名:province)
//third_table :1.city_id;    2.province_id; 3.city_name;(表名:city)
//@Author:Davy(菜虫)
//<p>好象代码冗余太高,汗!兄弟太菜了!
//@Date  :2004/12/28
//----------------------------------------------------------------------------------------------------------

function synchronized_change($second_id,$first_id,$second_name,$second_table){
        echo "<script language=javascript>\n";            
        echo "function getIdName(sid,sname)\n";         
        echo "{\n";                                                      //这几行是利用面向对象的编程
        echo "        this.id=sid;\n";                                         //大家仔细看,在67行调用它;
        echo "        this.name=sname;\n";               
        echo "}\n";                                                      
    echo "function synchronized(frm)\n";                             //需要参数,参数为form
        echo "{\n";
        echo "        frm.province.length = 1;\n";                             //province为一个表单元素,省的下拉列表;
        echo "        if(frm.country.value != \"\")\n";                        //country为国家的下拉列表;
        echo "        {\n";
        echo "                for(i=0;i<area.length;i++)\n";                       //area为数组,见后面
    echo "                {\n";                                                //遍历国家;
        echo "                        if(frm.country.value == area[i][0])\n";          //其中每一维又是一个维数组;
        echo "                        {\n";
        echo "                                for(j=1;j<area[i].length;j++)\n";            //遍历该国家的省份
        echo "                                {\n";                                        //area[i]是一数组,存放国家id;
        echo "                                        frm.province.length++;\n";               //area[1][0]中国1;area[1][0]美国2;
        echo "                                        frm.province[j].value = area[i][j].id;\n";//province的value和text;  
        echo "                                        frm.province[j].text  = area[i][j].name;\n";//获得与该国家对应的省份的id和名称;
        echo "                                }\n";
        echo "                                break;\n";
        echo "                        }\n";
        echo "                }\n";
        echo "        }\n";
        echo "}\n";

        $select_province = "SELECT ".$second_id.",".$first_id.",".$second_name. " FROM ".$second_table
        ." ORDER BY "." ".$first_id.",".$second_name." ";              //搜索省份,二级类;
        mysql_connect("localhost","root","") or die(mysql_error("无法连接数据库,请与管理员联系"));
        mysql_select_db("davy");
        $result_set         = mysql_query($select_province);
        $number_province    = mysql_num_rows($result_set);
        $count_province     = 0;                                        //省计数器
        $count_country      = -1;                                       //国家计数器
        $current_country_id = -1;                                       //当前国家的id
        $synchronized_str   = "var area = new Array();\n";              
        for($i = 0;$i < $number_province;$i++){
                 $record_set    = mysql_fetch_array($result_set);
                 if($current_country_id != $record_set[1]){                //获得国家的id
                        $current_country_id = $record_set[1];                  //只有下一条记录与该记录不是同一个国家时
                        $count_country  ++;                                    //才让$count_province = 0;
                        $count_province = 0;
                        $synchronized_str .= "area[$count_country] = new Array();\n area[$count_country][0] =".$record_set[1].";\n ";                              //area[i][0]存放国家                              
                }
                $count_province ++;                                          
                $synchronized_str     .= "area[$count_country][$count_province] = new getIdName(".$record_set[0].",\"".$record_set[2]."\");\n";  //获得与该国家对应的城市的id,name
        }                                                              //调用getIdName方法,this关键字指area[i][j];
        echo $synchronized_str;
        echo "</script>\n";
}

function synchronized_country_provice($first_table,$first_id,$first_name,$default_first_id,$second_table,$second_id,
$second_name,$default_second_id,$third_id,$third_name,$third_table){
        echo "
                <select name='country' onchange='JavaScript: synchronized(this.form);'>//调用javascript方法;
                <option value=''>--请选择--</option>                                   //下面就不用说了,呵呵.......
                ";
        mysql_connect("localhost","root","") or die(mysql_error("无法连接数据库,请与管理员联系"));
        mysql_select_db("davy");
        $country_query  = "SELECT * FROM ".$first_table." ORDER BY ".$first_id;
        $result_set     = mysql_query($country_query);
        $number_country = mysql_num_rows($result_set);
        if($number_country > 0){
                while($record_set = mysql_fetch_array($result_set)){
                        echo "<option value=".$record_set[$first_id]."  ";
                        if($record_set[$first_id] == $default_first_id){
                                echo "  selected  ";
                        }
                        echo "  >  ".$record_set[$first_name]."</option>\n";
                }
        }
        echo "
                </select>


                <select name='province' onchange='JavaScript: synchronized2(this.form);'>
                <option value=''>--请选择--</option>
        ";
        if ($default_first_id!='' && $default_second_id!=''){
            $Sql="select * from ".$second_table." where ".$first_id."=".$default_first_id;   
        $result_set     = mysql_query($Sql);
            $number_default = mysql_num_rows($result_set);   
        if ($number_default > 0){
                        while ( $record_set =mysql_fetch_array( $result_set) ) {
                                echo "<option value=".$record_set[$second_id]." ";
                if ($record_set[$second_id] == $default_second_id) {
                            echo " selected  ";
                            }
                         echo "  > ".$record_set[$second_name]."</option>\n";               
           }
        }
        }         
        echo "
            </select>
                ";
       
        echo "<script language=javascript>\n";            
        echo "function getIdName2(sid,sname)\n";         
        echo "{\n";
        echo "        this.id=sid;\n";
        echo "        this.name=sname;\n";
        echo "}\n";                                                      //暂时先写在这里,估计还不够用,要修改的;
    echo "function synchronized2(frm)\n";
        echo "{\n";
        echo "        frm.city.length = 1;\n";
        echo "        if(frm.province.value != \"\")\n";
        echo "        {\n";
        echo "                for(i=0;i<area2.length;i++)\n";
    echo "                {\n";                                                //遍历国家;
        echo "                        if(frm.province.value == area2[i][0])\n";          //其中每一维又是一个二维数组;
        echo "                        {\n";
        echo "                                for(j=1;j<area2[i].length;j++)\n";            //遍历该国家的省份
        echo "                                {\n";
        echo "                                        frm.city.length++;\n";
        echo "                                        frm.city[j].value = area2[i][j].id;\n";  
        echo "                                        frm.city[j].text  = area2[i][j].name;\n";//获得与国家对应的省份的id和名称;
        echo "                                }\n";
        echo "                                break;\n";
        echo "                        }\n";
        echo "                }\n";
        echo "        }\n";
        echo "}\n";
        $select_city = "SELECT ".$third_id.",".$second_id.",".$third_name. " FROM ".$third_table
        ." ORDER BY "." ".$second_id.",".$third_name." ";
        mysql_connect("localhost","root","") or die(mysql_error("无法连接数据库,请与管理员联系"));
        mysql_select_db("davy");
        $result_set          = mysql_query($select_city);
        $number_city         = mysql_num_rows($result_set);
        $count_city          = 0;                            //省计数器
        $count_province      = -1;                           //国家计数器
        $current_province_id = -1;                           //当前国家的id
        $synchronized_str   = "var area2 = new Array();\n";
        for($i = 0;$i < $number_city;$i++){
                 $record_set    = mysql_fetch_array($result_set);
                 if($current_province_id != $record_set[1]){
                        $current_province_id = $record_set[1];
                        $count_province  ++;
                        $count_city = 0;
                        $synchronized_str .= "area2[$count_province] = new Array();\n area2[$count_province][0] =".$record_set[1].";\n ";
                }
                $count_city ++;
                $synchronized_str     .= "area2[$count_province][$count_city] = new getIdName2(".$record_set[0].",\"".$record_set[2]."\");\n";
        }
        echo $synchronized_str;
        echo "</script>\n";
    echo "
            <select name='city' id='city' onchange=''>
                <option value=''>--请选择--</option>         
                 ";
}
?>
<form>
<?//调用如下,只要传入数据库字段和表名称就可以实现了,大家要注意3张表的结构啊!
synchronized_country_provice("country","country_id","country_name","","province","province_id","province_name","",
"city_id","city_name","city");
synchronized_change("province_id","country_id","province_name","province");
?>
</form>

lts982005-2-18 02:12 AM
不错!
代码部分就好用[php]****[/php]
可读性会更好一点。

瘦死的骆驼2005-2-22 09:04 AM
嗷嗷好用阿

不过有一个问题  当在数据库里添加了一条记录的时候    在前台显示不出来  刷新也不好用

只有清空本地缓存以后才能看得到  哪位高手说一下这是什么原因呢?

heimayi2005-2-22 09:23 AM
自己服务器的问题.

瘦死的骆驼2005-2-22 09:36 AM
这么确定?


查看完整版本: 为国际村做点贡献!我写了个三级连动!


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.012184 second(s), 2 queries