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문 바로 위에 넣어서 갯수를 확인해보세요
위의 로직을 보니
$_POST 로 gc_id 를 체크된값만큼만 처리를 하게 되어있네요
로직의 처리 조건을 받아서 조건대로 update를 하시면
select문 없이
update문 한줄로 처리가능할듯 보입니다.
저 코드로 처리할 수 있는 방법은 아직 못찾았지만, 왜 994개만 들어가는지는 알았습니다..
phpinfo에 max_input_vars 값이 1000개로 설정되어 있어서 그런걸로 확인했습니다ㅠㅠ
checkbox로 말고 다르게 하는 방법으로 연구해서 다시 답글 올려보겠습니다.
답변 달아주신분들 다들 감사드립니다