게시판 등에서 원하는 분량만을 화면에 보이게 하는 방법은 여러 가지가 있습니다.
mysql 같은 DBMS는 웹을 견향해서 만들어 졌다고 해도 과언이 아니겠지만
informix 나 oracle은 꼭 그런것은 아니겠죠! 하지만 php에서 mysql을 위한 seek 함수를 지원한다고 해서 그게 꼭 빠르다고는 할 수 없습니다. 겉보기에는 원하는
내용만을 가져 오는 것 처럼 보이지만 내부적으로는 질의한 결과 전체에서 원하는
부분만을 가져 오는데... 예를 들면 informix 의 select first 20 * from test order by regdate; 이런 질의가 있다면 결국은 전체를 질의로 가져온 후에 20개를 가져 올뿐 실제 20개만을 구해서 가져 오지는 않습니다. 그렇다면 mysql에서 지원하는
seek 함수를 어떻게 프로그래밍 할까요?
구현의 예를 소스로 올려 드릴테니 참조해 보시기 바랍니다.
이를 구현하는 방법이 여러가지 있지만 아래 방법이 일반적인것 같습니다.
==============================================================================
<?
include ("header.inc");
if (!$l_start) { $l_start = 1; } // 전체중 원하는 곳의 seek 값이라고 보면 됩니다.
if (!$l_scale) { $l_scale = 10; } // 리스트의 수를 나타냅니다. 기본이 10 이죠
if (!$l_pscale) { $l_pscale = 10; } // 페이지의 수입니다.
if (!$l_search) { $l_search = ""; } else { $l_search = trim($l_search);} // 검색시에 사용합니다.
?>
<script language="javascript">
function open_mail(frmmail) {
newwindow=open('',"popupnav","location=no,scrollbars=yes,toolbar=no,directories=no,menubar=no,resizable=yes,status=no,screenX=10,screenY=10,width=640,height=480");
frmmail.submit();
}
</script>
<? include ("function.inc"); ?>
</head>
<? include ("connect.inc"); ?>
<body bgcolor='#FFFFFF' margin=5 marginwidth=5 marginheight=5 topmargin=5 leftmargin=5>
<table border = 0 cellspacing = 0 cellpadding = 0 width='620' bgcolor='#F7FAF6'>
<tr>
<td valign='top' align="left" bgcolor='#CBE4C9'>
<?
if ($mode == "psearch" || $l_search) { $mode_type = "S"; } // 파워 서치 결과..
if ($mode == "" && $comp_id == "") { $mode_type = "N"; } // Normal 리스트
if ($mode == "" && $comp_id ) { $mode_type = "E"; } // 회원 Offer정보 리스트
echo "</td></tr><tr><td align = 'center'><br><br>";
$table_name = "trade_offer_" . $l_type;
if($mode_type == "S"){
$query = "SELECT -- + INDEX( trade_company name_c)\n";
}else{
$query = "SELECT -- + INDEX( trade_company list_c)\n";
}
$query .= " comp_id,company,url, regdate , description[1,200]" .
" FROM trade_company WHERE url <> '' and not url is null";
if ($l_big){ $query .= " and big = "$l_big""; }
if ($l_hscode){ $query .= " and hscode[1,2] = "$l_hscode""; }
if ($l_search){ $query .= " and lower(company) like "%" . strtolower($l_search) . "%""; }
$query .= " order by regdate desc";
echo "<table border = 0 cellspacing = 0 cellpadding = 0 width='620'>";
echo "<form>"; // 네스케이프에서는 form 태그가 있어야 버튼이 보이므로....
$result = ifx_prepare($query,$conn_id);
result_prepare($result,$conn_id);
$l_link1 = "<a href =" . $PHP_SELF . "?l_start=";
$l_link2 = "&l_search=" . $l_search . "&l_big=" . $l_big . "&l_type=" . $l_type . "&l_hscode=" . $l_hscode . ">";
$row = ifx_fetch_row($result);
while(is_array($row)){
$l_count = ifx_num_rows($result); // 아래는 원하는 부분만을 화면에 출력함
if ($l_count >= $l_start and $l_count <= $l_start + $l_scale -1){
echo "<tr><td align = 'left'>";
echo "<font color='#CC0000'>" . $l_count . "</font> ";
if($l_type == "C"){
$url = strchr($row[url],"http");
if ($url){
echo "<a href='" . $row["url"] . "' target='_new'><b>" . stripslashes($row["company"]) . "</b></a><br>" . $row["description"] . "...<br><font color = '#196B75' size=1>";
}else{
echo "<a href='http://" . $row["url"] . "' target='_new'><b>" . stripslashes($row["company"]) . "</b></a><br>" . $row["description"] . "...<br><font color = '#196B75' size=1>";
}
}else{
echo "<a href = "view.html?l_comp_id=" . $row["comp_id"] . "&l_no=" . $row["no"] . "&l_type=" . $l_type . "&l_big=" . $l_big . "&l_hscode=" . $l_hscode . "">" .
"<b>" . stripslashes($row["subject"]) . "</b></a><br>" . stripslashes($row["description"]) . "...<br><font color = '#196B75' size=1>";
if ($row["sitecode"] ==''){ echo "[Hand] "; }else{ echo "[Auto] "; }
echo " [Relevance: " . $row["reliability"] ."%] ";
}
echo $row["regdate"] . "</font> ";
echo"<br><br></td></tr>";
}
$row = ifx_fetch_row($result,"NEXT");
}
$l_total = ifx_num_rows($result);
echo ("<TR bgcolor='#CBE4C9' onMouseOver="this.style.backgroundColor='#C4DAFF';return true;" onMouseOut="this.style.backgroundColor='';return true;"><td colspan='4' align='right'>");
if ( $l_total == 0 ){ echo ("<b>Not found data. </b>"); }
echo ("Total: $l_total </td></tr>\n");
ifx_free_result($result);
echo "</table><br>";
echo " <input type='button' value='Back' onclick='javascript:history.back()'></form><br>";
// 여기서 부터는 각 페이지및 페이지의 << >>를 나타냅니다.
if($l_total > $l_scale){
$l_prev = $l_start - $l_scale;
$l_next = $l_start + $l_scale;
$l_page = floor($l_start/($l_scale * $l_pscale));
if ($l_prev >= 1){ echo "[" . $l_link1 . "1" . $l_link2 . "First</a>] "; }
$pre_start = ($l_page - 1) * ($l_scale * $l_pscale) + 1;
if($pre_start >= 1){ echo "[" . $l_link1 . $pre_start . $l_link2 . "Prev Page</a>] "; }
if ($l_prev >= 1){ echo "[" . $l_link1 . $l_prev . $l_link2 . "Prev</a>] "; }
for($vj=0; $vj < $l_pscale ; $vj++){
$ln = ($l_page * $l_pscale + $vj) * $l_scale + 1;
$vk= $l_page * $l_pscale + $vj + 1;
if( $ln < $l_total ){
if($ln != $l_start){
echo " [" . $l_link1 . $ln . $l_link2 . $vk . "</a>]";
}else{
echo " <font color=red>" . $vk . "</font>";
}
}
}
if ($l_next <= ($l_total - $l_scale)){ echo " [" . $l_link1 . $l_next . $l_link2 . "Next</a>]"; }
$n_start=($l_page + 1) * $l_scale * $l_pscale + 1;
if($n_start < $l_total){ echo " [" . $l_link1 . $n_start . $l_link2 . "Next Page</a>]"; }
if ($l_next <= ($l_total - $l_scale)){ echo " [" . $l_link1 . (floor($l_total/$l_scale) * $l_scale + 1) . $l_link2 . "Last</a>]"; }
echo "<br>Current Page : (" . (floor($l_start - 1) / $l_scale + 1) . "/" . round( $l_total / $l_scale ) . ")";
}
?>
</td></tr>
</table>
<? include ("footer.inc"); ?>
|