mysql 쿼리문 질문이 있습니다... 늦은시간 죄송하고 감사합니다.

mysql 쿼리문 질문이 있습니다... 늦은시간 죄송하고 감사합니다.

QA

mysql 쿼리문 질문이 있습니다... 늦은시간 죄송하고 감사합니다.

본문


<?php
include_once('./_common.php');
auth_check($auth[$sub_menu], 'r');
$count = count($_POST['chk']);
for($i=0; $i<$count; $i++) {
    $gc_id = $_POST['chk'][$i];
    $sql = " SELECT gc_id, gc_use FROM {$g5['gift_card']}
             WHERE gc_id = '$gc_id'
             ";
    $rs = sql_query($sql);
    while ($row = sql_fetch_array($rs)) {
      if($gc_id != "" || $gc_id != null) {
        if($row['gc_use'] == '1'){
        $sql_u = "UPDATE {$g5['gift_card']} SET mb_id = 'admin' , gc_use = '0' where gc_id = '$gc_id' and mb_id = '' ";
        sql_query($sql_u);
        }
      }//if null체크
    }//while
  }//for
alert("처리되었습니다.");
?>

 

이렇게 form 에서 넘어오는 값들을 select하면서 update까지 하는 업데이트페이지를 만들었습니다.

 

기능은 잘 작동하지만 총 데이터 갯수와 상관없이 update를 하는 데이터의 개수가 994개만 업데이트가 됩니다..

 

혹시 왜 개수의 제한이 있는지 알수있을까요?..

 

한번 처리할때 대략 10만개 정도를 시간이 오래 걸리더라도 최대한 많은량을 한번에 update를 하고싶습니다..

 

 

이 질문에 댓글 쓰기 :

답변 5

처리 속도가 늦으면 실행 시간을 초과해 끊어질 수 있으니

소스 상단에 set_time_limit(0); 한 줄 추가해줘서 무제한으로 실행이 가능합니다.

- https://www.php.net/manual/en/function.set-time-limit.php

- http://docs.php.net/manual/kr/function.set-time-limit.php

 

다만, 건 바이 건 갱신이라 극히 비효율적이니 아래처럼 그룹지어서 처리하는 것이 낫겠습니다.

100개씩 묶었는데, MariaDB/MySQL - max_allowed_packet 설정값에 따라,

$_POST['chk']값에 따라 더 크게 잡아도 됩니다.

(해당 설정값 구해와서 적당하게 나누는 것은 생략)

<?php
include_once('./_common.php');
auth_check($auth[$sub_menu], 'r');
$count = count($_POST['chk']);
if ( !$count ) alert('지정된 값이 없습니다.');
$temp = array_unique($_POST['chk']); // 중복 제거
$temp = array_chunk($temp, 100); // 100개씩 묶기
foreach ( $temp as $t ) {
    $chks = "'".implode("','", $t)."'"; // 예) [a,b,c] → 'a','b','c'
    $query = "UPDATE {$g5['gift_card']} SET mb_id='admin', gc_use=0 WHERE gc_id IN ({$chks}) AND mb_id='' AND gc_use=1";
    sql_query($query);
}
alert('처리되었습니다.');

서버에 스택으로 쌓인 파일이 많이서 안될 수 있을듯합니다. 캐쉬를 날려버리고 다시해보세요.

1. include 다음에 넣으세요

@ini_set ("memory_limit", -1);

 

2. echo \$count; 를 for문 바로 위에 넣어서 갯수를 확인해보세요

카운트 출력값이 994라는 말인가요?
그렇다면 post로 넘어온 갯수가 994개라는 말인거죠
이 값은 서버 설정을 변경해주어야 합니다

그누설치된 root폴더에 .htaccess 화일에 내용추가
php_value max_input_vars 1500

위의 로직을 보니

 

$_POST 로 gc_id 를 체크된값만큼만 처리를 하게 되어있네요

 

로직의 처리 조건을 받아서 조건대로 update를 하시면 

select문 없이

update문 한줄로 처리가능할듯 보입니다.

저 코드로 처리할 수 있는 방법은 아직 못찾았지만, 왜 994개만 들어가는지는 알았습니다..

phpinfo에 max_input_vars 값이 1000개로 설정되어 있어서 그런걸로 확인했습니다ㅠㅠ

checkbox로 말고 다르게 하는 방법으로 연구해서 다시 답글 올려보겠습니다.

답변 달아주신분들 다들 감사드립니다

아하! 해당 설정을 잊었네요.


체크 박스 통해서 선택해서 넘기는 것이니
한 페이지에 엄청 많이 출력하나본데
체크박스는 name을 제거하고
선택된 값들만 묶어서 보내는 방법도 있습니다.

초 간단 예제)

<input type="checkbox" value="v1"> name 제거
<input type="checkbox" value="v2">
<input type="checkbox" value="v3">
:
v1,v2,... 식으로 묶어서 전송

form submit 방식이면, <form ... onsubmit="return ex_func(this)">
<input type="hidden" name="chks">
<script>
function ex_func(f) {
    f.chks.value = "선택된 체크박스 값들 구분자로 묶어서 할당";
    f.submit();
}

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

회원로그인

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