记录政法委办公系统代码改动:
我们通常会实现这样一种功能:比如说在政法委办公系统中,有显示出车统计的出车记录列表,这个无可厚非,无非是从数据库中提取出相关的数据在页面上进行显示即可(有时为了信息显示更全,在查询语句中会用到多表连接查询),当记录数很多的时候提供“检索”功能就显得很必要了,这里我们要说的是一种方式,实现数据记录的显示和搜索功能,走的是同一个函数,只是根据传递的查询参数的有无来显示出不同的东西。
弹出搜素框的部分代码:../car/templates/cn/js/driverecords.js
$("#search_dialog").dialog({ bgiframe: true, draggable: false, resizable: false, width: 400, autoOpen: false, modal: true, title: "车辆查询参数", mtype:'GET', buttons: { "确定": function() { var sql = "car_no=" + $("#car_no").val(); //sql += "&dr_name=" + $("#dr_name").val(); sql += "&cb_destination=" + $("#cb_destination").val(); //sql += "&driverecords_status=" + $("#driverecords_status").val(); $("#driverecordslist").jqGrid('setGridParam', { //url: 'getrecords.php?search=true&' + sql url: 'getdriverecords.php?search=true&' + sql }); $("#driverecordslist").jqGrid().trigger('reloadGrid'); $(this).dialog('close'); }, "取消": function() { $(this).dialog('close'); } } });
这里最重要的是要把查询的参数通过jquery获取,并传递到处理页面,这里代表的参数为“车牌号”和“目的地”,相应的效果是:
在 ../car/getdriverecords.php中接收传来的参数,并将若干个参数传入到数据库查询函数中进行处理,在下面的代码中可以看到该函数中有很多参数,包括搜索时需要传递过来的参数,这里即使参数没有值也不影响我们查询,只要它有值就会作为我们的一个条件,让我们继续向下看:
//Get the search parameters $car_no = !isset($_GET['car_no']) ? "":$_GET['car_no']; $car_catalog = !isset($_GET['car_catalog']) ? "":$_GET['car_catalog']; $car_capacity = !isset($_GET['car_capacity']) ? "":$_GET['car_capacity']; $car_status = !isset($_GET['car_status']) ? "":$_GET['car_status']; /****************************/ $dr_name = !isset($_GET['dr_name'])?"":$_GET['dr_name']; $cb_destination = !isset($_GET['cb_destination'])?"":$_GET['cb_destination']; /****************************/ $res_p->page = 1; $res_p->total = 1; $lists = CarController::QueryDriveRecords($sidx,$sord,$car_no,$dr_name,$cb_destination); # 在函数中增加多个选项 //print_r($lists); $count = sizeof($lists);
在 ../car/controllers/cardal.php中真正实现查询功能:
function GetDriveRecords($order,$ordered,$car_no,$dr_name,$cb_destination) { $select_sql=" SELECT carbook.cb_destination AS CB_DESTINATION, carbook.cb_startTime AS CB_STARTTIME, carbook.cb_endTime AS CB_ENDTIME, carbook.dr_id AS DR_ID, carbook.cb_selfdriver AS CB_SELFDRIVER, car.car_no AS CAR_NO, dr_name AS DR_NAME FROM (carbook,car) INNER JOIN driver ON(driver.dr_id=carbook.dr_id) WHERE carbook.car_id = car.car_id and carbook.cb_status = '1'"; //echo $select_sql ; if($order != "" && $ordered != "") #是否需要排序 $orderby_sql = " ORDER BY $order $ordered "; else $orderby_sql = " "; /***************************************************/ $query_sqls = array(); # 构造出的查询数组 if($car_no != "") # 增加对车牌号的查询条件 $query_sqls[] = "car.car_no LIKE '%$car_no%' "; if($cb_destination != "") # 增加对目的地的查询条件 $query_sqls[] = "carbook.cb_destination LIKE '%$cb_destination%'"; $query_sql = ""; if(sizeof($query_sqls) > 0) $query_sql = trim(implode(" AND ",$query_sqls)); # 如果该查询数组中有多个条件,则用AND将它们拆分开组合在一起 //echo $query_sql ; if($query_sql != ""){ $sql = "$select_sql and $query_sql $orderby_sql "; }else{ $sql = "$select_sql $orderby_sql "; } # 增加对限定条件的修改 /******************************************************/ $result = ExecuteQuery($sql); return $result; }
这样就可以了,因为如果你们有使用搜索的话,它执行的就是最基本的查询语句,不会加上我们的限定语句,显示出的就是数据列表,而当我们点击搜索确定后由于接收到了参数,所以在查询数组中会有多个限定查询,最后将它们拼接在一起就组成了我们最终的搜索限定语句,那么它显示的结果就是我们查询所要得到的结果了,是不是很巧妙啊。
下面我们来输出一下,当使用搜索和不使用搜索时构造成的查询语句有什么不同:(firbug查看)
可以看到最后的限定条件只有:
WHERE carbook.car_id = car.car_id and carbook.cb_status = '1' ORDER BY cb_starttime desc
使用搜索拼成的查询语句:
它的限定条件为:
WHERE carbook.car_id = car.car_id and carbook.cb_status = '1' and car.car_no LIKE '%李强%' AND carbook
.cb_destination LIKE '%天安门广场%' ORDER BY cb_starttime desc
可以看到相比之前的多了司机和目的地查询条件的限定,因此得到的结果就是我们查询的结果喽。
That's all ....