테스트 사이트 - 개발 중인 베타 버전입니다

하루에 한번만 insert 채택완료

은빛여전사 7개월 전 조회 2,142

</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개

채택된 답변
+20 포인트
7개월 전

 </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개

은빛여전사
7개월 전
감사합니다... 잘 되네요..

댓글을 작성하려면 로그인이 필요합니다.

플라이
7개월 전

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개

은빛여전사
7개월 전
한번에 여러번 인서트 되진 않습니다.
hp 번호가 전송 될때마다 인서트 되는데
동일 번호가 전송되도 인서트가 되서 그렇습니다

댓글을 작성하려면 로그인이 필요합니다.

7개월 전

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

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

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인