테스트 사이트 - 개발 중인 베타 버전입니다

search.php 최대한 단순화 질문..

샌들 7년 전 조회 2,027

</p>

<p><?php

include_once('./_common.php');</p>

<p>$tmp_gr_id = $gr_id;</p>

<p>if (!$sfl) $sfl = 'wr_subject||wr_content';</p>

<p>// Page ID

$pid = ($pid) ? $pid : 'search';

$at = apms_page_thema($pid);

if (!defined('THEMA_PATH')) {

    include_once(G5_LIB_PATH . '/apms.thema.lib.php');

}</p>

<p>$g5['title'] = '전체검색 결과';

include_once('./_head.php');</p>

<p>$skin_path = $search_skin_path;

$skin_url = $search_skin_url;</p>

<p>$gr_id = $tmp_gr_id;</p>

<p>$bo_list = array();

$search_table = Array();

$table_index = 0;

$write_pages = "";

$text_stx = "";

$srows = 0;</p>

<p>$stx = strip_tags($stx);

//$stx = preg_replace('/[[:punct:]]/u', '', $stx); // 특수문자 제거

$stx = get_search_string($stx); // 특수문자 제거

if ($stx) {

    $stx = preg_replace('/\//', '\/', trim($stx));

    $sop = strtolower($sop);

    if (!$sop || !($sop == 'and' || $sop == 'or')) $sop = 'and'; // 연산자 and , or

    $srows = isset($_GET['srows']) ? (int)preg_replace('#[^0-9]#', '', $_GET['srows']) : 10;

    if (!$srows) $srows = 10; // 한페이지에 출력하는 검색 행수</p>

<p>    $g5_search['tables'] = Array();

    $g5_search['read_level'] = Array();

    $sql = " select gr_id, bo_table, bo_read_level from {$g5['board_table']} where bo_use_search = 1 and bo_list_level <= '{$member['mb_level']}' ";

    if ($gr_id)

        $sql .= " and gr_id = '{$gr_id}' ";

    $onetable = isset($onetable) ? $onetable : "";

    if ($onetable) // 하나의 게시판만 검색한다면

        $sql .= " and bo_table = '{$onetable}' ";

    $sql .= " order by bo_order, gr_id, bo_table ";

    $result = sql_query($sql);

    for ($i = 0; $row = sql_fetch_array($result); $i++) {

        if ($is_admin != 'super') {

            // 그룹접근 사용에 대한 검색 차단

            $sql2 = " select gr_use_access, gr_admin from {$g5['group_table']} where gr_id = '{$row['gr_id']}' ";

            $row2 = sql_fetch($sql2);

            // 그룹접근을 사용한다면

            if ($row2['gr_use_access']) {

                // 그룹관리자가 있으며 현재 회원이 그룹관리자라면 통과

                if ($row2['gr_admin'] && $row2['gr_admin'] == $member['mb_id']) {</p>

<p>                } else {

                    $sql3 = " select count(*) as cnt from {$g5['group_member_table']} where gr_id = '{$row['gr_id']}' and mb_id = '{$member['mb_id']}' and mb_id <> '' ";

                    $row3 = sql_fetch($sql3);

                    if (!$row3['cnt'])

                        continue;

                }

            }

        }

        $g5_search['tables'][] = $row['bo_table'];

        $g5_search['read_level'][] = $row['bo_read_level'];

    }</p>

<p>    $search_query = 'sfl=' . urlencode($sfl) . '&stx=' . urlencode($stx) . '&sop=' . $sop;</p>

<p>

    $text_stx = get_text(stripslashes($stx));</p>

<p>    $op1 = '';</p>

<p>    // 검색필드를 구분자로 나눈다. 여기서는 +

    $field = explode('||', trim($sfl));</p>

<p>    $str = '(';</p>

<p>

    $search_str = $stx;</p>

<p>    $op2 = '';

    // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)

    for ($k = 0; $k < count($field); $k++) {

        $str .= $op2;

        switch ($field[$k]) {

            case 'mb_id' :

            case 'wr_name' :

                $str .= "$field[$k] = '{$search_str}'";

                break;

            case 'wr_subject' :

            case 'wr_content' :

                $str .= "{$field[$k]} LIKE '%{$search_str}%'";

                break;

            default :

                $str .= "1=0"; // 항상 거짓

                break;

        }

        $op2 = " or ";

    }

    $str .= ")";</p>

<p>    $sql_search = $str;

    $str_board_list = "";

    $board_count = 0;</p>

<p>    $time1 = get_microtime();</p>

<p>    $z = 0;

    $total_count = 0;

    for ($i = 0; $i < count($g5_search['tables']); $i++) {

        $tmp_write_table = $g5['write_prefix'] . $g5_search['tables'][$i];</p>

<p>

        $sql = " select count(wr_id) as cnt from {$tmp_write_table} where {$sql_search} ";

        $result = sql_fetch($sql, false);

        $row['cnt'] = (int)$result['cnt'];</p>

<p>        $total_count += $row['cnt'];

        if ($row['cnt']) {

            $board_count++;

            $search_table[] = $g5_search['tables'][$i];

            $read_level[] = $g5_search['read_level'][$i];

            $search_table_count[] = $total_count;</p>

<p>            $sql2 = " select bo_subject from {$g5['board_table']} where bo_table = '{$g5_search['tables'][$i]}' ";

            $row2 = sql_fetch($sql2);

            $sch_class = "";

            $sch_all = "";

            if ($onetable == $g5_search['tables'][$i]) {

                $sch_class = "class=sch_on";

            } else {

                $sch_all = "class=sch_on";

                $bo_list[$z]['href'] = $_SERVER['SCRIPT_NAME'] . '?' . $search_query . '&gr_id=' . $gr_id . '&onetable=' . $g5_search['tables'][$i];

                $bo_list[$z]['name'] = $row2['bo_subject'];

                $bo_list[$z]['cnt'] = $row['cnt'];

                $z++;

            }

            $str_board_list .= '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?' . $search_query . '&gr_id=' . $gr_id . '&onetable=' . $g5_search['tables'][$i] . '" ' . $sch_class . '><strong>' . $row2['bo_subject'] . '</strong><span class="cnt_cmt">' . $row['cnt'] . '</span></a></li>';

        }

    }</p>

<p>    $rows = $srows;

    $total_page = ceil($total_count / $rows);  // 전체 페이지 계산

    if ($page < 1) {

        $page = 1;

    } // 페이지가 없으면 첫 페이지 (1 페이지)

    $from_record = ($page - 1) * $rows; // 시작 열을 구함</p>

<p>    for ($i = 0; $i < count($search_table); $i++) {

        if ($from_record < $search_table_count[$i]) {

            $table_index = $i;

            $from_record = $from_record - $search_table_count[$i - 1];

            break;

        }

    }</p>

<p>    $bo_subject = array();

    $list = array();</p>

<p>    $k = 0;

    for ($idx = $table_index; $idx < count($search_table); $idx++) {

        $sql = " select bo_subject from {$g5['board_table']} where bo_table = '{$search_table[$idx]}' ";

        $row = sql_fetch($sql);

        $bo_subject[$idx] = $row['bo_subject'];</p>

<p>        $tmp_write_table = $g5['write_prefix'] . $search_table[$idx];</p>

<p>        $sql = " select * from {$tmp_write_table} where {$sql_search} order by wr_id desc limit 0, 5 ";

        $result = sql_query($sql);

        for ($i = 0; $row = sql_fetch_array($result); $i++) {

            // 검색어까지 링크되면 게시판 부하가 일어남

            $list[$idx][$i] = $row;

            $list[$idx][$i]['href'] = './board.php?bo_table=' . $search_table[$idx] . '&wr_id=' . $row['wr_parent'];</p>

<p>

            // 비밀글은 검색 불가

            if (strstr($row['wr_option'] . $row2['wr_option'], 'secret'))

                $row['wr_content'] = '[비밀글 입니다.]';</p>

<p>            $subject = apms_get_text($row['wr_subject']);

            if (strstr($sfl, 'wr_subject'))

                $subject = search_font($stx, $subject);</p>

<p>            if ($read_level[$idx] <= $member['mb_level']) {

                //$content = cut_str(get_text(strip_tags($row['wr_content'])), 300, "…");

                //$content = strip_tags($row['wr_content']);

                $content = apms_cut_text($row['wr_content'], 300);

                //$content = strip_tags($content);

                $content = str_replace(' ', '', $content);

                //$content = cut_str($content, 300, "…");</p>

<p>                if (strstr($sfl, 'wr_content'))

                    $content = search_font($stx, $content);

            } else

                $content = '';</p>

<p>            $list[$idx][$i]['bo_table'] = $search_table[$idx];

            $list[$idx][$i]['subject'] = $subject;

            $list[$idx][$i]['content'] = $content;

            $list[$idx][$i]['name'] = apms_sideview($row['mb_id'], get_text(cut_str($row['wr_name'], $config['cf_cut_name'])), $row['wr_email'], $row['wr_homepage'], $row['as_level']);

            $list[$idx][$i]['date'] = strtotime($row['wr_datetime']);</p>

<p>            $k++;

            if ($k >= $rows)

                break;

        }

        sql_free_result($result);</p>

<p>        if ($k >= $rows)

            break;</p>

<p>        $from_record = 0;

    }</p>

<p>    $write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'] . '?' . $search_query . '&gr_id=' . $gr_id . '&srows=' . $srows . '&onetable=' . $onetable . '&page=');

    $write_page_rows = (G5_IS_MOBILE) ? $config['cf_mobile_pages'] : $config['cf_write_pages'];

    $list_page = $_SERVER['SCRIPT_NAME'] . '?' . $search_query . '&gr_id=' . $gr_id . '&srows=' . $srows . '&onetable=' . $onetable . '&page=';

}</p>

<p>$group_option = '';

$sql = " select gr_id, gr_subject from {$g5['group_table']} order by gr_id ";

$result = sql_query($sql);

for ($i = 0; $row = sql_fetch_array($result); $i++) {

    $group_option .= "<option value=\"" . $row['gr_id'] . "\"" . get_selected($_GET['gr_id'], $row['gr_id']) . ">" . $row['gr_subject'] . "</option>";

}</p>

<p>$group_select = '<label for="gr_id" class="sound_only">게시판 그룹선택</label><select name="gr_id" id="gr_id" class="select"><option value="">전체 분류';

$group_select .= $group_option;

$group_select .= '</select>';</p>

<p>if (!$sfl) $sfl = 'wr_subject';

if (!$sop) $sop = 'or';</p>

<p>include_once($skin_path . '/search.skin.php');</p>

<p>include_once('./_tail.php');

?>

 

 

검색 결과값 0~5개 까지 출력이랑

 

공백 제거 기능 삭제하였는데

 

여기서 더 직관적으로 

 

단순화 코드를 작성하려는데

 

어떤식으로 해야될까요..?

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

검색시 속도개선이 문제라면, 검색엔진을 추가하셔야합니다. 

like 검색은 인덱스를 추가해서 문제를 해결할수 없습니다. 

 

동일한 검색어가 많다면, 검색어에 대한 캐싱 처리(redis 를 이용) 

다양한 검색어가 많이 들어온다면, 검색엔진을 추가(mysql full text search, sphinx, elasticsearch 등) 합니다.

 

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

그누위즈

나시님의 말씀대로 디비테이블에 인덱스나 그런 부분을통해서 튜닝해야합니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

7년 전

소스 최적화는 더 이상 할게 별로 없어 보입니다.

 

DB자체의 튜닝을 해야죠

머 일반적인건 해당 컬럼에 index 를 걸거나 그런거요

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인