3 回答
TA贡献1777条经验 获得超10个赞
这是您的问题:您正在表中创建不存在的行。对于不在表中的那一天,您正在创建一个行来指示表中没有一行。
这使得这个问题在您采用的方法中有点棘手。您可以构建一个复杂的 MYSQL 查询来处理这个问题,也可以在 PHP 中处理它。
更好的方法是通过所有用户和每一天。
// List of all users to find
$users = ['11007', '20003'];
foreach ($daterange as $date) {
// Get date in database format
$dateNumber = $date->format("Y-m-d"); // counter date + 1 day
// Go through all users
foreach ($users as $user) {
// Find all accesses for that user and day
$query = $this->db->query("SELECT * FROM tblprocesstimekeeping WHERE companyAccessID = '$companyAccessID' AND empCompID = '$user' AND date = '$dateNumber'");
// If there is a row, then paste it, otherwise past NO DATA
if ($query->num_rows()) {
echo $dateNumber.' = '.$user->id.' = GOOD <br>';
} else {
echo $dateNumber.' = '.$user->id.' = NO DATA <br>';
}
}
}
TA贡献1872条经验 获得超3个赞
你的算法不正确。由于您没有按日期过滤表数据,因此对于日期范围内的每个日期,您都选择了 tblprocesstimekeeping 表中的所有行,并打印所有行的结果(这就是每个日期有 21 行的原因)。
我不熟悉 php,所以我不会在这里发布代码,但这里是我的猜测:
首先,您需要知道员工的 id 您可以使用以下查询从数据库中获取它们:
“select distinct empCompId from FROM tblprocesstimekeeping where companyAccessID = '$companyAccessID'"
并将它们保存在某个地方(也许在一个数组中)
然后,要完成您想要的操作,您需要执行两次循环
// first iterate by date
foreach($daterange as $date)
// then, for each date iterate by employee
foreach($employees as $empId){
// check existance on record
If (exists on data base)
Echo ‘good’
else
echo ‘nodata’
对于“检查数据库中的存在”,您可以简单地更改查询以按日期和
$query = $this->db->query("SELECT * FROM tblprocesstimekeeping where companyAccessID = '$companyAccessID' and date='$dateNumber'
");
但你应该考虑到这一点:
您对数据库的连续调用次数与日期范围内的日期一样多。
如果可能,请考虑一种算法,该算法仅对 datadate进行一次调用并返回从日期范围开始到结束的所有数据(在 for foreach $daterange cicle 之前)并且您可以简单地过滤该数据以检查是否存在代码上的特定日期。
如果所涉及的记录数量不是那么高(这里只有 21 个),则此解决方案的性能会好得多
- 3 回答
- 0 关注
- 153 浏览
添加回答
举报