하루에 한번만 insert 채택완료
</p>
<p><?php
$conn = mysqli_connect("localhost", "**", "**", "**");
</p>
<p>
function executeQuery($conn, $sql) {
if (!mysqli_query($conn, $sql)) {
echo "에러: " . $sql . "
" . mysqli_error($conn);
exit;
}
}</p>
<p>
function insertWorkTime($conn, $zzzz, $time, $ip) {</p>
<p>
$insert_sql = "INSERT INTO very_work_time (work_id, work_name, work_group, work_intime, work_outtime, work_datetime, work_ip, work_total)
SELECT id, work_name, work_group, '$time', '', '$time', '$ip', '$zzzz'
FROM very_work_list
WHERE work_hp = '$zzzz'";</p>
<p>
executeQuery($conn, $insert_sql);
}
function updateWorkOutTime($conn, $id, $time) {
$update_sql = "UPDATE very_work_time SET work_outtime = '$time' WHERE id = '$id'";
executeQuery($conn, $update_sql);
}
$zzzz = $_GET['cccc'];
$time = date("Y-m-d H:i:s");
$today = date("Y-m-d");
$ip = $_SERVER['REMOTE_ADDR'];
$check_sql = "SELECT id, work_name, work_intime, work_outtime FROM very_work_time WHERE work_total = '$zzzz' AND DATE(work_datetime) = '$today' ORDER BY work_datetime DESC LIMIT 1";
$check_result = mysqli_query($conn, $check_sql);</p>
<p>$result = mysqli_query($conn,"SELECT work_name, aaaa, bbbb FROM very_work_list where work_hp='$zzzz' ");</p>
<p>$row = mysqli_fetch_array($result);
$data = $row[0];
$data1 = $row[1];
$data2 = $row[2];
if ($check_result && mysqli_num_rows($check_result) > 0) {
$row = mysqli_fetch_assoc($check_result);
if (empty($row['work_outtime'])) {
updateWorkOutTime($conn, $row['id'], $time);
echo $data,"6", $data2;
} else {
insertWorkTime($conn, $zzzz, $time, $ip);
echo $data,"6", $data1;</p>
<p>
}
} else {
insertWorkTime($conn, $zzzz, $time, $ip);
echo $data,"6", $data1;</p>
<p>
}
?></p>
<p>
위 소스는 잘 작동 되고 있습니다
한가지 추가 하고자 하는것은
work_hp 컬럼별로 하루에 1번만
insert 되게 하려고 합니다.
SELECT COUNT(*) 로 시도해 봤는데..
function <-- 없는 상태에서는 하루에 1번만 저장이 되는데
function 이 포함된 위 소스에서는 반복저장이 되네요
어떻게 해야 하나요?
답변 3개
</p>
<p>function insertWorkTime($conn, $zzzz, $time, $ip) {
$today = date("Y-m-d");
$check_exist_sql = "SELECT id FROM very_work_time WHERE work_hp = '$zzzz' AND DATE(work_datetime) = '$today' LIMIT 1";
// 오늘 work_hp 로 입력된 것이 있나 가져 옴
// work_datetime 입력 시간을 넣는 칼럼으로 간주
$check_exist_result = mysqli_query($conn, $check_exist_sql);</p>
<p> if (mysqli_num_rows($check_exist_result) > 0) { // 오늘 인서트가 있으면 넘어가기
return;
}</p>
<p> // 인서트 한적이 없으면 넣기
$insert_sql = "INSERT INTO very_work_time (work_id, work_name, work_group, work_intime, work_outtime, work_datetime, work_ip, work_total)
SELECT id, work_name, work_group, '$time', '', '$time', '$ip', '$zzzz'
FROM very_work_list
WHERE work_hp = '$zzzz'";</p>
<p> executeQuery($conn, $insert_sql);
}</p>
<p>
이렇게 수정 하면 될 것입니다.
테스트 해보지는 못했습니다.
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
echo 찍었을때 insert update가 몇번 실행되나요?
INSERT INTO very_work_time (work_id, work_name, work_group, work_intime, work_outtime, work_datetime, work_ip, work_total)
SELECT id, work_name, work_group, '$time', '', '$time', '$ip', '$zzzz'
FROM very_work_list
WHERE work_hp = '$zzzz'";
여기에 work_hp값이 얼마나 있는지 모르겠지만 중복된 값은 한번만 나오게 해야 하지 않을까 싶은데요
만약 위 문제 아니라면 @배르만 님이 말씀하신걸로 중복된 키값의 컬럼에 유니크 값을 적용해서 처리하셔도 되실듯 합니다.
답변에 대한 댓글 1개
hp 번호가 전송 될때마다 인서트 되는데
동일 번호가 전송되도 인서트가 되서 그렇습니다
댓글을 작성하려면 로그인이 필요합니다.
이런 유형은 프로그램 레벨에서 중복처리를 하면 동시성 처리에서 실패해 중복 처리될 가능성이 많습니다.
DB 레벨에서 Primary Key 또는 Unique Key 를 설정하고 UPSERT 형태로 구성하면
https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
설정한 Key 기반의 데이터에 대해 유일성을 보장하면서 소스도 간결해집니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인