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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
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();
}

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

회원로그인

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