채택완료

다중검색 질문입니다 !! ㅠㅠ

2014-12-01 (월) 14:45:49 4,498

다중검색질문입니다.

!! [ 게시판 리스트 중 제목부분과 필드 wr_26번을 함께 검색하려니 잘 되질 않습니다.]

한가지씩은 검색이 잘 되는데 두가지 AND 검색 시 잘 되질 않아 어느부분을 손대야 할지 난감합니다.

고수님들 한 수 지도 부탁드립니다.

Copy
<form name=fsearch method=get style="margin:0;" onsubmit="return fsearch_set(this);">          <input type="hidden" name="bo_table" value="<?=$bo_table?>">  <!-- <input type="hidden" name="sca"      value="<?=$sca?>"> -->         <input type="hidden" name="sfl" value="<?=$sfl?>">         <input type="hidden" name="stx" value="<?=$stx?>">         <input type="hidden" name="sop" value="<?=$sop?>">    <table width=100%>           <tr>             <td> --- 중간 생략 -- <select name="search_sel" id="search_sel">         <option value="wr_subject">제목에서 검색</option>                 <!-- 제목 -->         <option value="wr_content">내용내서 검색</option>                 <!-- 내용 --></select>&nbsp;&nbsp;         <input name="search_text" id="search_text" size="27" maxlength="18" value='<?=stripslashes($search_text)?>'>  <select name="wr_25" id="wr_25">         <option value="">등급선택</option>         <option value="급">급</option>         <option value="상">상</option>         <option value="중">중</option>         <option value="하">하</option></select>  <select name="nameno" id="nameno">        <option value="wr_26">이름으로 검색</option>    <== 이 부분을 wr_subject 즉, '이름으로 검색' 놓고 제목에서 검색 부분과 함께 검색하면 AND검색이 안됩니다.ㅠㅠ        <option value="wr_30">순번으로 검색</option> </select> <input name="searchnameno" id="searchnameno" size="15" value='<?=stripslashes($searchnameno)?>'>      </td>           </tr>               </table> </form>--- 이하 생략 ----- 아래는 스크립트 부분 --- <script language="JavaScript">  if('<?=$wr_6?>' != '') document.getElementById('wr_6').value = '<?=$wr_6?>';  if('<?=$search_sel?>' != '') document.getElementById('search_sel').value = '<?=$search_sel?>';  if('<?=$search_text?>' != '') document.getElementById('search_text').value = '<?=$search_text?>';  if('<?=$nameno?>' != '') document.getElementById('nameno').value = '<?=$nameno?>';  if('<?=$searchnameno?>' != '') document.getElementById('searchnameno').value = '<?=$searchnameno?>';  function fsearch_set(f)  {   f.stx.value = "";   f.sfl.value = "";   if(document.getElementById('wr_6').value){    f.stx.value += document.getElementById('wr_6').value+" ";    if(f.sfl.value) f.sfl.value+= "||";    f.sfl.value += "wr_6";   }   if(document.getElementById("search_text").value){    f.stx.value += document.getElementById('search_text').value;    if(f.sfl.value) f.sfl.value+= "||";    f.sfl.value += document.getElementById('search_sel').value;   }   if(document.getElementById("searchnameno").value){    f.stx.value += document.getElementById('searchnameno').value;    if(f.sfl.value) f.sfl.value+= "||";    f.sfl.value += document.getElementById('nameno').value;   }   f.sop.value = "and";   if(!f.stx.value){    alert("검색은 최소 1개이상의 검색옵션을 선택 하십시오.");    return false;   }   return true;  } </script>

지도편달 부탁드리겠습니다. (__

|

답변 3개

채택된 답변
+20 포인트

// 검색 구문을 얻는다.
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and')
{
    global $g5;

    $str = "";
    if ($search_ca_name)
        $str = " ca_name = '$search_ca_name' ";

    $search_text = strip_tags(($search_text));
    $search_text = trim(stripslashes($search_text));

    if (!$search_text) {
        if ($search_ca_name) {
            return $str;
        } else {
            return '0';
        }
    }

    if ($str)
        $str .= " and ";

    // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다.
    $op1 = "";

    // 검색어를 구분자로 나눈다. 여기서는 공백
    $s = array();
    $s = explode(" ", $search_text);

    // 검색필드를 구분자로 나눈다. 여기서는 +
    $tmp = array();
    $tmp = explode(",", trim($search_field));
    $field = explode("||", $tmp[0]);
    $not_comment = "";
    if (!empty($tmp[1]))
        $not_comment = $tmp[1];

    $str .= "(";
    for ($i=0; $i<count($s); $i++) {
        // 검색어
        $search_str = trim($s[$i]);
        if ($search_str == "") continue;

        // 인기검색어
        $sql = " insert into {$g5['popular_table']} set pp_word = '$search_str', pp_date = '".G5_TIME_YMD."', pp_ip = '{$_SERVER['REMOTE_ADDR']}' ";
        sql_query($sql, FALSE);

        $str .= $op1;
        $str .= "(";

        $op2 = "";
        for ($k=0; $k<count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)

            // SQL Injection 방지
            // 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다.
            $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? $field[$k] : "wr_subject";

            $str .= $op2;
            switch ($field[$k]) {
                case "mb_id" :
                case "wr_name" :
                    $str .= " $field[$k] = '$s[$i]' ";
                    break;
                case "wr_hit" :
                case "wr_good" :
                case "wr_nogood" :
                    $str .= " $field[$k] >= '$s[$i]' ";
                    break;
                // 번호는 해당 검색어에 -1 을 곱함
                case "wr_num" :
                    $str .= "$field[$k] = ".((-1)*$s[$i]);
                    break;
                case "wr_ip" :
                case "wr_password" :
                    $str .= "1=0"; // 항상 거짓
                    break;
                // LIKE 보다 INSTR 속도가 빠름
                default :
                    if (preg_match("/[a-zA-Z]/", $search_str))
                        $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";
                    else
                        $str .= "INSTR($field[$k], '$search_str')";
                    break;
            }
            $op2 = " or ";
        }
        $str .= ")";

        $op1 = " $search_operator ";
    }
    $str .= " ) ";
    if ($not_comment)
        $str .= " and wr_is_comment = '0' ";

    return $str;
}​

현재 그누보드에서 사용하고있는 검색함수네요 제가볼땐 select명자체가 다른데 원본수정을하지않는한 불가하지않을까하네요??list.skin.php를 더럽게 코딩하지않는한요 실력이 딸려서 죄송합니다 조그마한 도움이되셨으길

소중한 답변 감사드립니다. (__

이게 원본을 건드리지 않고 스킨속 list.skin.php 내에 삽입된거라서 이 곳에서 해결하고 싶은데 잘 되질 않네요.

지금 다른 방법을 찾고 있는데....

        <select name="search_sel" id="search_sel">
            <option value="wr_subject">제목내 검색</option>                   <!-- 제목 -->
            <option value="wr_content">내용내 검색</option>                   <!-- 내용 -->​

            <option value="wr_subject||wr_content">주소+내용</option>  <=이 부분은 동작하고요

            <option value="wr_subject||wr_26">주소+내용</option> <=이 부분이 동작하질 않아요 ㅠㅠ

여기에서 해답을 찾으려고 하는 중입니다.

혹시 글 보시게 되면 힌트 알려주시면 감사하겠습니다. ㅠㅠ

소중한 글 봐주셔셔 감사합니다.

검색을 같이하려면 bbs/list.php에가셔서

wr_26 name값을 받아서

if(wr_26!=""){$wr_26 = " 1=1 and wr_26 = '".$wr_26."'";}

이부분에

if ($sca || $stx) {
    $sql = " select distinct wr_parent from {$write_table} where {$sql_search} $wr_26 {$sql_order} limit {$from_record}, $page_rows ";
}

이렇게한번해보시겠어요???

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