[질답게시판 만들기] 03. function.php

03. function.php

구현에 필요한 여러가지 함수를 모아놓은 파일입니다.

함수별로 설명하겠습니다.

 

alert

function alert($msg = '', $url = '')
{
    if (empty($msg)) {
        $msg = '잘못된 접근입니다';
    }
    echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';
    echo '<script type="text/javascript">alert("' . $msg . '");';
    if (empty($url)) {
        echo 'history.go(-1);';
    }
    if ($url) {
        echo 'document.location.href="' . $url . '"';
    }
    echo '</script>';
    exit;
}

javascript  Alert 창을 띄우고 지정한 페이지로 이동하는 함수입니다.

url을 지정하지 않으면 뒤로가기를 실행합니다.

 

cut_str

function cut_str($str = '', $len = '', $suffix = '…')
{
    $arr_str = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    $str_len = count($arr_str);
    if ($str_len >= $len) {
        $slice_str = array_slice($arr_str, 0, $len);
        $str = join('', $slice_str);
        return $str . ($str_len > $len ? $suffix : '');
    } else {
        $str = join('', $arr_str);
        return $str;
    }
}

지정한 글자수로 텍스트를 자르는 함수입니다.

 

array_map_deep

function array_map_deep($fn, $array) {
    if(is_array($array)) {
        foreach($array as $key => $value) {
            if(is_array($value)) {
                $array[$key] = array_map_deep($fn, $value);
            } else {
                $array[$key] = call_user_func($fn, $value);
            }
        }
    } else {
        $array = call_user_func($fn, $array);
    }

    return $array;
}

배열에 들어있는 각 값에 특정함수를 적용시킨후 반환하는 함수입니다.

앞선 포스팅 common.php 에서 서버 변수를 처리하면서 사용하는 함수입니다.

 

sql_escape_string

function sql_escape_string($str) {	
	$str = preg_replace('/(and|or).*(union|select|insert|update|delete|from|where|limit|create|drop).*/i', '', $str);
    $str = call_user_func('addslashes', $str);
    return $str;
}

SQL 공격을 방어하기 위해 특정 명령어를 처리하고, addslashes 함수를 적용하는 함수입니다.

common.php 에서 서버 변수를 처리하면서 사용하는 함수입니다.

 

current_url

function current_url()
{
	global $_SERVER;
	return	BASEURL.preg_replace("`\/[^/]*\.php$`i", "", $_SERVER['PHP_SELF']).$_SERVER['REQUEST_URI'];
}

현재 페이지의 URI 를 반환합니다. ( URL + Parameter)

 

sns_datetime

function sns_datetime($date) {
	if(! is_numeric($date)) {
		$date = strtotime($date);
	}    
    $gap = time() - $date;

     if($gap < 60) {
        $posting_time = "방금";
    } elseif($gap >= 60 and $gap < 3600) {
        $posting_time = floor($gap/60)."분 전";
    } elseif($gap >= 3600 and $gap < 86400) {
        $posting_time = floor($gap/3600)."시간 전";
    } elseif($gap >= 86400 and $gap < 259200) {
        $posting_time = floor($gap/86400)."일 전";
    } else {
        $posting_time = date("Y.m.d", $date);
    }
    
    return $posting_time;
}

날짜형식또는 unix_timestamp를 sns 형식처럼 변환하여 반환하는 함수입니다.

 

get_pagination

function get_pagination($page, $total_page, $add_param)
{
	// 만약 총 페이지가 0 이면 총 페이지는 1로 다시 설정
    if ($total_page == 0) $total_page =1;

	// 한번에 표시할 페이지
	$page_scale=5;

	// 최종 리턴할 문자열 생성
	$str = "";

	// 한번에 표시할 페이지중 가장 처음 페이지와 가장 마지막 페이지 계산
	$start_page = ((ceil($page/$page_scale)-1)*$page_scale)+1;                  
    $end_page = $start_page + $page_scale-1;

	// 가장 마지막페이지가 총 페이지보다 크면 마지막페이지를 총 페이지로
	if($end_page >= $total_page) : 
        $end_page = $total_page;
    endif;

	// 처음 버튼 만들기
	if($page > 1) :
        $str .= '<li><a href="?page=1">처음</a></li>';
    else :
        $str .= '<li class="disabled"><span>처음</span></li>';
    endif;

	// 이전 버튼 만들기
    if ($start_page > 1) :
		$str .= '<li><a href="?page='.($start_page-1).'">이전</a></li>';
    else :
        $str .= '<li class="disabled"><span>이전</span></li>';
    endif;    
    
	// 각 페이지 번호 만들기
    for ($i=$start_page; $i<=$end_page; $i++) :
        if ($page == $i) : 
            $str .= "<li class=\"current active\"><span>{$i}</span></li>";
        else : 
			$str .= '<li><a href="?page='.$i.'">'.$i.'</a></li>';
        endif;
    endfor;
    
	// 다음 버튼 만들기
    if ($total_page > $end_page) :
		$str .= '<li><a href="?page='.($end_page+1).'">다음</a></li>';
    else :
        $str .= '<li class="disabled"><span>다음</span></li>';
    endif;
    
    if ($page < $total_page) :    
		$str .= '<li><a href="?page='.$total_page.'">마지막</a></li>';
    else :
        $str .= '<li class="disabled"><span>마지막</span></li>';
    endif;
    
	$str = "<ul class=\"pagination\">{$str}</ul>";
	
    return $str;
}

페이지네이션을 생성하기 위한 함수입니다.

 

완성된 파일입니다.

<?php
/*
 * Javascript Alert 창을 띄우고 지정한 URL로 이동
 */
function alert($msg = '', $url = '')
{
    if (empty($msg)) {
        $msg = '잘못된 접근입니다';
    }
    echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';
    echo '<script type="text/javascript">alert("' . $msg . '");';
    if (empty($url)) {
        echo 'history.go(-1);';
    }
    if ($url) {
        echo 'document.location.href="' . $url . '"';
    }
    echo '</script>';
    exit;
}

/*
 * 글자수 자르기
 */
function cut_str($str = '', $len = '', $suffix = '…')
{
    $arr_str = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    $str_len = count($arr_str);
    if ($str_len >= $len) {
        $slice_str = array_slice($arr_str, 0, $len);
        $str = join('', $slice_str);
        return $str . ($str_len > $len ? $suffix : '');
    } else {
        $str = join('', $arr_str);
        return $str;
    }
}

/**
 * 현재 URI를 반환합니다.
 */
function current_url()
{
	global $_SERVER;
	return	BASEURL.preg_replace("`\/[^/]*\.php$`i", "", $_SERVER['PHP_SELF']).$_SERVER['REQUEST_URI'];
}

/**
 * 배열에 들어있는 각 값에 특정한 함수를 적용 시키고,
 * 적용된 값이 들어있는 배열을 반환한다. 
 * 
 * @param string $fn 적용할 함수
 * @param string $value 적용할 값
 * @return Array $array 적용완료시킨 배열
 */ 
function array_map_deep($fn, $array) {
    if(is_array($array)) {
        foreach($array as $key => $value) {
            if(is_array($value)) {
                $array[$key] = array_map_deep($fn, $value);
            } else {
                $array[$key] = call_user_func($fn, $value);
            }
        }
    } else {
        $array = call_user_func($fn, $array);
    }

    return $array;
}


/**
 * 문자열에 SQL Injection 방어 처리를 한다.
 * 
 * @param String $str 적용할 String 
 * @return String $str 적용시킨 String
 */ 
function sql_escape_string($str) {	
	$str = preg_replace('/(and|or).*(union|select|insert|update|delete|from|where|limit|create|drop).*/i', '', $str);
    $str = call_user_func('addslashes', $str);
    return $str;
}

/*
 * 페이지네이션 만들기
 */
function get_pagination($page, $total_page, $add_param)
{
	// 만약 총 페이지가 0 이면 총 페이지는 1로 다시 설정
    if ($total_page == 0) $total_page =1;

	// 한번에 표시할 페이지
	$page_scale=5;

	// 최종 리턴할 문자열 생성
	$str = "";

	// 한번에 표시할 페이지중 가장 처음 페이지와 가장 마지막 페이지 계산
	$start_page = ((ceil($page/$page_scale)-1)*$page_scale)+1;                  
    $end_page = $start_page + $page_scale-1;

	// 가장 마지막페이지가 총 페이지보다 크면 마지막페이지를 총 페이지로
	if($end_page >= $total_page) : 
        $end_page = $total_page;
    endif;

	// 처음 버튼 만들기
	if($page > 1) :
        $str .= '<li><a href="?page=1">처음</a></li>';
    else :
        $str .= '<li class="disabled"><span>처음</span></li>';
    endif;

	// 이전 버튼 만들기
    if ($start_page > 1) :
		$str .= '<li><a href="?page='.($start_page-1).'">이전</a></li>';
    else :
        $str .= '<li class="disabled"><span>이전</span></li>';
    endif;    
    
	// 각 페이지 번호 만들기
    for ($i=$start_page; $i<=$end_page; $i++) :
        if ($page == $i) : 
            $str .= "<li class=\"current active\"><span>{$i}</span></li>";
        else : 
			$str .= '<li><a href="?page='.$i.'">'.$i.'</a></li>';
        endif;
    endfor;
    
	// 다음 버튼 만들기
    if ($total_page > $end_page) :
		$str .= '<li><a href="?page='.($end_page+1).'">다음</a></li>';
    else :
        $str .= '<li class="disabled"><span>다음</span></li>';
    endif;
    
    if ($page < $total_page) :    
		$str .= '<li><a href="?page='.$total_page.'">마지막</a></li>';
    else :
        $str .= '<li class="disabled"><span>마지막</span></li>';
    endif;
    
	$str = "<ul class=\"pagination\">{$str}</ul>";
	
    return $str;
}


/**
 * 시간 표시를 페이스북 처럼
 */
function sns_datetime($date) {
	if(! is_numeric($date)) {
		$date = strtotime($date);
	}    
    $gap = time() - $date;

     if($gap < 60) {
        $posting_time = "방금";
    } elseif($gap >= 60 and $gap < 3600) {
        $posting_time = floor($gap/60)."분 전";
    } elseif($gap >= 3600 and $gap < 86400) {
        $posting_time = floor($gap/3600)."시간 전";
    } elseif($gap >= 86400 and $gap < 259200) {
        $posting_time = floor($gap/86400)."일 전";
    } else {
        $posting_time = date("Y.m.d", $date);
    }
    
    return $posting_time;
}

 

[catlist id=76 numberposts=14 conditional_title=”PHP 질문과 답변 게시판 만들기” orderby=date]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.