001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
<?php // (2022.9.9, 차재복, Cha Jae Bok, http://www.ktword.co.kr) # 세션 설정 // 세션 스타트 (매 웹페이지 마다 필요) session_start(); // 세션 변수에 따른 사용자 타입 설정 ('일반사용자' or '테스트편집자' or '정식편집자' or '종합관리자') $_SESSION['user_type'] = ( empty($_SESSION['user_name']) ? '일반사용자' : $_SESSION['user_name'] ); # 편집 권한 확인 if ($_SESSION['user_type']!='종합관리자') { echo json_encode(array('err_msg'=>'편집권한없음!'), JSON_UNESCAPED_UNICODE); exit; } // ('일반사용자' or '테스트편집자' or '정식편집자' or '종합관리자') # db 접속 (dbi) include_once "../base_utils/db_conn.php"; # 매개변수 처리 // json 포멧 수신 받아들임 $json = file_get_contents('php://input'); // json 포멧 => array 포멧 변환 $jsonArr = json_decode($json, true); // 전달매개변수 : type, choice, id (parent), seq_matched {seq:id/no}, # choice별 선택 처리 // 특정 부모 노드 산하의 용어해설 항목 리스트 순서 업데이트 if($jsonArr['type'] == 'word' and $jsonArr['choice'] == 'wordOrderInNode') { if(count($jsonArr['seq_matched'])>0) { $setStr = "list_ord="; $setStr .= "(case "; foreach($jsonArr['seq_matched'] as $key=>$value) { $setStr .= " when no={$value} then $key"; } $setStr .= " end)"; } $query = "update book_idx set $setStr where tree_id={$jsonArr['id']}"; $result = mysqli_query($dbi,$query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if (!$result or !empty($err_msg)) $err_msg .= ' 에러 발생 '; else $result_msg = '업데이트 개수 : '.mysqli_affected_rows($dbi); $return = array('query'=>$query, 'result'=>$result_msg, 'err_msg'=>$err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); // 특정 부모 노드 산하의 소스 파일 리스트 순서 업데이트 } else if ($jsonArr['type'] == 'source' and $jsonArr['choice'] == 'sourceOrderingInNode') { $setStr = "seq="; $setStr .= " (case "; foreach($jsonArr['seq_matched'] as $key=>$value) { $setStr .= " when id=? then ?"; } $setStr .= " end)"; $query = "update src_files_v3 set {$setStr} where parent=?"; // $query = "update src_files_v3 set seq= (case when id=? then ? end) where parent=?"; $stmt = mysqli_prepare($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $varStr = array(); foreach($jsonArr['seq_matched'] as $key=>$value) { $typeStr .= "ii"; $varStr[] = (int) $value; $varStr[] = $key; } $typeStr .= "i"; $varStr[] = (int) $jsonArr['id']; mysqli_stmt_bind_param($stmt, $typeStr, ...$varStr); 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"; } $return = array('query'=>$query,'typeStr'=>$typeStr,'varStr'=>$varStr, 'err_msg'=>$err_msg); // 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); // 다수의 용어해설 항목을, 부모 id 내 한꺼번에 자식으로 분류 지정 (copyWord) } else if ($jsonArr['choice'] == 'copyWord' and !empty($jsonArr['leftNoList']) and !empty($jsonArr['rightId']) and !empty($jsonArr['targetType'])) { // 해킹 방어 if(strlen($jsonArr['leftNoList'])>30) exit('너무 많은 문자열'); if ( !empty($jsonArr['rightId']) and !is_numeric($jsonArr['rightId']) or $jsonArr['rightId']<0 ) exit('잘못된 id'); // prepare_sql 함수, treeNodeCheck 함수 준비 include_once "naviUpdate_utils.php"; // prepare_sql를 위한, 소스 no들의 분리 처리 $list = explode(';',$jsonArr['leftNoList']); if(empty($list[0])) return; foreach($list as $val) { $in_str_i .= "?,"; $in_str_r .= explode(',',$val)[1].","; $id_no[] = array(explode(',',$val)[0],explode(',',$val)[1]); $types .= 'i'; $parms_arr[] = explode(',',$val)[1]; } $in_str_i = substr($in_str_i,0,-1); $in_str_r = substr($in_str_r,0,-1); $types .= 'i'; $parms_arr[] = $jsonArr['rightId']; // prepare_sql 실행 $query = "select tree_id,no,titlename from book_idx where no in ({$in_str_i}) or tree_id=? order by tree_id,list_ord"; $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); while ($row = mysqli_fetch_assoc($resultArr['result'])) { $getList[$row['tree_id']][$row['no']] = $row['titlename']; } // 결과 셋 분석 처리 후 insert value 만들기 $parent = $jsonArr['rightId']; $i = count($getList[$parent]); foreach($id_no as $val) { $i += 1; if($getList[$parent][$val[1]]) exit('중복 있음'); if($getList[$val['0']][$val['1']]) $insertList .= "($parent,{$val['1']},'{$getList[$val[0]][$val[1]]}',$i),"; // (tree_id,no,titlename,list_ord) } $insertList = substr($insertList,0,-1); $query = "insert into book_idx (tree_id,no,titlename,list_ord) values {$insertList}"; mysqli_query($dbi,$query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // 해당 분류에 속한 용어들 갯수 update treeNodeCheck($parent, $dbi, $send=false); // 부모 노드의 path2node 추출 $arr = getNodeDetail($parent,$dbi); $path2node = $arr['path2node']; /* $query = "select path2node_v2 from gubun_tree_v2 where id=$parent limit 1"; $result = mysqli_query($dbi,$query); $matched = mysqli_fetch_assoc($result); $path2node = $matched[path2node_v2]; */ // 송출 $return = array('path2node'=>$path2node, 'err_msg'=>$err_msg); echo json_encode($return, JSON_UNESCAPED_UNICODE); } else if ($jsonArr['choice'] == 'moveNode' and !empty($jsonArr['leftId']) and !empty($jsonArr['rightId']) and !empty($jsonArr['targetType'])) { // $jsonArr['choice'].', '.$jsonArr['leftId'].', '.$jsonArr['rightId'].', '.$jsonArr['targetType']; // 해킹 방어 if (!empty($jsonArr['leftId']) and !is_numeric($jsonArr['leftId']) or $jsonArr['leftId']<0) exit('잘못된 left id'); if (!empty($jsonArr['rightId']) and !is_numeric($jsonArr['rightId']) or $jsonArr['rightId']<0) exit('잘못된 right id'); // prepare_sql 함수, treeNodeCheck 함수, getParentDetail() 함수 준비 include_once "naviUpdate_utils.php"; // 소스쪽 이동 노드를 발췌하면, 나머지 노드 seq들을 1씩 감할 필요 있음 $query = "update gubun_tree_v2 a left join (select parent,sub_seq from gubun_tree_v2 where id=?) b on a.parent=b.parent set a.sub_seq=(a.sub_seq-1) where a.sub_seq > b.sub_seq"; $types = "i"; $parms_arr = array($jsonArr['leftId']); $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); if (mysqli_stmt_errno($resultArr['stmt'])) $err_msg .= mysqli_stmt_errno($resultArr['stmt'])." : ".mysqli_stmt_error($resultArr['stmt'])."\n"; // 타깃 노드의 parent,seq,nodeCount를 알아냄 $arr = getNodeDetail($jsonArr['rightId'],$dbi); list($parent,$seq,$nodeCount) = array($arr['parent'],$arr['seq'],$arr['nodeCount']); if($jsonArr['targetType']=='afterTarget') { // 타킷 노드 이후 seq들을 1씩 증가시킴 $query = "update gubun_tree_v2 set sub_seq=(sub_seq+1) where parent=$parent and sub_seq>$seq"; mysqli_query($dbi,$query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } // 소스 노드를 타킷 노드에 맞춰, parent,seq 수정(이동) $query = "update gubun_tree_v2 set parent=$parent,sub_seq=($seq+1) where id=?"; $types = "i"; $parms_arr = array($jsonArr['leftId']); $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); if (mysqli_stmt_errno($resultArr['stmt'])) $err_msg .= mysqli_stmt_errno($resultArr['stmt'])." : ".mysqli_stmt_error($resultArr['stmt'])."\n"; // 타깃 노드 부모의 child 업데이트 treeNodeCheck($parent, $dbi, $send=false); } else if($jsonArr['targetType']=='childTarget') { // 소스 노드를 타킷 자식 노드 끝에 맞춰, parent,seq 수정(이동) $query = "update gubun_tree_v2 set parent=?,sub_seq=($nodeCount+1) where id=?"; $types = "ii"; $parms_arr = array($jsonArr['rightId'],$jsonArr['leftId']); $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); if (mysqli_stmt_errno($resultArr['stmt'])) $err_msg .= mysqli_stmt_errno($resultArr['stmt'])." : ".mysqli_stmt_error($resultArr['stmt'])."\n"; // 타깃 노드 부모의 child 업데이트 treeNodeCheck($jsonArr['rightId'], $dbi, $send=false); } // 이동된 노드 자신 및 그 산하 자식들 모두에서, path2node, depth 업데이트 $query = "select id from gubun_tree_v2 where concat(',',path2node_v2,',') like concat('%',?,'%')"; $types = "s"; $parms_arr = array($jsonArr['leftId']); $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); while($row = mysqli_fetch_assoc($resultArr['result'])) { $idList[] = $row['id']; } treeNodeCheck($idList, $dbi, $send=false); // 이동된 노드의 path2node 추출 $arr = getNodeDetail($jsonArr['leftId'],$dbi); $path2node = $arr['path2node']; // 송출 $return = array('path2node'=>$path2node, 'err_msg'=>$err_msg); echo json_encode($return, JSON_UNESCAPED_UNICODE); } else if ($jsonArr['choice'] == 'etc...') { } ?>