页:
[1]
|
为国际村做点贡献!我写了个三级连动!
代码冗余挺多的,我想不到别的好办法了,请大家多提批评意见
<?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> |
|
不错!
代码部分就好用[php]****[/php]
可读性会更好一点。 |
|
嗷嗷好用阿
不过有一个问题 当在数据库里添加了一条记录的时候 在前台显示不出来 刷新也不好用
只有清空本地缓存以后才能看得到 哪位高手说一下这是什么原因呢? |
| heimayi | 2005-2-22 09:23 AM |
|
| 自己服务器的问题. |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.012184 second(s), 2 queries |