채택완료

숫자 구간검색 도와주세요.

2021-04-03 (토) 17:53:29 2,411
text1

~

text2

text1과 text2사이의 구간검색을 하려고 합니다.

wr_1의 데이터를 검색하려고 하고 데이터는 숫자로 되어있습니다.

Copy
//여분필드검색 

if($fp && $tp) {
    $sql_search .= " and wr_1 between '".$fp."' and '".$tp."' ";
}

//텍스트박스

<input type="text" name="fp" id="fp" class="width80" value="<?php echo $fp; ?>" />
                  ~
 <input type="text" name="tp" id="tp" class="width80" value="<?php echo $tp; ?>" />

이렇게 되어있는데 검색이 안됩니다. 

왜 안되는건지 알고 싶습니다.

도와주세요.

|

답변 3개 / 댓글 2개

채택된 답변
+20 포인트
2021-04-03 (토) 18:33:49
Copy
같은 값, 예를 들어 wr_1 BETWEEN 1 AND 1 검색이면 wr_1=1 조건과 다를 바 없겠죠?

그러니 범위값을 따로 받아야 합니다.


<input type="text" name="fp1" id="fp1" class="width80" value="<?php echo $fp; ?>" />
~
<input type="text" name="tp2" id="tp2" class="width80" value="<?php echo $tp; ?>" />

 

그누보드에서 $fp1, $fp2 변수 바로 할당해주는지 모르겠군요.

아래처럼 Superglobals 사용하면 됩니다.

 

$sql_search .= " and wr_1 between {$_REQUEST['fp1']} and {$_REQUEST['fp2']} ";

+ $_REQUEST 특성 이해 후 사용. 또는 폼에 맞게 $_GET, $_POST 등의 Superglobals를 사용.

- https://www.php.net/manual/en/reserved.variables.request.php

 

* 참고로 저렇게 곧바로 사용하면 숫자가 아닌 값이 들어올 때 문제가 되니 (SQL Injection)

아래처럼 최소한의 안전 장치를 마련하면 좋습니다. (방법은 다양한데 참고로 한가지 남겨요.)

 

$fp1 = (int)preg_replace('/[^\d]+/', '', $fp1); // \d = 0-9 숫자 ... 숫자가 아닌 모든 문자[열] 제거 후 정수화

$fp2도 마찬가지 처리

답변에 대한 댓글 2개

자세한 답변 감사합니다.
제가 초보라 어디서 어떻게 범위값을 따로 받아야 하는건지 모르겠습니다. ㅜㅜ

if($fp && $tp) {
$sql_search .= " and wr_1 between '".$fp." 0 'and ".$tp." 999999999'";
}

이런식이면 범위값을 받게 되는건가요?
AND wr_1 BETWEEN 시작값 AND 종료값
형태가 되어야 합니다.



처음부터 아래처럼 2개 값을 받아서(위에 Copy&Paste 때문에 변수명 문제가 있었네요)

[code]
<input type="text" name="fp1" id="fp1" class="width80" value="<?php echo $fp1; ?>" />
~
<input type="text" name="tp2" id="tp2" class="width80" value="<?php echo $tp2; ?>" />
[/code]


조회하는 쪽에서 그대로 이용하면 됩니다.

[code]
if ( $fp1 && $fp2 ) {
$sql_search.= " AND wr_1 BETWEEN {$fp1} AND {$fp2}";
}
[/code]


안전을 위해서 $fp1, $fp2 값이 숫자로만 구성되었는지 확인하면 좋습니다.
예를 들어 아래처럼요.
[code]
if ( preg_match('/^\d+$/', $fp1) && preg_match('/^\d+$/', $fp2) ) {
$sql_search.= " AND wr_1 BETWEEN {$fp1} AND {$fp2}";
}
[/code]
2021-04-03 (토) 21:53:18

bbs/list.php에서 변경하신 건가요?

우선 $sca 또는 $stx가 있어야 sql_search 조건을 만들게 됩니다.

if ($sca || $stx || $stx === '0') {     //검색이면
    $is_search_bbs = true;      //검색구분변수 true 지정
    $sql_search = get_sql_search($sca, $sfl, $stx, $sop);

해당 <form에

<inupte type="hidden" name="stx" value="0" />

을 추가해 보세요.

2021-04-03 (토) 18:09:37

해당검색을 어디다가 쓰셨는지 모르겠는데 list.php 에 검색 하는 부분들을 수정해주셔야 합니다. 해당만 검색을 한다면 검색어 없을때도 같이요

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