私は従業員がmonth.Theテーブルの毎日がthis- PHP月次出欠表
ようなPHPコードを見えてきましたどのように多くの時間表示、毎月出席システムを作成しようとしています -
$s = $_GET['s'];
$y = date('Y');
$fdt = date('Y-m-d',strtotime($y.'-'.$s.'-'.'01'));
$ldt = date('Y-m-t',strtotime($y.'-'.$s.'-'.'01'));
$nd = date('t',strtotime($y.'-'.$s.'-'.'01'));
$stmt = $pdo->prepare("SELECT emp_id_fk, Resource_Name , ROUND(SUM(TIME_TO_SEC(TIMEDIFF(COALESCE(`end_time`,NOW()),`start_time`)))/3600,1) as Hrs, CAST(`start_time` AS DATE) as cd FROM `attendance` LEFT JOIN resource ON attendance.`emp_id_fk` = resource.`Resource_ID` WHERE CAST(`start_time` AS DATE) BETWEEN :s AND :e GROUP BY emp_id_fk, Resource_Name, CAST(`start_time` AS DATE)");
$stmt->bindParam(':s', $fdt);
$stmt->bindParam(':e', $ldt);
$stmt->execute();
$data = $stmt->fetchAll();
print_r($data);
$ret = "";
$id = array_column($data,'emp_id_fk');
$name = array_column($data,'Resource_Name');
$id = array_unique($id);
$name = array_unique($name);
for($i=0;$i<sizeof($id); $i++){
$ret.='<tr>
<td>'.$name[$i].'</td>';
for($j=0; $j<sizeof($nd); $j++){
$cd = date('Y-m-d',strtotime($y.'-'.$s.'-'.($j+1)));
$d = date('l',strtotime($y.'-'.$s.'-'.($j+1)));
if($d != 'Sunday' && $d != 'Saturday'){
for($k=0; $k<sizeof($data); $k++){
if($id[$i] == $data[$k]['emp_id_fk']){
if($cd == $data[$k]['cd']){
$ret.='<td>'.($data[$k]['Hrs']).'</td>';
}else{
$ret.='<td>0</td>';
}
}
}
}
}
$ret.='</tr>';
}
echo $ret;
イメージからわかるように、2番目のforloop($ jループ)は、その月に基づいて28,30または31回繰り返す必要がある場所で1回しか反復しません。私の予想される結果は、従業員ごとに毎週の値があるはずで、特定の日付のレコードがない場合は、0が表示されるはずです。
ありがとうございます。
、$ jの<はsizeof($ NDは)おそらく犯人はそれはsizeofが配列を期待し、しかしでは、$ ND 5行目に設定した日付にすぎません.2回実行しても驚いています。 –
64ビットバージョンのPHPを実行していることをお勧めします。そうでない場合は、実際にDateTimeオブジェクトを調べる必要があります:http://php.net/manual/en/class.datetime.php。 2038年問題:https://en.wikipedia.org/wiki/Year_2038_problem – ctwheels