개발노트
목록
[PHP] 간단한 테이블 tr 행 데이터 순서 변경 함수
PHPJqueryMaraDBmovesortFunction
PHP 2024.04.11 92 회 읽음
PHP 24.04.11 92


관리 서비스나 게시판을 개발하고 운영하다 보면 정렬이 필요한 경우가 많이 있습니다. 가장 간편한 방법으로는 숫자를 직접 입력하여 저장하면 입력한 숫자 순서대로 정렬하는 게 단순하지만 관리자가 개발하기 쉬운 방법이 있습니다. JQuery를 이용하여 라인을 서로 바꾸거나 이동하는 방법도 많이 사용하고 있습니다.

php로 가장 간단한 방법으로 사용하고 싶어 SQL에서 이전 데이터 다음 데이터를 불러와서 서로 순서 값만 전환하는 방식으로 구현 해 보았습니다. 대량의 데이터를 이용하는 데에는 적합하지 않으나 게시판이나 한 화면에서 이동하는 데에는 불편함이 없습니다. 응용을 통해 5번재 10번째와 서로 순서를 바꾸는 것도 구현이 가능합니다.


간단하게 순서 변경하는 PHP 소스

조건은 "idx"라는 값은 새로운 데이터가 등록할 때 max 값을 불러와서 +1 하여 저장합니다. "nm" 이라는 값은 고유 번호로 수정 및 변경을 위해 사용하는 값 입니다. 간단한 방법으로 관리자에서 사용하기에 좋습니다.


정렬을 위한 함수

# $tb_nm : 테이블명
# $num : 고유번호
# $act : up or dn 업다운 여부

function _sort( $tb_nm, $num, $act ){

    global $connect;
    $sql = "
SELECT a.nm, a.idx,
        ( SELECT b.nm FROM tbl_product b WHERE a.idx > b.idx ORDER BY idx ASC LIMIT 1 ) AS nxt,
        ( SELECT b.nm FROM tbl_product b WHERE a.idx < b.idx ORDER BY idx ASC LIMIT 1 ) AS pre
FROM tbl_product a
WHERE nm=".$num."
LIMIT 1
    ";
    $query  = mysqli_query($connect,$sql);
    $row    = ($query==true) ? mysqli_fetch_array($query) : die(mysqli_error($connect));
    switch( $act ){
        case 'up' :
            if( $row["pre"] ){
                $q  = mysqli_query($connect,"SELECT idx AS up FROM $tb_nm WHERE nm='".$row["pre"]."'");
                $r  = ($q==true) ? mysqli_fetch_array($q) : die(mysqli_error($connect));
                IF( mysqli_query($connect,"UPDATE $tb_nm SET idx='".$r["up"]."' WHERE nm='".$num."'")==false ) die(mysqli_error($connect));
                IF( mysqli_query($connect,"UPDATE $tb_nm SET idx='".$row["idx"]."' WHERE nm='".$row["pre"]."'")==false ) die(mysqli_error($connect));
                return "OK|위로 이동되었습니다.";
                exit;
            }
            break;
        case 'dn' :
            if( $row["nxt"] ){
                $q  = mysqli_query($connect,"SELECT idx AS dn FROM $tb_nm WHERE nm='".$row["nxt"]."'");
                $r  = ($q==true) ? mysqli_fetch_array($q) : die(mysqli_error($connect));
                IF( mysqli_query($connect,"UPDATE $tb_nm SET idx='".$r["dn"]."' WHERE nm='".$num."'")==false ) die(mysqli_error($connect));
                IF( mysqli_query($connect,"UPDATE $tb_nm SET idx='".$row["idx"]."' WHERE nm='".$row["nxt"]."'")==false ) die(mysqli_error($connect));
                return "OK|아래로 이동되었습니다.";
            }
            break;
    }

    return'|데이터 없음';
}


idx 최대값을 구하기

$q  = mysqli_query($connect,"SELECT MAX(idx) AS idx, MAX(nm) AS nm FROM $tb_nm");
$r  = mysqli_fetch_array($q);
$idx = $r["idx"] + 1;


html 버튼 부분

<button class="btn btn-up" val="<?=$row["nm"]?>" type="button">UP</button>
<button class="btn btn-dn" val="<?=$row["nm"]?>" type="button">DOWN</button>

Jquery 부분

    $(".btn-up, .btn-dn").click(function(){
        var url = "?action=sort&num="+$(this).attr("val");
        if( $(this).hasClass('btn-up')==true ) {
            url+= "&act=up";
        }
        if( $(this).hasClass('btn-dn')==true ) {
            url+= "&act=dn";
        }
        $.get(url, function(data, status){
            if( status=='success' ){
                var rtn = data.split("|");
                if( rtn[0]=='OK' ){
                    document.location.reload();
                }
            }
        });
    });


이와 같이 btn-up or btn-dn Class를 추가만해주고 val 이라는 값에 고유번호 nm 을 넣어주는 간단한 방법입니다. 그리드 형태의 이미지 게시판에서 정렬을 활용할 때에는 행과 열에 대한 부분 고려하여 +3 +6  값을 정하면 세로 형태의 위아래와 가로 영역으로 정렬하여 사용할 수 있습니다.

목록