本文讲解如何通过ajax查询mysql数据,并将返回的数据显示在待选列表中,再通过选择最终将选项加入到已选区,可以用在许多后台管理系统中。本文列表框的操作依赖jquery插件。
HTML
1
2
3
4
5
6
7
8
9
|
< form id = "sel_form" action = "post.php" method = "post" >
< p >< input type = "text" name = "keys" id = "keys" value = "输入姓名或手机号码" onclick = "this.value=''" />
< input type = "button" id = "searchOption" value = "搜索" /> < span id = "msg_ser" ></ span ></ p >
< div id = "sel" >
< select name = "liOption[]" id = 'liOption' multiple = 'multiple' size = '8' >
</ select >
</ div >
< input type = "submit" value = "提 交" />
</ form >
|
说明,HTML内容是一个表单,里面放置有一个查询输入框,和一个列表框,以及相关按钮。
MYSQL数据表结构
1
2
3
4
5
6
|
CREATE TABLE IF NOT EXISTS `t_mult` (
`id` int (11) NOT NULL auto_increment,
`username` varchar (32) NOT NULL ,
`phone` varchar (20) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
表t_mult是一张联系人资料表,包括姓名和手机号码字段。
CSS
1
|
< link rel = "stylesheet" type = "text/css" href = "jquery.multiselect2side.css" />
|
本例中只加载了Multiselect插件所需的样式文件,其他CSS大家可以自行设计。
JAVASCRIPT
首先需要引用本例所需的两个js文件。
1
2
3
|
<script type= "text/javascript" src= "js/jquery.js" ></script>
<script type= "text/javascript" src= "js/jquery.multiselect2side.js" ></script>
<link rel= "stylesheet" type= "text/css" href= "jquery.multiselect2side.css" />
|
接着我们来调用Multiselect插件。
1
2
3
4
5
6
|
$( "#liOption" ).multiselect2side({
selectedPosition: 'right' ,
moveOptions: false,
labelsx: '待选区' ,
labeldx: '已选区'
});
|
然后我们来写搜索按钮进行Ajax查询数据的操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
$( "#searchOption" ).click(function(){
var keys=$( "#keys" ).val();
$.ajax({
type: "POST" ,
url: "action.php" ,
data: "title=" +keys,
success: function(msg){
if (msg== 1 ){
$( "#msg_ser" ).show().html( "没有记录!" );
} else {
$( "#liOptionms2side__sx" ).html(msg);
$( "#msg_ser" ).html( "" );
}
}
});
$( "#msg_ser" ).ajaxSend(function(event, request, settings){
$( this ).html( "" );
});
});
|
说明,当点击搜索按钮时,进行的是Ajax异步操作,JAVASCRIPT将获取的搜索框的输入值,以POST方式传递给后台程序action.php处理,处理后,返回不同的结果给JAVASCRIPT,如果返回1,HTML页面会提示“没有记录”,反之,则将结果输出给左边列表框(待选区):liOptionms2side__sx。注意关键的地方到了,为什么列表框不是XHTML离的liOption,而变成了liOptionms2side__sx了呢?这个要从Multiselect插件说起,Multiselect插件其实就是将一个列表框装换成左右两个列表框,已供相关操作,通过查看其插件代码不难发现,左边的列表框名为:liOptionms2side__sx,右边列表框(已选区)名为:liOptionms2side__dx,后面会用到。
首先来看action.php的处理。
第一步是连接数据库。
1
2
3
|
$conn =mysql_connect( "localhost" , "root" , "" );
mysql_select_db( "demo" , $conn );
mysql_query( "SET names UTF8" );
|
第二步读取数据,并输出。通过检测搜索框传来的值,构造不同的SQL语句,并将数据返回输出,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$keys =trim( $_POST [ 'title' ]);
$keys =mysql_real_escape_string( $keys , $conn );
if (!empty( $keys )){
$sql = "select * from t_mult where username like '%$keys%' or phone='$keys'" ;
} else {
$sql = "select * from t_mult" ;
}
$query =mysql_query( $sql );
$count =mysql_num_rows( $query );
if ( $count >0){
while ( $row =mysql_fetch_array( $query )){
$str .= "<option value='" . $row ['id ']."' >". $row [ 'username' ]. "-" . $row [ 'phone' ]. "</option>" ;
}
echo $str ;
} else {
echo "1" ;
}
|
最后还有一个提交操作,后台post.php程序来获取最终提交的项的值。
1
2
3
4
5
6
7
|
$selID = $_POST [ 'liOptionms2side__dx' ];
if (! empty ( $selID )){
$str =implode( "," , $selID );
echo $str ;
} else {
echo "没有选择任何项目!" ;
}
|
注意,我们获取的是右边列表框liOptionms2side__dx的值,而不是liOption的值。
一个查询、操作的例子实现了,但是还有一点点瑕疵,在待选区往已选区添加项目时,如何判断控制已经添加过的项目不能重复添加,这个就留给大家思考吧,试一试有什么好的解决方式。