하루에 한번만 insert

하루에 한번만 insert

QA

하루에 한번만 insert

본문


<?php
$conn = mysqli_connect("localhost", "**", "**", "**");
 

function executeQuery($conn, $sql) {
    if (!mysqli_query($conn, $sql)) {
        echo "에러: " . $sql . "<br>" . mysqli_error($conn);
        exit;
    }
}
    
function insertWorkTime($conn, $zzzz, $time, $ip) {

    $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'";

    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);
$result = mysqli_query($conn,"SELECT work_name, aaaa, bbbb FROM very_work_list where work_hp='$zzzz' ");
$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;

    }
} else {
    insertWorkTime($conn, $zzzz, $time, $ip);
    echo $data,"6", $data1;

}
?>

 

위 소스는 잘 작동 되고 있습니다

한가지 추가 하고자 하는것은

work_hp 컬럼별로 하루에 1번만

insert 되게 하려고 합니다.

 

SELECT COUNT(*) 로 시도해 봤는데..

function <-- 없는 상태에서는 하루에 1번만 저장이 되는데

function 이 포함된 위 소스에서는 반복저장이 되네요

 

어떻게 해야 하나요?

이 질문에 댓글 쓰기 :

답변 3


 
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);
    if (mysqli_num_rows($check_exist_result) > 0) { // 오늘 인서트가 있으면 넘어가기
        return; 
    }
    // 인서트 한적이 없으면 넣기
    $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'";
    executeQuery($conn, $insert_sql);
}

 

이렇게 수정 하면 될 것입니다.
테스트 해보지는 못했습니다.

이런 유형은 프로그램 레벨에서 중복처리를 하면 동시성 처리에서 실패해 중복 처리될 가능성이 많습니다.
DB 레벨에서 Primary Key 또는 Unique Key 를 설정하고 UPSERT 형태로 구성하면

https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
설정한 Key 기반의 데이터에 대해 유일성을 보장하면서 소스도 간결해집니다.

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값이 얼마나 있는지 모르겠지만 중복된 값은 한번만 나오게 해야 하지 않을까 싶은데요

 

만약 위 문제 아니라면  님이 말씀하신걸로  중복된 키값의 컬럼에 유니크 값을 적용해서 처리하셔도 되실듯 합니다.

 

답변을 작성하시기 전에 로그인 해주세요.
전체 46
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT