묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
현재의 쿼리문
$sql = "SELECT no, date, name, pin, tel, cel, radiobutton1,age
FROM normal_member
WHERE name LIKE '%$search%' or age like '%$search%'";
위의 쿼리문으로는 이름(name)을 검색하거나 나이(age)를 검색하면 해당 이름과 나이만이 검색이 됩니다
그런데 , 제가 필요한 것은 이름은 상관없지만 나이(age)를 넣었을때 예를 들어 35(세)를 입력했을때
30대가 다 리스팅 되기를 원합니다.
어떤식으로 쿼리문으로 작성해야되는지 부탁드립니당..
아래와 같은 경우에 쿼리문을 어캐 사용해야되는지 궁금합니다.
2003.07.24 15:23
현재의 쿼리문
$sql = "SELECT no, date, name, pin, tel, cel, radiobutton1,age
FROM normal_member
WHERE name LIKE '%$search%' or age like '%$search%'";
위의 쿼리문으로는 이름(name)을 검색하거나 나이(age)를 검색하면 해당 이름과 나이만이 검색이 됩니다
그런데 , 제가 필요한 것은 이름은 상관없지만 나이(age)를 넣었을때 예를 들어 35(세)를 입력했을때
30대가 다 리스팅 되기를 원합니다.
어떤식으로 쿼리문으로 작성해야되는지 부탁드립니당..
댓글 5
-
토끼군
2003.07.24 15:33
-
최강남자킹
2003.07.24 16:08
<?
include ("../connect.php");
// 검색하기
$lower_bound = floor($age / 10) * 10;
$upper_bound = $lower_bound + 9;
$sql = "SELECT no, date, name, pin, tel, cel, radiobutton1,age
FROM normal_member
WHERE name LIKE '%$search%' or age between $lower_bound and $upper_bound";
$result = mysql_query($sql);
// 페이지 초기화
if (empty($page)) $page=1;
// 한화면에 보여줄 회원 수
$per_page = 10;
// 페이지가 1보다 크면 검색 결과내에서 레코드셋 포인터 위치를 이동한다.
if($page > 1) {
$r_point = ($page-1)*$per_page;
mysql_data_seek($result,$r_point);
}
?>
<html>
<head>
<title>회원 관리</title>
<meta http-equiv="CONTENT-TYPE" content="text/html;charset=EUC-KR">
</head>
<body bgcolor=#ffffff>
<style>
body,td{color:#000000;font-size:9pt}
a:link{color:#808080;text-decoration:none}
a:visited{color:gray;text-decoration:none}
a:hover{color:blue;text-decoration:none}
a.bb:link {color:blue;text-decoration:none}
a.bb:visited {color:blue;text-decoration:none}
a.bb:hover {color:red;text-decoration:none}
input{font-size:9pt}
textarea{font-size:9pt}
</style>
<a href="./">관리자 화면으로</a><p>
<center>
<form name=form1 action=./memberlist.php method=get>
검색할 회원의 <font color=red>이름</font>이나 <font color=red>나이</font>를 입력하세요.
<input name=search size=10 value="<? echo $search ?>">
<input type=hidden name=page value=1>
<input type=submit value="조회">
</form>
<table border=1 cellspacing=0 cellpadding=3 width=80%>
<tr>
<td align=right colspan=8>
<?
// 전체 회원 수와 전체 페이지 수
$num = mysql_num_rows($result);
$sumpage = ceil($num/$per_page);
echo "총회원 $num 명 PAGE $page/$sumpage";
?>
</td>
</tr>
<tr bgcolor=#f5f5f5>
<td align=center>번호</td>
<td align=center>성명</td>
<td align=center>전화</td>
<td align=center>핸드폰</td>
<td align=center>나이</td>
<td align=center>상태</td>
<td align=center>회원상세정보</td>
</tr>
<?
// 해당 페이지의 시작 번호와 끝 번호
$count=$r_point+1;
$count_end = $count+$per_page;
while ($row=mysql_fetch_object($result)) {
// 가입일자, 이름에 이메일 링크, 주민등록번적립금호, 데이터 가공
$name = $row->name;
$tel = $row->tel;
$cel = $row->cel;
$age = $row->age;
$radiobutton1 = $row->radiobutton1;
$info = $row->info;
$partner =$row->partner;
echo "<tr>
<td align=center>$count</td>
<td align=center>$name</td>
<td align=center>$tel</td>
<td align=center>$cel</td>
<td align=center>$age</td>
<td align=center>$radiobutton1</td>
<td align=center>
<a href=\"menu.php?action=view&no=$row->no\">자세히</a> |
<a href=\"menu.php?action=delete&no=$row->no\">삭제</a> |
<a href=\"menu.php?action=modify&no=$row->no\">수정</a>
</td>
</tr>\n";
$count++;
if($count==$count_end) break;
}
mysql_free_result($result);
?>
</table>
<table border=0 cellspacing=0 cellpadding=3 width=80%>
<tr>
<td align=center>
<?
$search = urlencode($search);
for($i=1;$i<=$sumpage;$i++)
echo "<a href='./memberlist.php?page=$i&search=$search'>[ $i ]</a>\n";
?>
</td>
</tr>
</table>
</body>
</html> -
최강남자킹
2003.07.24 16:09
토끼군님// 위 페이지의 소스 전부인데요..
에러는 나지 않으나 검색이 되질 않아요..
이름으로도 안되고 나이로도 안되구요.. -
토끼군
2003.07.26 19:21
검색이 되지 않는다는 건 아예 안 나온다는 겁니까? 안 나올 리는 없을텐데.. :-S
혹시 "이름에 $search가 포함되어 있고, 해당 나이대에 포함되는 나이를 가진 사람"을 원하는 거라면 or 대신에 and를 써야 합니다. -
토끼군
2003.07.26 19:22
정말 뭔가 이상한 것 같으시다면 다음 쿼리문을 한 번 써 보세요.
$sql = "SELECT no, date, name, pin, tel, cel, radiobutton1,age FROM normal_member WHERE name LIKE '%$search%' and ($lower_bound<=age and age<=$upper_bound);
먼저 출력 범위를 정해야죠. 이 경우 35가 입력되면 30부터 39까지가 출력되어야 하니까...
<?
$lower_bound = floor($age / 10) * 10;
$upper_bound = $lower_bound + 9;
?>
간단하게 설명해 보겠습니다.
-- floor($age / $scale) * $scale
이라고 하면, $scale 단위로 버림을 합니다.
예를 들어서 $age가 17이고 $scale이 5라면 이 숫자는 15가 됩니다. (무조건 10 단위로 쓸 필요가 없단 얘깁니다;) 이 원리는 직접 생각해 보시면 쉽게 이해할 수 있는데, 힌트 하나를 드리자면 floor 함수는 주어진 숫자를 버림하는 함수입니다.
우리가 보통 부르는 "10대, 20대"와 같은 것은 해당 나이를 10 단위로 버림한 것이라고 생각할 수 있습니다. (39세는 30대지만 40세는 40대지요...) 따라서 floor($age / 10) * 10이라고 하면 $age세가 속하는 세대 숫자가 나올 겁니다.
그리고 (예를 들어) 30대라면 30세부터 39세이므로, 최소값은 floor($age / 10) * 10 그대로 넣고 거기다가 9를 더하면 최대값이 나오겠지요.
여기서 between A and B라는 MySQL의 연산자를 알아 봅시다. 뜻은 단순합니다. A between B and C라는 식은, (A<=B and B<=C)와 같습니다. 즉 B와 C를 포함해서, A가 B와 C사이에 들어 있으면 참(정확히는 1)입니다. 따라서 우리는 다음과 같이 SQL 문을 짤 수 있습니다.
<?
$sql = "SELECT no, date, name, pin, tel, cel, radiobutton1,age
FROM normal_member
WHERE name LIKE '%$search%' or age between $lower_bound and $upper_bound";
?>
물론 앞의 코드로 $lower_bound와 $upper_bound가 계산되어 있어야 겠지요. :-)
덧붙여서 A like '%B%'는 instr(A, 'B')나 locate('+ '+ 'B' in A)로 고치는 것이 좋을 거라고 생각됩니다.
- 토끼군