function emp_attendence() {
$dept = $this->session->userdata("department") ;
function filter($value)
{
$dept = "'$value'" ;
return $dept;
}
$query = $this->db->query('select emp_id from employee where department IN ('.implode( ",",array_map("filter",$dept) ) .') order by emp_id asc');
$emp = $query->result_array() ; // echo '<pre>' ; print_r($emp[0]['emp_id']) ; exit();
foreach( $emp as $emp_id) {
foreach( $emp_id as $id) {
$query = "SELECT count(attendence) as total_attendence
FROM employee
INNER JOIN attendence ON employee.emp_id = attendence.employee_id
WHERE emp_id='$id' AND MONTH(date)=MONTH(CURDATE())";
$query = $this->db->query($query);
$query = $query->result_array() ;
}
}
return $query ;
}
字符串
上面的代码是codeigniter中的一个模型,我的目标是获得数据库中每个员工的总出勤率,代码运行良好,但我通过查询返回的最后一条记录的值不是所有记录!
2条答案
按热度按时间u3r8eeie1#
实际上
$query = $query->result_array() ;
是一个变量赋值,因为它在循环中,所以它一次又一次地重复同一个变量。所以你只得到最后一个数据。像下面这样做:
在
foreach( $emp as $emp_id) {
之前定义$attendence_array = array();
将
$query = $query->result_array() ;
改为$attendence_array[] = $query->result_array() ;
然后将
return $query ;
改为return $attendence_array ;
然后检查
$attendence_array
打印出来,它来罚款或不是你想要的mutmk8jj2#
这确实需要一个完整的重构,你可以把所有的查询逻辑都放到一个查询中,而且应该这样做。
一个模型方法不应该知道它的输入来自哪里。换句话说,你不应该硬编码这个方法来从会话数组中提取
$dept
。相反,把所有的输入参数作为参数传递给这个方法,这样你的模型方法就很容易测试和重用。CodeIgniter有特殊的语法来编写
IN
与占位符的比较(直接将变量注入到$sql
字符串中并不是最佳实践)。在IN
之后,不要将占位符?
括在括号中- CI会为您做这件事。此外,CI将用适当的引号引用 Package 字符串。下面的新脚本将只访问数据库一次,并返回一个关联数组,其中emp_id值作为键,计数作为值。
字符串