001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
<?php // (2022.9.18, 차재복, Cha Jae Bok, http://www.ktword.co.kr) // 해당 id의 소스 파일의 날짜,코드 최신으로 업데이트 function sourceFileUpdate($id, $dbi) { // 해당 id의 소스 파일 내역 select $query = "select a.name as name,b.name as parent_name,a.date from src_files_v3 a left join src_files_v3 b on a.parent=b.id where a.id=?"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "i", $id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_get_result($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $matched = mysqli_fetch_assoc($result); // 디렉토리 내 해당 파일 날짜,내용 추출 $file_pos = '../'.$matched['parent_name'].'/'.$matched['name']; $file_timestamp = filemtime($file_pos); $file_date = date('Y-m-d H:i:s',$file_timestamp); $file_code = file_get_contents($file_pos); // $file_code = mysqli_real_escape_string($dbi, $file_code); $tbl_date = date('Y-m-d H:i:s',$matched['date']); // 날짜 비교 $date_diff = strtotime($matched['date']) - $file_timestamp; if($date_diff < 0) { $query = "update src_files_v3 set date=?, code=? where id=? limit 1"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "ssi", $file_date, $file_code, $id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } } $affected = mysqli_stmt_affected_rows($stmt) > 0 ? true : false ; $return = array('affected'=>$affected,'err_msg'=>$err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } function addSrcFile($parent, $current, $dbi) { $parent = str_replace(array("'","\"","\\","/"),'',$parent); $current = str_replace(array("'","\"","\\","/"),'',$current); if(mb_strlen($parent)>30 or mb_strlen($current)>30) exit('긴 파일명'); // db table 내 기등록된 소스 디렉토리,파일명 추출하여 배열 전환하고, // 이를 소스 디렉토리 내 디렉토리,파일 스캔한 배열과 일치 여부 확인 // (해킹 방어) include_once "naviFetch_source.php"; $srcTblArr = tblSrcArr($dbi); $srcTree = recSrcScanDir('../', $srcTblArr); if($srcTree[$parent][$current]!='nonregistered') exit("실제 디렉토리,파일 존재 확인 안됨"); // 주어진 parent가 기존 db에 미 등록된 상태이면, 부모 디렉토리 등록 include_once "naviUpdate_utils.php"; // findEmptyId() if(empty($srcTblArr[$parent])) { $empty_id = findEmptyId ('src_files_v3', $dbi); // id : 비어있는 id 번호 찾기 $query = "select max(seq) into @max_seq from src_files_v3 where parent=0"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $query = "insert into src_files_v3 (id, parent, name, type, seq, child) values ({$empty_id}, 0, '{$parent}', 'dir', (@max_seq+1), 0)"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } } // id : 비어있는 id 번호 찾기 $empty_id = findEmptyId ('src_files_v3', $dbi); // parent=id, seq=(child+1) 추출 $query = "select id,child from src_files_v3 where name=? and type='dir' limit 1"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "s", $parent); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_get_result($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $matched = mysqli_fetch_assoc($result); $parent_id = $matched[id]; $child = $matched[child]; // name = $current // date : filemtime(path),code : file_get_contents(path) $path = '../'.$parent.'/'.$current; $date = date('Y-m-d H:i:s', filemtime($path)); $code = file_get_contents($path); $code = mysqli_real_escape_string($dbi, $code); // 파일 정보 insert $query = "insert into src_files_v3 (id, parent, name, type, seq, child, date, code) values ({$empty_id}, {$parent_id}, ?, 'file', ({$child}+1), 0, '{$date}', '{$code}')"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "s", $current); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // parent child + 1 setting $query = "update src_files_v3 set child=({$child}+1) where id={$parent_id} limit 1"; mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if(empty($err_msg)) $result = true; $return = array('result'=>$result,'parent'=>$parent_id,'current'=>$empty_id,'err_msg'=>$err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } function deleteSrcFile($id, $parent_id, $dbi) { // 자식 있는 (child>0) 부모(디렉토리)일 경우 거부 $query = "select count(*) as cnt from src_files_v3 where parent=?"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "i", $id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_get_result($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $matched = mysqli_fetch_assoc($result); $children = $matched[cnt]; if($children > 0) exit('산하 자식 존재'); // 해당 id 소스 row 삭제 $query = "delete from src_files_v3 where id=? limit 1"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "i", $id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if(mysqli_stmt_affected_rows($stmt)>0) $extra_msg .= "삭제 성공"; else $err_msg .= "삭제 실패"; // 해당 id 부모의 child 조정 $query = "update src_files_v3 set child=(select count(*) from src_files_v3 where parent=?) where id=? limit 1"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "ii", $parent_id, $parent_id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if($result) $extra_msg .= "해당 id 부모 산하 자식 수 계산 후 넣기 성공"; else $extra_msg .= "해당 id 부모 산하 자식 수 감소 실패"; // 형제 seq 조정 $query = "set @rank = 0"; // mysql 변수 @rank 설정 $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $query = "update src_files_v3 set seq=@rank:=@rank+1 where parent=? order by seq"; $stmt = mysqli_prepare($dbi, $query); // if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } mysqli_stmt_bind_param($stmt, "i", $parent_id); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $result = mysqli_stmt_execute($stmt); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if(mysqli_stmt_affected_rows($stmt) > 0) $extra_msg .= "형제 seq 차례로 업데이트 성공"; else $extra_msg .= "형제 seq 차례로 업데이트 실패"; $return = array('extra_msg'=>$extra_msg,'err_msg'=>$err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } function editSrcFileFetch($id, $dbi){ // 기존 db table 내 디렉토리,파일명 추출하여 배열화 include_once "naviFetch_source.php"; $tblSrcArr = tblSrcArr($dbi); // 배열 내 주어진 값과 일치하는 키를 찾는 재귀적 함수 $dir = array_recursive_search_key_map($id, $tblSrcArr); $pathFileName = '../'.$dir[0].'/'.$dir[1]; // 파일 불러서, 배열화 $code = file_get_contents($pathFileName); $return = array('code'=>$code); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } function editSrcFileUpdate($id, $msg, $dbi){ // 소스코드 바이트 수 제한 $msg_len = strlen($msg); if( $msg_len > 10000 ) exit("10000 바이트 이상 제한 : {$msg_len}"); // 기존 db table 내 디렉토리,파일명 추출하여 배열화 include_once "naviFetch_source.php"; $tblSrcArr = tblSrcArr($dbi); // 배열 내 주어진 값과 일치하는 키를 찾는 재귀적 함수 $dir = array_recursive_search_key_map($id, $tblSrcArr); $pathFileName = '../'.$dir[0].'/'.$dir[1]; if(file_exists($pathFileName)) if(!copy($pathFileName, $pathFileName.'.bak')) $err_msg .= "기존 파일 백업 실패"; else $writtenBytes = file_put_contents($pathFileName, $msg); if($writtenBytes) $success .= '쓰여진 바이트 수 : '.$writtenBytes; else $err_msg .= "파일 업데이트 실패"; $return = array('success' => $success, 'err_msg' => $err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } function array_recursive_search_key_map($needle, $haystack) { foreach($haystack as $first_level_key=>$value) { if ($needle === $value) { return array($first_level_key); } elseif (is_array($value)) { $callback = array_recursive_search_key_map($needle, $value); if ($callback) { return array_merge(array($first_level_key), $callback); } } } return false; } ?>