반응형

저번 시간에 함수를 만들어 봤는데 해당 페이지에서만 사용할려고 함수를 만들진 않는다. 사용자의 이름을 가져오는 함수를 만들었으니 해당 함수를 다른 페이지에서도 사용해 보도록 하자. 그러려면 해당 함수를 다른 페이지에서도 사용할 수 있도록 해야한다.

 

우선 /lib 폴더를 만들고 그 안에 lib.php 파일을 만들어서 지난 시간에 만들었던 함수를 이동한다. 이동하는거다. 기존에 index.php에 있는건 지워야한다.

 

/lib/lib.php

<?php include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";

//글 작성자의 이름을 가져오기 위해 함수를 사용했다. 매개변수인 userid를 통해 이름을 알아낸 후 그 값을 리턴해 준다.
function member_name($userid){
    global $mysqli;//$mysqli 는 dbconn.php에서 만들어진 변수이기때문에 함수안에서 사용하려면 global로 선언해주어야한다.
    $query = "select username from members where userid='".$userid."'";
    $result = $mysqli->query($query) or die("query error => ".$mysqli->error);
    $rs = $result->fetch_object();
    return $rs->username;
}

?>

이렇게 만들어 준다. 기존에 index.php에 있던 member_name 함수는 삭제해야 한다. 반드시. php는 함수 이름이 같으면 오류가 나니까. 함수들은 가급적 이름을 다르게 만드는 것이 좋다.

 

자 그리고 이 파일이 다른 페이지에서도 사용할 수 있도록 하기 위해서 include해 준다.

 

/inc/header.php

<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
include $_SERVER["DOCUMENT_ROOT"]."/lib/lib.php";
ini_set( 'display_errors', '0' );
?>
<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  <script  src="http://code.jquery.com/jquery-latest.min.js"></script>
    <title>게시판</title>
  </head>
  <body>
  <div class="col-md-8" style="margin:auto;padding:20px;">
 

다른 페이지에도 include 돼 있는 header.php에 include 해 주었다.

 

이렇게 되면 /inc/header.php를 include하고 있는 다른 페이지에서도 member_name함수를 이용해서 사용자의 이름을 가져올 수 있다.

 

글쓰기 화면에서 member_name을 이용해서 사용자 이름을 가져와 보자.

 

/write.php

<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";

if(!$_SESSION['UID']){
    echo "<script>alert('회원 전용 게시판입니다.');history.back();</script>";
    exit;
}

$bid=$_GET["bid"];//get으로 넘겼으니 get으로 받는다.
$parent_id=$_GET["parent_id"];

if($bid){//bid가 있다는건 수정이라는 의미다.

    $result = $mysqli->query("select * from board where bid=".$bid) or die("query error => ".$mysqli->error);
    $rs = $result->fetch_object();

    if($rs->userid!=$_SESSION['UID']){
        echo "<script>alert('본인 글이 아니면 수정할 수 없습니다.');history.back();</script>";
        exit;
    }

    $fquery="select * from file_table where status=1 and bid=".$rs->bid." order by fid asc";
    $file_result = $mysqli->query($fquery) or die("query error => ".$mysqli->error);
    while($frs = $file_result->fetch_object()){
        $fileArray[]=$frs;
    }

}

if($parent_id){//parent_id가 있다는건 답글이라는 의미다.

    $result = $mysqli->query("select * from board where bid=".$parent_id) or die("query error => ".$mysqli->error);
    $rs = $result->fetch_object();
    $rs->subject = "[RE]".$rs->subject;
}

    //기존에 삽입한 이미지가 있다면 정보를 불러온다.
    if($bid){
        $results = $mysqli->query("select GROUP_CONCAT(fid) as fids from file_table_summer where bid=".$bid) or die("query error => ".$mysqli->error);
        $fs = $results->fetch_object();
    }
?>
        <form method="post" action="write_ok.php" onsubmit="return sendform();" enctype="multipart/form-data">
            <input type="hidden" name="bid" value="<?php echo $bid;?>">
            <input type="hidden" name="parent_id" value="<?php echo $parent_id;?>">
            <input type="hidden" name="file_table_id" id="file_table_id" value="">
            <input type="hidden" name="summer_fid" id="summer_fid" value="<?php echo $fs->fids;?>">
            <div class="mb-3">
            <label for="exampleFormControlInput1" class="form-label">이름</label>
                <input type="text" name="username" class="form-control" id="exampleFormControlInput1" value="<?php echo member_name($_SESSION['UID']);?>">

            <label for="exampleFormControlInput1" class="form-label">제목</label>
                <input type="text" name="subject" class="form-control" id="exampleFormControlInput1" placeholder="제목을 입력하세요." value="<?php echo $rs->subject;?>">
            </div>
            <div class="mb-3">
            <label for="exampleFormControlTextarea1" class="form-label">내용</label>
            <!-- summernote 추가분 -->
            <div class="mb-3">
                <iframe id="summer" src="summernote.php?content=<?php echo urlencode(htmlspecialchars_decode($rs->content));?>" style="width:100%; height:520px; border:none" scrolling = "no"></iframe>
                <textarea id="content" name="content" style="display: none;"></textarea>
            </div>
            </div>
            <div class="mb-3">
                <input type="file" name="upfile[]" id="upfile" multiple class="form-control" aria-label="Large file input example">
            </div>
            <!-- 첨부된 이미지 표시 -->
            <div class="row row-cols-1 row-cols-md-6 g-4" id="imageArea">
                <?php
                    foreach($fileArray as $fa){
                ?>
                <div class="col" id="f_<?php echo $fa->fid;?>">
                    <div class="card h-100">
                        <img src="/data/<?php echo $fa->filename?>" class="card-img-top" >
                    <div class="card-body">
                        <button type="button" class="btn btn-warning" onclick="file_del(<?php echo $fa->fid;?>)">삭제</button>
                    </div>
                    </div>
                </div>
                <?php }?>
               
            </div>
            <!-- 첨부된 이미지 -->
            <br />
            <button type="submit" class="btn btn-primary">등록</button>
        </form>

<script>

    function sendform(){
        var contents=$('#summer').get(0).contentWindow.$('#summernote').summernote('code');//iframe에 있는 summernote함수를 작동시킨다.

        if ($('#summer').get(0).contentWindow.$('#summernote').summernote('isEmpty')) {
          alert('내용을 입력하세요.');
          return false;
        }

        $("#content").html(contents);

        return true;
    }

    $("#upfile").change(function(){

        var files = $('#upfile').prop('files');
        for(var i=0; i < files.length; i++) {
            attachFile(files[i]);
        }

        $('#upfile').val('');

    });  

    function attachFile(file) {
        var formData = new FormData();
        formData.append("savefile", file);
        $.ajax({
            url: 'save_image.php',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            dataType : 'json' ,
            type: 'POST',
            success: function (return_data) {
                if(return_data.result=="member"){
                    alert('로그인 하십시오.');
                    return;
                }else if(return_data.result=="size"){
                    alert('10메가 이하만 첨부할 수 있습니다.');
                    return;
                }else if(return_data.result=="image"){
                    alert('이미지 파일만 첨부할 수 있습니다.');
                    return;
                }else if(return_data.result=="error"){
                    alert('첨부하지 못했습니다. 관리자에게 문의하십시오.');
                    return;
                }else{
                    fid = $("#file_table_id").val() + return_data.fid + ",";
                    $("#file_table_id").val(fid);
                    var html = "<div class='col' id='f_"+return_data.fid+"'><div class='card h-100'><img src='/data/"+return_data.savename+"' class='card-img-top'><div class='card-body'><button type='button' class='btn btn-warning' onclick='file_del("+return_data.fid+")'>삭제</button></div></div></div>";
                    $("#imageArea").append(html);
                }
            }
        });

    }



    function file_del(fid){

        if(!confirm('삭제하시겠습니까?')){
        return false;
        }
           
        var data = {
            fid : fid
        };
            $.ajax({
                async : false ,
                type : 'post' ,
                url : 'file_delete.php' ,
                data  : data ,
                dataType : 'json' ,
                error : function() {} ,
                success : function(return_data) {
                    if(return_data.result=="member"){
                        alert('로그인 하십시오.');
                        return;
                    }else if(return_data.result=="my"){
                        alert('본인이 작성한 글만 삭제할 수 있습니다.');
                        return;
                    }else if(return_data.result=="no"){
                        alert('삭제하지 못했습니다. 관리자에게 문의하십시오.');
                        return;
                    }else{
                        $("#f_"+fid).hide();
                    }
                }
        });

    }

</script>

<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>

사용자 이름을 등록하진 않고 그냥 확인만 할거다. 지난 시간에 만들었던 member_name함수를 이용해 이름을 불러왔다.

 

비쥬얼스튜디오코드를 사용하는 사용자라면 write.php에 있는 member_name 위에 커서를 옮기고 F12키를 누르면 저 함수가 선언된 파일로 이동해 해당 함수의 내용을 보여준다. 아주 좋다.

 

설마 아직도 에디트 플러스나 울트라에디트를 쓰는 사람들은 없겠지? 아직도 있다면 당장 비쥬얼스튜디오코드로 바꿔라. 반드시!

 

지금까지 우리가 만든 함수를 사용자함수라고 한다. 사용자가 필요로 해서 직접 만들었다는 말이다. php에는 기본적인 내장함수라는 것도 있다. 따로 우리가 함수를 만들어주지 않아도 php에서 사용하기 편하게 만들어둔 함수이다. 대표적으로 number_format함수가 있다. 다음 예제를 보자.

<?php
$w=123456789;
echo $w."원<br>";
echo number_format($w)."원<br>";
?>

아무런 include가 없지만 number_format은 함수의 모양이다. 이렇게 php가 미리 만들어 놓은 함수를 내장함수라고 한다. 위 코드는 아래와 같이 나타난다.

 

123456789원
123,456,789원

 

내장함수는 따로 다루진 않는다. 혹시 나타날때마다 언급하도록 하겠다.

반응형

+ Recent posts