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

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

QA

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

본문

다중검색질문입니다.

 

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

 

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

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

 


<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>  
         <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

// 검색 구문을 얻는다.
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를 더럽게 코딩하지않는한요 실력이 딸려서 죄송합니다 조그마한 도움이되셨으길

검색을 같이하려면 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 ";
}

 

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

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

이게 원본을 건드리지 않고 스킨속 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> <=이 부분이 동작하질 않아요 ㅠㅠ

 

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

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

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

답변을 작성하시기 전에 로그인 해주세요.
전체 129,672 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT