CSVファイルを取得し、クエリと条件を使用してPHPファイルにインポートし、そのコンテンツをカウントするこのクエリがあります。私は3つのテーブルを持っています
- 生体認証 (id_biometrics、empno、date_created、time_created、status、device)
- user_dummy (id_user、leave_credits、empno)
- 出席 (id_attendance、fk_user、date_created、time_created、time_in、time_out、total_hours、actual_ot、actual_ut)
そして、私のExcelファイルにはempno、date_created、time_created、status、deviceがあります
私が望むのは、出席テーブルに重複のない無視データを挿入し、その time_in、time_out、total_hours、actual_ot、actual_ut を計算することです。user_dummy.id_user=attendance.fk_user という条件があります。自動インクリメント、fk_user、date_created、time_created、time_in( time_created status=0 )、time_out( time_created status=1 )、total_hours(time_in+time_out)、actual_ot(9 時間以上の超過時間)、actual_utである id_attendance の入力にまだ取り組んでいます。 (9時間未満の場合は残業)
これは私が使用するコードです:
<?php
//include "connect.php";//header('Content-type: application/json');$link=mysql_connect("localhost","root","") or die("Cannot Connect to the database!");`
mysql_select_db("hris",$link) or die ("Cannot select the database!");
// Set your CSV feed
$feed = 'SampleLogs.csv';
//$uploadid = 2;
// Arrays we'll use later
$keys = array();
$newArray = array();
// Function to convert CSV into associative array
function csvToArray($file, $delimiter) {
if (($handle = fopen($file, 'r')) !== FALSE) {
$i = 0;
while (($lineArray = fgetcsv($handle, 0, $delimiter, '"')) !== FALSE) {
for ($j = 0; $j < count($lineArray); $j++) {
$arr[$i][$j] = $lineArray[$j];
}
$i++;
}
fclose($handle);
}
return $arr;
}
// Do it
$data = csvToArray($feed, ',');
// Set number of elements (minus 1 because we shift off the first row)
$count = count($data);
//Use first row for names
$labels = array('empno','date_created','time_created','status','device');
foreach ($labels as $label) {
$keys[] = trim($label);
}
// Bring it all together
for ($j = 0; $j < $count; $j++) {
$d = array_combine($keys, $data[$j]);
$newArray[$j] = array_map('trim',$d);
}
//count number of rows in database
$q = "SELECT * FROM attendance";
$res = mysql_query($q);
$numrows = mysql_num_rows($res);
$slicearray = array_slice($newArray,$numrows);
echo $numrows;
var_dump($slicearray);
//$reverse = array_reverse($newArray,true);
//var_dump($reverse);
//$uniqueid = uniqid();
foreach($slicearray as $key=>$value){
$implodearray = "'" . implode($value, "','") . "'";
$keysString = implode(",", array_keys($value));
$keylower = strtolower(str_replace(str_split(" '-/"),'_',$keysString));
$sql = "INSERT INTO biometrics ($keylower)
SELECT * FROM (SELECT '".$value['empno']."','".$value['date_created']."','".$value['time_created']."','".$value['status']."' as status,'".$value['device']."' as device) As tmp
WHERE NOT EXISTS (SELECT $keylower FROM biometrics WHERE empno = '".$value['empno']."' AND date_created = '".$value['date_created']."' AND time_created = '".$value['time_created']."' AND status = '".$value['status']."' AND device = '".$value['device']."')";
mysql_query($sql) or die(mysql_error());
$sql1= "INSERT IGNORE INTO attendance(fk_user,date_created,time_in,time_out,total_hours)
SELECT user_dummy.id_user,'".$value['date_created']."',t2.time_in,t2.time_out,'null'
FROM
(SELECT empno,date_created,
MIN(CASE WHEN status = 0 THEN time_created else '0' END) AS time_in,
MAX(CASE WHEN status = 1 THEN time_created else '0' END) AS time_out
FROM biometrics
GROUP BY empno,date_created
)AS t2
left join user_dummy on t2.empno= user_dummy.empno
where user_dummy.id_user IS NOT NULL AND '".$value['empno']."' = user_dummy.empno
";
mysql_query($sql1) or die(mysql_error());
echo $sql;
//var_dump($keylower);
//var_dump($value);
}
?>
動作していますが、2 回または 4 回ループする未知の問題が発生します。何が起こったのかわかりません。誰かがこれで私を助けてくれますか? 学校での私のプロジェクトのためです。
Load infile を使用してみましたが、Load infile に条件を設定できないと思います