채택완료

구간 검색 between ~ and 구문이 맞나요?

2020-02-21 (금) 03:06:05 2,570

구간 검색 between ~ and 구문이 맞나요?

wr_3에 있는 데이터 과 wr_4에 있는 데이터 사이를 검색하려고 

합니다. 감사합니다.

=========================================

if ($wr_3 && $wr_4)
    $sql_search .= " and wr_3 between '{$wr_3}' and '{$wr_4}' ";

======================================

|

답변 7개 / 댓글 7개

채택된 답변
+20 포인트
2020-02-21 (금) 10:27:33

bbs list.php

1번 수정

// 분류 선택 또는 검색어가 있다면
$stx = trim($stx);
if ($sca || $stx || $t_start || $t_end || count($arr_search) > 0) {
    
        $se_arr = array();
        $se_arr = $arr_search;

        if ($sca || $stx || count($arr_search) > 0)
          $sql_search = get_sql_search3($sca, $sfl, $stx, $sop, $se_arr);

        if ($t_start || $t_end) {
          if ($sql_search)
            $sql_search .= " and wr_1 >= '$t_start' && wr_1 <= '$t_end'";
          else
            $sql_search = " wr_1 >= '$t_start' && wr_1 <= '$t_end'";
        }

    // 가장 작은 번호를 얻어서 변수에 저장 (하단의 페이징에서 사용)
    $sql = " select MIN(wr_num) as min_wr_num from {$write_table} ";
    $row = sql_fetch($sql);
    $min_spt = (int)$row['min_wr_num'];

    if (!$spt) $spt = $min_spt;

    $sql_search .= " and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) ";

     // 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
    // 라엘님 제안 코드로 대체 http://sir.kr/g5_bug/2922

    $sql = "SELECT COUNT(DISTINCT `wr_parent`) AS `cnt` FROM {$write_table} WHERE {$sql_search} ";
    $row = sql_fetch($sql);
    $total_count = $row['cnt'];
 
} 

2번수정

if ($sst) {
    $sql_order = " order by {$sst} {$sod} ";
}

if($_GET[sst] == "wr_9"){
    $sql_order = " order by wr_9 asc ";
}
if ($sca || $stx || $t_start || $t_end || count($arr_search) > 0) {
    if ($sca || $stx || count($arr_search) > 0)
      $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows ";
    if ($t_start || $t_end) {
       $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows ";
    }     

    
} 

3번 수정

// 페이지의 공지개수가 목록수 보다 작을 때만 실행
if($page_rows > 0) {
    $result = sql_query($sql);

    $k = 0;

    while ($row = sql_fetch_array($result))
    {
        

        if ($sca || $stx || $t_start || $t_end || count($arr_search) > 0) {
            if ($sca || $stx || count($arr_search) > 0)
              $row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' ");
            if ($t_start || $t_end) {
               $row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' ");
            }     
             
        } 
        
        $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']);
        if (strstr($sfl, 'subject')) {
            $list[$i]['subject'] = search_font($stx, $list[$i]['subject']);
        }
        $list[$i]['is_notice'] = false;
        $list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
        $list[$i]['num'] = $list_num - $k;

        $i++;
        $k++;
    }
}

list.skin.php

<input class="list_input2" style="width:100px" autocomplete="off" type="t_start" id="t_start" name='t_start'  value='<?=$t_start?>'  placeholder="시작일" >-
                <input class="list_input2" style="width:100px" autocomplete="off" type="t_end" id="t_end" name='t_end' value='<?=$t_end?>' placeholder="종료일"> 

전 날짜로 넣었는데 수정해서 사용하시면 될꺼같네요

a~b 사이에 있는 애들 검색하는 부분입니다.

여분필드 wr_1 기준입니다.

답변에 대한 댓글 1개

퍼블리규님, 답변 감사합니다.
연구해볼께요.^^

톤수 정보는 어디에 들어있나요?

톤수를 wr_3,wr_4로 범위를 넘기시는거 같은데

실제 DB에 저장된 톤수정보의 대상은 무엇인지 모호하네요

SELECT 태그의 wr_3,4 로 넘기는 범위의 이름이 

실제 db에도 그렇게 들어가 있다면

다중 필드를 검색해야 합니다만

그런것 같진 않아보이구요

db에 톤수정보가 들어간 필드 between 넘겨받은 wr_3 and 넘겨받은 wr_4 

의 구조가 되면 범위는 맞습니다

답변에 대한 댓글 2개

아래의 부분을 bbs/list.php 에 넣었습니다.
맞나요?

if ($wr_3 && $wr_4)
$sql_search .= " and ( wr_3 >= '$wr_3' and wr_4 <= '$wr_4' ) ";
bbs/list.php 에 이렇게도 넣어보았습니다.
작동을 안해요.

if ($wr_3 && $wr_4)
$sql_search .= " and wr_8 between '{$wr_3}' and '{$wr_4}' ";

여담이지만 and wr_3 between 문장이 보이지 않는 걸로 봐서

if 구문이 동작하지 않은거 같습니다.

if 안의 문장이 참인지 검증을 하셔야 할거 같고...

그전에 wr_3, wr_4 값이 잘 넘어 왔는지 부터 확인해 보셔야 할 거 같습니다.

답변에 대한 댓글 1개

as12as님 답변 감사합니다.
항상 낮은 자세에서 배우겠습니다.
제가 배우는 것이 너무 느려서요.
모든 분들께 항상 감사드립니다.^^

echo $sql; 했습니다. 아래와 같은 메시지가 나오네요. ㅠㅠ

SELECT COUNT(DISTINCT `wr_parent`) AS `cnt` FROM g55419_write_consult_buying WHERE wr_3 like '%1%' and wr_4 like '%5%' and (wr_num between -1 and (-1 + 10000))

답변에 대한 댓글 1개

echo $sql; 결과인 문장상의 이상은 없어 보입니다.
원하시는 구간 관련 문장이
wr_num between -1 and (-1+10000) 인가요?
아마도 아니지 싶습니다.
-1과 (-1+10000) 부분에 님께서 원하시는 구간의 값들이 들어가야
정상적인 결과를 얻을 수 있을 겁니다.

애석하게도 여기까지입니다.
더 이상은 직접 만들어 드리는 것과 다름이 없습니다.
아마도 냑에서 어느 누구도 그냥은 만들어 주시지 않을겁니다.
시간이 남아도는 맘 좋은 분이 있다면 또 모를까요?

답답하고 고생스럽고 스트레스 쌓이는 그 심정 이해 합니다.

하지만 때로는 그런 것들과 다른 사람의 노력에 대한 댓가와 저울질 해야 하는 때가 있습니다.
제가 보기엔 지금이 그 때인거 같구요.

냑에 가입하신지도 오래 되신거 같습니다.
언젠가는 해결이 될지도 모르겠지만 그 언젠가가 언제가 될지 걱정이 됩니다.
부디 좋은 판단을 하시길 바랍니다.
오지랖을 너무 떤거 같습니다. 오해 없으셨으면 하고 기분 상하는일 없으셨음 합니다.
그래도 기분이 좋지 않으시다면
먼저 사과 드립니다.
2020-02-21 (금) 03:58:23

질문을 정확히 하시면 답변하시는분도 이해가 좋을거같네요

이렇게 하시면 되겠네요.

if ($wr_3 && $wr_4) 
    $sql_search .= " and ( wr_3 >= '$wr_3' and wr_4 <= '$wr_4' ) ";

답변에 대한 댓글 1개

날고픈쭈니님, 답변 감사합니다.

bbs/list.php 에 넣었습니다.

if ($wr_3 && $wr_4)
$sql_search .= " and ( wr_3 >= '$wr_3' and wr_4 <= '$wr_4' ) ";

그런데 작동을 안합니다. 제가 list.skin.php 의 폼에서 무엇을 잘못 했나요?

========================================================
<form name="fsearch" method="get" class="mbr-form form-with-styler" data-form-title="Form Name">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="sop" value="and">
<label for="sfl" class="sound_only">검색대상</label>


<div data-for="wr_3" class="col-lg-6 col-md-12 col-sm-12 form-group">
<select name="wr_3" data-form-field="wr_3" class="form-control display-7" id="wr_3" onchange="detailSearchTon(this.value);">

<option value="">톤수선택부터</option>
<option value='1'>1톤</option>
<option value='1.2'>1.2톤</option>
<option value='2.5'>2.5톤</option>
<option value='3.5'>3.5톤</option>

</select>
<script>$("#wr_3").val("<?=$_GET[wr_3]?>")</script>


<select name="wr_4" data-form-field="wr_4" class="form-control display-7" >

<option value="">톤수선택까지</option>
<option value='1'>1톤</option>
<option value='1.2'>1.2톤</option>
<option value='2.5'>2.5톤</option>
<option value='3.5'>3.5톤</option>


<div class="col-auto">
<button type="submit" class="btn btn-primary display-7" id="btn05">Submit</button>
</div>


<script>

function detailSearchTon(value) {
if(value == "") {
document.getElementsByName("wr_4")[0].value = "";
return;
}
if(value == 99) {
document.getElementsByName("wr_4")[0].value = 99;
return;
}
var obj = document.getElementsByName("wr_4")[0];
for(var i = 0; i < obj.length; i ++) {
if(obj[i].value == value) {
if(value != 4.5) obj[i].selected = true;
else obj[i + 7].selected = true;
return;
}
}
}

function detailSearchYM(key, value) {
var sYear = Math.round(document.getElementsByName("eight11")[0].value);
var eYear = Math.round(document.getElementsByName("eight12")[0].value);
if(key == 1) { // 시작년
if(sYear > eYear) eYear = sYear;
} else if(key == 3) { // 종료년
if(!sYear) sYear = eYear;
if(sYear > eYear) sYear = eYear;
}
document.getElementsByName("eight11")[0].value = sYear;
document.getElementsByName("eight12")[0].value = eYear;
}

</script>

답변 감사합니다. 안되네요.

혹시 이렇게 해도 되나요?

if ($wr_3 && $wr_4)
    $sql_search .= " and wr_3 between 1 and 99 ";

답변에 대한 댓글 1개

$sql_search 를 따라 가시다 보면
$sql 을 만나시게 될 겁니다.
보통은 'echo $sql;' 로 확인해서 구문상의 이상 유무를 확인하는데요.
쿼리문에 대한 기본 지직이 없으시다면
바로 아래 보면 'sql_query($sql);' 이 보이실겁니다.
이것에다가 오류를 보기 위해 'true' 를 추가해 주세요.
[code]
sql_query($sql, true);
[/code]
그러면 해당 구문에 오류가 보일겁니다.
그 오류를 들고 질답방에 질문을 올려 보세요.
아마도 답변 받는데 무리가 없을 겁니다.

네 맞습니다.  제가 알려 드렸는데요.  안됩니까?

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