mysql 쿼리문 질문이 있습니다... 늦은시간 죄송하고 감사합니다. 채택완료
</p>
<p><?php
include_once('./_common.php');</p>
<p>auth_check($auth[$sub_menu], 'r');</p>
<p>$count = count($_POST['chk']);</p>
<p>for($i=0; $i<$count; $i++) {
$gc_id = $_POST['chk'][$i];</p>
<p> $sql = " SELECT gc_id, gc_use FROM {$g5['gift_card']}
WHERE gc_id = '$gc_id'
";
$rs = sql_query($sql);</p>
<p> while ($row = sql_fetch_array($rs)) {</p>
<p> 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</p>
<p>alert("처리되었습니다.");
?></p>
<p>
이렇게 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('처리되었습니다.');
댓글을 작성하려면 로그인이 필요합니다.
저 코드로 처리할 수 있는 방법은 아직 못찾았지만, 왜 994개만 들어가는지는 알았습니다..
phpinfo에 max_input_vars 값이 1000개로 설정되어 있어서 그런걸로 확인했습니다ㅠㅠ
checkbox로 말고 다르게 하는 방법으로 연구해서 다시 답글 올려보겠습니다.
답변 달아주신분들 다들 감사드립니다
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
위의 로직을 보니
$_POST 로 gc_id 를 체크된값만큼만 처리를 하게 되어있네요
로직의 처리 조건을 받아서 조건대로 update를 하시면
select문 없이
update문 한줄로 처리가능할듯 보입니다.
댓글을 작성하려면 로그인이 필요합니다.
1. include 다음에 넣으세요
@ini_set ("memory_limit", -1);
2. echo \$count; 를 for문 바로 위에 넣어서 갯수를 확인해보세요
답변에 대한 댓글 4개
그렇다면 post로 넘어온 갯수가 994개라는 말인거죠
이 값은 서버 설정을 변경해주어야 합니다
그누설치된 root폴더에 .htaccess 화일에 내용추가
php_value max_input_vars 1500
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
체크 박스 통해서 선택해서 넘기는 것이니
한 페이지에 엄청 많이 출력하나본데
체크박스는 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();
}