update 문 질문입니다. 도저히 이해가 안되서 ㅠ

update 문 질문입니다. 도저히 이해가 안되서 ㅠ

QA

update 문 질문입니다. 도저히 이해가 안되서 ㅠ

본문


<?
include_once('./_common.php');
set_time_limit(0);
error_reporting(E_ALL);
ini_set('display_errors', 1);
$tree_data = 0;
function findUser($wr_id)
{
    global $model;
    global $tree_data;
    $childs = [];
    foreach ($model as $key => $val) {
        if ($val['wr_6'] == $wr_id) {
            $tree_data++;
            $childs[] = $val;
        }
    }
    foreach ($childs as $key => $val) {
        if ($val['wr_id'] == 1) {
            $result[] = $val;
        }
        findUser($val['wr_id']);
    }
}
$sql  = "SELECT a.wr_id , a.mb_id , a.wr_6 , a.wr_2 , a.wr_9 , a.wr_10 FROM g5_write_plan_a a";
$my_result = sql_query($sql);
$model = array();
$start = microtime(true);
for ($i = 0; $row = sql_fetch_array($my_result); $i++) {
    $model[] = $row;
}
foreach ($model as $key => $val) {
    if ($key <= 3) {
    $tree_data = 0;
    //echo $val['wr_id'] . "<br>";
    findUser($val['wr_id']);
    $level = '0';
    if ($tree_data < '2') {
        $level = '0';
    } else 
    if ($tree_data >= '2' and $tree_data <= '5') {
        $level = '1';
    } else 
    if ($tree_data >= '6' and $tree_data <= '13') {
        $level = '2';
    } else 
    if ($tree_data >= '14' and $tree_data <= '29') {
        $level = '3';
    } else 
    if ($tree_data >= '30' and $tree_data <= '61') {
        $level = '4';
    } else 
    if ($tree_data >= '62' and $tree_data <= '125') {
        $level = '5';
    } else 
    if ($tree_data >= '126' and $tree_data <= '253') {
        $level = '6';
    } else 
    if ($tree_data >= '254' and $tree_data <= '509') {
        $level = '7';
    } else 
    if ($tree_data >= '510' and $tree_data <= '1021') {
        $level = '8';
    } else 
    if ($tree_data >= '1022' and $tree_data <= '2045') {
        $level = '9';
    } else 
    if ($tree_data >= '2046' and $tree_data <= '4093') {
        $level = '10';
    } else 
    if ($tree_data >= '4094' and $tree_data <= '8189') {
        $level = '11';
    } else 
    if ($tree_data >= '8190' and $tree_data <= '16381') {
        $level = '12';
    } else 
    if ($tree_data >= '16382' and $tree_data <= '32765') {
        $level = '13';
    } else 
    if ($tree_data >= '32766' and $tree_data <= '65533') {
        $level = '14';
    } else 
    if ($tree_data >= '65534' and $tree_data <= '131069') {
        $level = '15';
    } else 
    if ($tree_data >= '131070' and $tree_data <= '262141') {
        $level = '16';
    } else 
    if ($tree_data >= '262142' and $tree_data <= '524285') {
        $level = '17';
    } else 
    if ($tree_data >= '524286' and $tree_data <= '1048573') {
        $level = '18';
    } else 
    if ($tree_data >= '1048574' and $tree_data <= '2097149') {
        $level = '19';
    } else 
    if ($tree_data >= '2097150' and $tree_data <= '4194301') {
        $level = '20';
    }
     
     $sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
     sql_query($sql2);
 
     echo $val['wr_id'] . "<br>";
     echo "tree_data:".$tree_data."<br>";
     echo "level:".$level."<br>";
    
    }
}
$end = microtime(true);
$time = $end - $start;
echo number_format($time, 8) . "<br>";

 

상단 전체 소스입니다.

보시 if ($key <= 3) { 문으로 인해

wr_id 값을 제한적으로 뽑아냅니다. 


echo $val['wr_id'] . "<br>";
echo "tree_data:".$tree_data."<br>";
echo "level:".$level."<br>";

이렇게 나오게 했더니

아래 이미지처럼 결과값 정상으로 잘 나옵니다.

238301859_1703046484.1861.png

 


$sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
sql_query($sql2);

업데이트를 쿼리 걸어졌는데 정상으로 안들어갑니다.

여기서 머리가 쥐가 나네요!

제가 테스트로


$level = '15';
$val['wr_id'] = '1';
     
$sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
sql_query($sql2);

이렇게 날려봤더니 정상으로 디비에 들어갑니다. 

위에 소스 보시면 알겠지만 에러 표기 걸어놨는데 에러도 안나옵니다.

 

도대체 왜 그럴가요?

도저히 이해가 안되는 부분입니다.

소스문제도 없고

디비문제도 없고

결과값 정상으로 나오고!

근데 왜 디비에 안들어갈가요? ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

이 질문에 댓글 쓰기 :

답변 9

sql_query($sql2 , true); <== 이렇게 하면 에러 있을 경우 에러코드 나옵니다

==================================

ajax로 실행하기

 

위 소스에서 수정

$start_page = $next_page - 3000; //추가
 $sql  = "SELECT a.wr_id , a.mb_id ~ FROM g5_write_plan_a a limit wr_id >$start_page  and wr_id <= $next_page "; //수정

 

마지막 echo number_format($time, 8) . "<br>"; <==삭제 후 다음 코드 추가
if(isset($model[0]) && $mode[0]) die("OK"); else die("END");

 

 

start.php - jquery 사용

================

<div id='status'></div>

 

<script>

next_id = 3000; //wr_id 3000 개씩 update

function update_start(){

$.post("위소스화일", "next_id="+next_id, function(req){

 if(req =='OK'){$('#status').append('wr_id='+next_id+' / ');  next_id+=3000; update_start();}

 else if(req == 'END') alert('완료');

 else alert(req)

});

}

 

 

 

sql_query($sql2 , true); <== 이렇게 하면 에러 있을 경우 에러코드 나옵니다

이거 한번 돌려보니까
2006 : MySQL server has gone away
이게 나오네요 ㅠㅠ 그래서 관련사항 찾아보고 있습니다.
너무 감사합니다. ㅠㅠ

sql_query($sql2 , true); <== 이렇게 하면 에러 있을 경우 에러코드 나옵니다
이걸로 인해 아래와 에러코드 발생
2006 : MySQL server has gone away
인터넷 조회결과

------- 에러 원인 조치 -------
MySQL server has gone away 에러가 발생하는 원인은 아래와 같습니다. 
 
  - 커넥션이 끊어진 이후에 쿼리를 전송했을 때 
  - max_allowed_packet 을 초과하는 크기의 쿼리를 전송했을 때 
  - wait_timeout 을 초과하여 커넥션이 끊어진 경우 
  - 잘못된 쿼리를 지속적으로 전송하여 서버가 차단한 경우 
 
 
  대부분 MySQL 에 설정된 데이터 전송량이나 전송시간을 초과 하는 경우 발생합니다. 
  이런경우 MySQL 설정파일인 my.cnf 에서 아래 값을 변경해주시면됩니다. 
  MySQL 기본값은 wait_timeout 8시간, max_allowed_packet 는 16M 입니다. 
 
  wait_timeout = 28800 
  max_allowed_packet = 16777216 
----------------------------------
단독서버라
my.cnf 수정
mysql 재시작 ㅠㅠ 문제 해결되었습니다.

많은 분들 열심히 답변 달아주신점 모두 감사합니다.
저와 같은 에러 부분들 발생된 분들은 조금이나마 도움이 되시길 바랍니다.

해결에 실마리를 주신점 너무 감사합니다.
좋은 하루 되세요!
행복한 년말 되시기 바랍니다.

$val[wr_id] ==> $val['wr_id']

{$val[wr_id]} 식으로 쿼리문안에 변수들에게 {} 앞뒤로 붙여보세요

그리고 echo로 쿼리문이 정확하게 어떻게 나오는지 확인해보세요

$sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
sql_query($sql2);

echo $sql2; 해보세요, 정상적으로 구문이 만들어지는지

update g5_write_plan_a set wr_9 = '15' where wr_id = '1'
1
tree_data:67875
level:15
update g5_write_plan_a set wr_9 = '14' where wr_id = '2'
2
tree_data:35107
level:14
update g5_write_plan_a set wr_9 = '14' where wr_id = '3'
3
tree_data:32766
level:14
update g5_write_plan_a set wr_9 = '13' where wr_id = '4'
4
tree_data:18723
level:13
697.07093596

이렇게 나오네요?
근데 왜 들어가지를 않을가요? ㅠㅠㅠㅠ
아무반응과 에러가 없으니 찾기가 어렵네요 ㅠ


<?
include_once('./_common.php');
set_time_limit(0);
error_reporting(E_ALL);
ini_set('display_errors', 1);
$tree_data = 0;
function findUser($wr_id)
{
    global $model;
    global $tree_data;
    $childs = [];
    foreach ($model as $key => $val) {
        if ($val['wr_6'] == $wr_id) {
            $tree_data++;
            $childs[] = $val;
        }
    }
    foreach ($childs as $key => $val) {
        if ($val['wr_id'] == 1) {
            $result[] = $val;
        }
        findUser($val['wr_id']);
    }
}
$sql  = "SELECT a.wr_id , a.mb_id , a.wr_6 , a.wr_2 , a.wr_9 , a.wr_10 FROM g5_write_plan_a a";
$my_result = sql_query($sql);
$model = array();
$start = microtime(true);
for ($i = 0; $row = sql_fetch_array($my_result); $i++) {
    $model[] = $row;
}
 
$kkk = 0;

foreach ($model as $key => $val) {
    if ($key <= 3) {
    $tree_data = 0;
    //echo $val['wr_id'] . "<br>";
    findUser($val['wr_id']);
    $level = '0';
    if ($tree_data < '2') {
        $level = '0';
    } else 
    if ($tree_data >= '2' and $tree_data <= '5') {
        $level = '1';
    } else 
    if ($tree_data >= '6' and $tree_data <= '13') {
        $level = '2';
    } else 
    if ($tree_data >= '14' and $tree_data <= '29') {
        $level = '3';
    } else 
    if ($tree_data >= '30' and $tree_data <= '61') {
        $level = '4';
    } else 
    if ($tree_data >= '62' and $tree_data <= '125') {
        $level = '5';
    } else 
    if ($tree_data >= '126' and $tree_data <= '253') {
        $level = '6';
    } else 
    if ($tree_data >= '254' and $tree_data <= '509') {
        $level = '7';
    } else 
    if ($tree_data >= '510' and $tree_data <= '1021') {
        $level = '8';
    } else 
    if ($tree_data >= '1022' and $tree_data <= '2045') {
        $level = '9';
    } else 
    if ($tree_data >= '2046' and $tree_data <= '4093') {
        $level = '10';
    } else 
    if ($tree_data >= '4094' and $tree_data <= '8189') {
        $level = '11';
    } else 
    if ($tree_data >= '8190' and $tree_data <= '16381') {
        $level = '12';
    } else 
    if ($tree_data >= '16382' and $tree_data <= '32765') {
        $level = '13';
    } else 
    if ($tree_data >= '32766' and $tree_data <= '65533') {
        $level = '14';
    } else 
    if ($tree_data >= '65534' and $tree_data <= '131069') {
        $level = '15';
    } else 
    if ($tree_data >= '131070' and $tree_data <= '262141') {
        $level = '16';
    } else 
    if ($tree_data >= '262142' and $tree_data <= '524285') {
        $level = '17';
    } else 
    if ($tree_data >= '524286' and $tree_data <= '1048573') {
        $level = '18';
    } else 
    if ($tree_data >= '1048574' and $tree_data <= '2097149') {
        $level = '19';
    } else 
    if ($tree_data >= '2097150' and $tree_data <= '4194301') {
        $level = '20';
    }
     
if( $val['wr_id'] != '' ){
     $sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
     sql_query($sql2);
}else{
$kkk++;
}
 
     //echo $val['wr_id'] . "<br>";
     //echo "tree_data:".$tree_data."<br>";
     //echo "level:".$level."<br>";
    
    }
}
echo "val is null ".$kkk."<br>";
$end = microtime(true);
$time = $end - $start;
echo number_format($time, 8) . "<br>";

 

계속 문제있다 하시니...

$val['wr_id'] 부터 체크해보죠.

$kkk 출력이 0이어야합니다.

 

Notice: Undefined variable: kkk in /home/emporium7500/www/sync/level_up.php on line 115
val is null
702.17006922

라인 115줄은 아래와 같습니다.
echo "val is null ".$kkk."<br>";

이렇게 나오네요 ㅠㅠ 이거 에러 맞는거죵?

아래 구문 넣어 찍어보세요.

 

$sql3 = sql_fetch(" select * from g5_write_plan_a where wr_id = '$val[wr_id]' ");

if($sql3) {

echo "있다"."<br>";

} else {

echo "없다"."<br>";

}

$sql2 = " update g5_write_plan_a set wr_9 = '$level' where wr_id = '$val[wr_id]' ";
sql_query($sql2);

 

요렇게 한번 해 보세요

 

$sql  = "SELECT wr_id, mb_id, wr_6, wr_2, wr_9, wr_10 FROM g5_write_plan_a order by wr_id";
$my_result = sql_query($sql);
 

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {

  if ($key <= 3) {

 

그리고

 if ($tree_data < '2') {   // if 문  숫자의 따옴표도 모두 지우세요.

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
  if ($key <= 3) {
---------- 이부분 아래와 같이 하면되나요?

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
$model[] = $row;
}
foreach ($model as $key => $val) {
if ($key <= 3) {

아래 구문은 쿼리결과를 다시 배열에 담아 사용하는 것이어서(그누보드 방식)

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
$model[] = $row;
}

 foreach ($model as $key => $val) {  방식이 아니고

 이런 방식으로 접근해야 됩니다.

for ($i=0; $i<count($model); $i++) {
      echo $model[$i]['wr_id'];

}

그누보드 list.skin.php 구조를 참고하세요.

참고로 말씀드리면
for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
$model[] = $row;
}
이 방식은 $model배열에 다른 항목을 추가할 때 필요하지 지금 올려주신 구문에는
필요하지 않는 방법입니다. 쿼리 결과가 배열인데 배열을 또 다른 배열에 담는것은
낭비입니다.

bbs>list.php 파일을 보면
 $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']); 이 구문을 보면 쿼리뿐만 아니라 여러 항목이 추가되어 있습니다.

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
  if ($key <= 3) {
---------- 이부분 아래와 같이 하면되나요?

for ($key = 0; $val = sql_fetch_array($my_result); $key++) {
$model[] = $row;
}
foreach ($model as $key => $val) {
if ($key <= 3) {

위 부분은 사용이 가능합니다.

제가 찾은 문제점은

function findUser($wr_id) 함수에 리턴값이 빠졌습니다.
function findUser($wr_id)
{
    global $model;
    global $tree_data;
    $childs = [];
    foreach ($model as $key => $val) {
        if ($val['wr_6'] == $wr_id) {
            $tree_data++;
            $childs[] = $val;
        }
    }
    foreach ($childs as $key => $val) {
        if ($val['wr_id'] == 1) {
            $result[] = $val;  // 이 변수는 어디에 쓰이는지
        }
        findUser($val['wr_id']);
    }
return $tree_data;  // 추가
}

그리고
foreach ($model as $key => $val) {
    if ($key <= 3) {
    $tree_data = 0;
    //echo $val['wr_id'] . "<br>";

    $tree_data = findUser($val['wr_id']);  // 이렇게 수정해야

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

회원로그인

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