··조회 31,068
흠 번호
번호가 1번으로 안나오고 11번부터 시작 하는 거라서 질문이요
어떤 건지 몰라서 list, view 둘 다 올립니다.
list.php
<?
//db에 연결하는 부분입니다. 항상 반복 되는 부분이니 꼭 암기!!
mysql_connect("localhost","phpbbs","phpbbs") or die(mysql_error());
mysql_select_db("itmembers");
//게시판 목록 보기에 필요한 각종 변수 초기값을 설정
$tablename="bbs";//테이블 이름
if($page=='') $page=1;//페이지 번호가 없다면 1
$list_num=10;//한페이지에 보여줄 목록 갯수
$page_num=10;//한화면에 보여줄 페이지 링크(묶음) 개수
$offset=$list_num*($page-1);//한 페이지의 시작 글 번호(listnum수만큼 나누었을 떄 시작하는 글의 번호
//전체 글 수를 구한다.(쿼리문을 사용 결과를 배열로 저장하는 일반적인 방법)
$query="select count(*) from $tablename";//bbs 테이블의 레코드 수를 구하는 쿼리문을 $query 변수에 저장한 것입니다.
$result=mysql_query($query) or die(mysql_error());//위의 쿼리문을 실행하여 결과를 result에 대입,실패하면 에러 메시지 표시
$row=mysql_fetch_row($result);//$row=mysql_fetch_row($result); 와 같이 하였다면,$row[0]에 실행 결과의 처음 값이 들어가겠죠. 15행의 쿼리 결과는 전체 레코드 수를 구하는 것이므로 하나의 값만 리턴하게 되므로 결국 $row[0]의 값만 있으면 되는 겁니다. 만약 24행에서의 같은 쿼리라면 그 결과로 $row[0], $row[1], $row[2]... 와 같이 차례대로 저장이 될 것입니다. 단 이 함수는 하나의 레코드에에만 해당되므로 여러 레코드의 결과 값을 차례대로 얻을려면 레코드 수만큼 반복해야 합니다.63행은 보면 while 문을 사용하여 레코드 수만큼 반복하여 그 결과값을 배열로 저장하는 예가 되겠습니다.
$total_no=$row[0];//배열의 첫번째 요소의 값, 즉 테이블의 전체 글 수를 저장!
//전체 페이지 수와 현재 글 번호를 구한다.
$total_page=ceil($total_no/$list_num);//전체 글수를 페이지당 글수로 나눈 값의 올림값을 구함..즉 전체 글 수가 55개라면, 55/10 = 5.5 이므로 올림 수이니까 6이 되겠죠.즉 55개의 글을 모두 표시하려면 6페이지가 필요하다는 겁니다.
$cur_num=$total_no-$list_num*(page-1);//현재 글 번호
//bbs테이블에서 목록을 가져 옵니다.(위의 쿼리문 사용예와 비슷!
$query="select * from $tablename order by number desc limit $offset, $list_num";//bbs 테이블에서 모든 것을 불러오되, number 필드(컬럼)를 기준으로 내림차순으로 정렬하여 표시하라는 문장입니다. 단 $offset 행부터 $list_num 개만큼 불러오라는 뜻입니다. $offset 변수에는 한 페이지의 시작 글 번호가 저장되어 있고, $list_num에는 한 페이지에 표시할 목록의 개수가 저장되어 있습니다.
$result=mysql_query($query) or die(mysql_error());//쿼리문을 실행 결과
//쿼리 결과를 하나씩 불러와 실제 html에 나타내는 것은 html문 중간에 삽입!
?>
<html>
<head>
<meta http-equiv=content-type content=text/htm; charset=euc-kr>
<title>글목록 보기</title>
<STYLE TYPE=text/css>
BODY,TD,SELECT,input,div,form,TEXTAREA,center,option,pre,blockqute{font-family:굴림;font-size:9pt;color:#555555;}
A:link {color:black;text-decoration:none;}
A:active{color:black;text=decoration:none;}
A:hover{color:gray;text-decoration:none;}
</STYLE>
</head>
<body background=/image/body_bg.gif>
<img src=./images/maintitle.gif>
<table border=1 cellspacing=0 width=680 bordercolordark=white bordercolorlight=#999999>
<tr>
<td width=30 bgcolor=#CCCCC>
<p align=center>no</p>
</td>
<td bgcolor=#CCCCC width=490>
<p align=center> subject</p>
</td>
<td width=60 bgcolor=#CCCCC>
<p align=center>name</p>
</td>
<td width=80 bgcolor=#CCCCC>
<p align=center>date</p>
</td>
<td width=30 bgcolor=#CCCCC>
<p align=center>hit</p>
</td>
</tr>
<?
while($array=mysql_fetch_array($result))//mysql_fetch_array() 함수는 전 시간에 다루었던 mysql_fetch_row()와 마찬가지로 쿼리의 결과를 배열 형태로 <u>한 줄씩</u> 리턴하는 기능을 합니다.
{
$date=date("Y/m/d",$array[writetime]);//$array[wirtetime]의 값을 년(Y)/월(m)/일(d)의 형태로 표시하라는 뜻입니다.
echo"
<tr>
<td width=30>
<p align=center>$cur_num</p>
</td>
<td width=490>
<p><a href='view.php?page=$page=$page&number=$array[number]'>$array[subject]</p>
</td>
<td width=60>
<p align=center>$array[name]</p>
</td>
<td width=70>
<p align=center>$date</p>
</td>
<td width=30>
<p align=center>$array[count]</p>
</td>
</tr>";
$cur_num--;
}
?>
<tr>
<td width=100% colspan=5>
<?
//여기서 부터 각종 페이지 링크>
//먼저 한 화면에 보이는 블록($page_num 기본값 이상일 때 블록으로 나뉘어짐)
$total_block=ceil($total_page/$page_num);//게시판 전체 블록수를 구하는 법
$block=ceil($page/$page_num);//현재 블록
$first=($block-1)*$page_num;//페이지 블록이 시작되는 첫 페이지
$last=$block*$page_num;//페이지 블록의 끝 페이지
if($block>=$total_block){
$last=$total_page;
}
echo"
$nbs <p align=center>";
//[처음][*개앞]
if($block>1){
$prev=$first-1;
echo"<a href=list.php?page=1>[처음],</a> ";
echo"<a href=list.php?page=$prev>[$page_num 개 앞]</a>";
}
//[이전]
if($page>1){
$go_page=$page-1;
echo"<a href='list.php?page=$go_page'>[이전]</a> ";
}
//페이지 링크
for($page_link=$first+1;$page_link<=$last;$page_link++){
if($page_link==$page){
echo"<font color=green><b>$page_link</b></font>";
}
else{
echo"<a href='list.php?page=$page_link'>[$page_link]</a>";
}
}
//다음
if($total_page>$page){
$go_page=$page+1;
echo" <a href='list.php?page=$go_page'>[다음]</a>";
}
//[*개뒤][마지막]
if($block<$total_block){
$next=$last+1;
echo",a href='list.php?page=$next'>[$page_num 개 뒤]</a> ";
echo"<a href='list.php?page=$total_page'>[마지막]</a></p>";
}
?>
</td>
</tr>
<tr>
<td width=100% colspan=5>
<p align=center><a href='write.php'>[글쓰기]</a></p>
</td>
</tr>
</table>
</body>
</html>
view.php
<?
mysql_connect("localhost","phpbbs","phpbbs") or die(mysql_error());
mysql_select_db("itmembers");
$tablename="bbs";
$query="select * from $tablename where number='$number'";//글번호를 가지고 조회를 한다.
$result=mysql_query($query) or die(mysql_error());
$array=mysql_fetch_array($result);
//백슬러쉬 제거, 특수문자 변환(html용),개형(<br>처리 등
$array[name]=stripslashes($array[name]);
$array[subject]=stripslashes($array[subject]);
$array[memo]=stripslashes($array[memo]);
$array[subject]=htmlspecialchars($array[subject]);
$array[memo]=htmlspecialchars($array[memo]);
$array[memo]=nl2br($array[memo]);
//조회수 카운터 증가
$query="update $tablename set count=count+1 where number=$number";
mysql_query($query);
?>
<html>
<head>
<title>PHP게시판 프로젝트-보기></title>
<STYLE TYPE="text/css">
BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote{font-family:굴림;font-size:9pt;color:#555555;}
A:link {color:black;text-decoration:none;}
A:visited{color:black;text-decration:none;}
A:active{color:black;text-decoration:none;}
A:hover{color:gray;text-decoration:none;}
</STYLE>
</head>
<body bgcolor=white background=./images/body_bg.gif>
<img src=./images/maintitle.gif>
<table border=0 cellspacing=1 cellpadding="3" width=670>
<tr>
<td align=center>
<font color=green><b>내용보기 화면입니다.<b></font>
</td>
</tr>
<tr>
<td bgcolor="#EAC3EA">
<table border=0 cellspacing=1 cellpadding=0 width=670 bgcolor="white">
<tr>
<td width="100">
<p align="right"><b>이름 </b></p>
</td>
<td width="400">
<p><? echo $array[name];?></p>
</td>
<td width="100">
<p align="right"><b>조회수 </b><p>
</td>
<td>
<p><? echo $array[count];?></p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>전자우편 </b></p>
</td>
<td colspan="3"
<p><? echo $array[email];?></p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>홈페이지 </b></p>
</td>
<td colspan="3">
<p><? echo $array[homepage];?> </p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>제목 ></b></p>
</td>
<td colspan="3">
<p><? echo $array[subject];?></p>
</td>
</tr>
<tr>
<td width="100">
<a align="right"><b>내용 </b></p>
</td>
<td colspan="3">
<p><? echo $array[memo]?></p>
</td>
</tr>
</table>
<p align="center"><a href="list.php?page=<?echo $page; ?>">[목록]</a> [쓰기] [수정] [삭제]</p>
</td>
</tr>
</table>
<body>
</html>
-------------------------------------------------
에고, 빠른 답변 감사드립니다.
제가 " 빼먹어서 안되었군요. 그거 때문에 2시간을 허비했습니다. 철푸덕@_@;;;
그리고 학원에서 이번달 수업 내용이 홈페이지 만들기라서 모르는 php문을 열심히 보고 있는데요.
사이트를 보다 보면 보안에 대한 이야기가 많더라고요.
현재 제가 지금 열심히 짜고 있는 건 회원 가입 부분인데요.
예를 들어서 사이트 주소가 aa.co.k/ 이라고 하면
/~~~~ 이 뒤에 게시판이나 내용 보면 엄청나게 길게 나오지 않습니까.
근데 전 / 이 뒤에 부분을 모두 없애고 언제나 어디서나(...) 도메인 주소만 보이게 하고 싶거든요. 어떻게 하면 그렇게 될까요. 어떤 분 말씀으로는 히든을 사용하라고 하는데......
에고... 모르는게 있으면 언제나 올리겠습니다@_@;;
엄청 귀찮게 해드릴 것 같네요(....)
어떤 건지 몰라서 list, view 둘 다 올립니다.
list.php
<?
//db에 연결하는 부분입니다. 항상 반복 되는 부분이니 꼭 암기!!
mysql_connect("localhost","phpbbs","phpbbs") or die(mysql_error());
mysql_select_db("itmembers");
//게시판 목록 보기에 필요한 각종 변수 초기값을 설정
$tablename="bbs";//테이블 이름
if($page=='') $page=1;//페이지 번호가 없다면 1
$list_num=10;//한페이지에 보여줄 목록 갯수
$page_num=10;//한화면에 보여줄 페이지 링크(묶음) 개수
$offset=$list_num*($page-1);//한 페이지의 시작 글 번호(listnum수만큼 나누었을 떄 시작하는 글의 번호
//전체 글 수를 구한다.(쿼리문을 사용 결과를 배열로 저장하는 일반적인 방법)
$query="select count(*) from $tablename";//bbs 테이블의 레코드 수를 구하는 쿼리문을 $query 변수에 저장한 것입니다.
$result=mysql_query($query) or die(mysql_error());//위의 쿼리문을 실행하여 결과를 result에 대입,실패하면 에러 메시지 표시
$row=mysql_fetch_row($result);//$row=mysql_fetch_row($result); 와 같이 하였다면,$row[0]에 실행 결과의 처음 값이 들어가겠죠. 15행의 쿼리 결과는 전체 레코드 수를 구하는 것이므로 하나의 값만 리턴하게 되므로 결국 $row[0]의 값만 있으면 되는 겁니다. 만약 24행에서의 같은 쿼리라면 그 결과로 $row[0], $row[1], $row[2]... 와 같이 차례대로 저장이 될 것입니다. 단 이 함수는 하나의 레코드에에만 해당되므로 여러 레코드의 결과 값을 차례대로 얻을려면 레코드 수만큼 반복해야 합니다.63행은 보면 while 문을 사용하여 레코드 수만큼 반복하여 그 결과값을 배열로 저장하는 예가 되겠습니다.
$total_no=$row[0];//배열의 첫번째 요소의 값, 즉 테이블의 전체 글 수를 저장!
//전체 페이지 수와 현재 글 번호를 구한다.
$total_page=ceil($total_no/$list_num);//전체 글수를 페이지당 글수로 나눈 값의 올림값을 구함..즉 전체 글 수가 55개라면, 55/10 = 5.5 이므로 올림 수이니까 6이 되겠죠.즉 55개의 글을 모두 표시하려면 6페이지가 필요하다는 겁니다.
$cur_num=$total_no-$list_num*(page-1);//현재 글 번호
//bbs테이블에서 목록을 가져 옵니다.(위의 쿼리문 사용예와 비슷!
$query="select * from $tablename order by number desc limit $offset, $list_num";//bbs 테이블에서 모든 것을 불러오되, number 필드(컬럼)를 기준으로 내림차순으로 정렬하여 표시하라는 문장입니다. 단 $offset 행부터 $list_num 개만큼 불러오라는 뜻입니다. $offset 변수에는 한 페이지의 시작 글 번호가 저장되어 있고, $list_num에는 한 페이지에 표시할 목록의 개수가 저장되어 있습니다.
$result=mysql_query($query) or die(mysql_error());//쿼리문을 실행 결과
//쿼리 결과를 하나씩 불러와 실제 html에 나타내는 것은 html문 중간에 삽입!
?>
<html>
<head>
<meta http-equiv=content-type content=text/htm; charset=euc-kr>
<title>글목록 보기</title>
<STYLE TYPE=text/css>
BODY,TD,SELECT,input,div,form,TEXTAREA,center,option,pre,blockqute{font-family:굴림;font-size:9pt;color:#555555;}
A:link {color:black;text-decoration:none;}
A:active{color:black;text=decoration:none;}
A:hover{color:gray;text-decoration:none;}
</STYLE>
</head>
<body background=/image/body_bg.gif>
<img src=./images/maintitle.gif>
<table border=1 cellspacing=0 width=680 bordercolordark=white bordercolorlight=#999999>
<tr>
<td width=30 bgcolor=#CCCCC>
<p align=center>no</p>
</td>
<td bgcolor=#CCCCC width=490>
<p align=center> subject</p>
</td>
<td width=60 bgcolor=#CCCCC>
<p align=center>name</p>
</td>
<td width=80 bgcolor=#CCCCC>
<p align=center>date</p>
</td>
<td width=30 bgcolor=#CCCCC>
<p align=center>hit</p>
</td>
</tr>
<?
while($array=mysql_fetch_array($result))//mysql_fetch_array() 함수는 전 시간에 다루었던 mysql_fetch_row()와 마찬가지로 쿼리의 결과를 배열 형태로 <u>한 줄씩</u> 리턴하는 기능을 합니다.
{
$date=date("Y/m/d",$array[writetime]);//$array[wirtetime]의 값을 년(Y)/월(m)/일(d)의 형태로 표시하라는 뜻입니다.
echo"
<tr>
<td width=30>
<p align=center>$cur_num</p>
</td>
<td width=490>
<p><a href='view.php?page=$page=$page&number=$array[number]'>$array[subject]</p>
</td>
<td width=60>
<p align=center>$array[name]</p>
</td>
<td width=70>
<p align=center>$date</p>
</td>
<td width=30>
<p align=center>$array[count]</p>
</td>
</tr>";
$cur_num--;
}
?>
<tr>
<td width=100% colspan=5>
<?
//여기서 부터 각종 페이지 링크>
//먼저 한 화면에 보이는 블록($page_num 기본값 이상일 때 블록으로 나뉘어짐)
$total_block=ceil($total_page/$page_num);//게시판 전체 블록수를 구하는 법
$block=ceil($page/$page_num);//현재 블록
$first=($block-1)*$page_num;//페이지 블록이 시작되는 첫 페이지
$last=$block*$page_num;//페이지 블록의 끝 페이지
if($block>=$total_block){
$last=$total_page;
}
echo"
$nbs <p align=center>";
//[처음][*개앞]
if($block>1){
$prev=$first-1;
echo"<a href=list.php?page=1>[처음],</a> ";
echo"<a href=list.php?page=$prev>[$page_num 개 앞]</a>";
}
//[이전]
if($page>1){
$go_page=$page-1;
echo"<a href='list.php?page=$go_page'>[이전]</a> ";
}
//페이지 링크
for($page_link=$first+1;$page_link<=$last;$page_link++){
if($page_link==$page){
echo"<font color=green><b>$page_link</b></font>";
}
else{
echo"<a href='list.php?page=$page_link'>[$page_link]</a>";
}
}
//다음
if($total_page>$page){
$go_page=$page+1;
echo" <a href='list.php?page=$go_page'>[다음]</a>";
}
//[*개뒤][마지막]
if($block<$total_block){
$next=$last+1;
echo",a href='list.php?page=$next'>[$page_num 개 뒤]</a> ";
echo"<a href='list.php?page=$total_page'>[마지막]</a></p>";
}
?>
</td>
</tr>
<tr>
<td width=100% colspan=5>
<p align=center><a href='write.php'>[글쓰기]</a></p>
</td>
</tr>
</table>
</body>
</html>
view.php
<?
mysql_connect("localhost","phpbbs","phpbbs") or die(mysql_error());
mysql_select_db("itmembers");
$tablename="bbs";
$query="select * from $tablename where number='$number'";//글번호를 가지고 조회를 한다.
$result=mysql_query($query) or die(mysql_error());
$array=mysql_fetch_array($result);
//백슬러쉬 제거, 특수문자 변환(html용),개형(<br>처리 등
$array[name]=stripslashes($array[name]);
$array[subject]=stripslashes($array[subject]);
$array[memo]=stripslashes($array[memo]);
$array[subject]=htmlspecialchars($array[subject]);
$array[memo]=htmlspecialchars($array[memo]);
$array[memo]=nl2br($array[memo]);
//조회수 카운터 증가
$query="update $tablename set count=count+1 where number=$number";
mysql_query($query);
?>
<html>
<head>
<title>PHP게시판 프로젝트-보기></title>
<STYLE TYPE="text/css">
BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote{font-family:굴림;font-size:9pt;color:#555555;}
A:link {color:black;text-decoration:none;}
A:visited{color:black;text-decration:none;}
A:active{color:black;text-decoration:none;}
A:hover{color:gray;text-decoration:none;}
</STYLE>
</head>
<body bgcolor=white background=./images/body_bg.gif>
<img src=./images/maintitle.gif>
<table border=0 cellspacing=1 cellpadding="3" width=670>
<tr>
<td align=center>
<font color=green><b>내용보기 화면입니다.<b></font>
</td>
</tr>
<tr>
<td bgcolor="#EAC3EA">
<table border=0 cellspacing=1 cellpadding=0 width=670 bgcolor="white">
<tr>
<td width="100">
<p align="right"><b>이름 </b></p>
</td>
<td width="400">
<p><? echo $array[name];?></p>
</td>
<td width="100">
<p align="right"><b>조회수 </b><p>
</td>
<td>
<p><? echo $array[count];?></p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>전자우편 </b></p>
</td>
<td colspan="3"
<p><? echo $array[email];?></p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>홈페이지 </b></p>
</td>
<td colspan="3">
<p><? echo $array[homepage];?> </p>
</td>
</tr>
<tr>
<td width="100">
<p align="right"><b>제목 ></b></p>
</td>
<td colspan="3">
<p><? echo $array[subject];?></p>
</td>
</tr>
<tr>
<td width="100">
<a align="right"><b>내용 </b></p>
</td>
<td colspan="3">
<p><? echo $array[memo]?></p>
</td>
</tr>
</table>
<p align="center"><a href="list.php?page=<?echo $page; ?>">[목록]</a> [쓰기] [수정] [삭제]</p>
</td>
</tr>
</table>
<body>
</html>
-------------------------------------------------
에고, 빠른 답변 감사드립니다.
제가 " 빼먹어서 안되었군요. 그거 때문에 2시간을 허비했습니다. 철푸덕@_@;;;
그리고 학원에서 이번달 수업 내용이 홈페이지 만들기라서 모르는 php문을 열심히 보고 있는데요.
사이트를 보다 보면 보안에 대한 이야기가 많더라고요.
현재 제가 지금 열심히 짜고 있는 건 회원 가입 부분인데요.
예를 들어서 사이트 주소가 aa.co.k/ 이라고 하면
/~~~~ 이 뒤에 게시판이나 내용 보면 엄청나게 길게 나오지 않습니까.
근데 전 / 이 뒤에 부분을 모두 없애고 언제나 어디서나(...) 도메인 주소만 보이게 하고 싶거든요. 어떻게 하면 그렇게 될까요. 어떤 분 말씀으로는 히든을 사용하라고 하는데......
에고... 모르는게 있으면 언제나 올리겠습니다@_@;;
엄청 귀찮게 해드릴 것 같네요(....)
댓글 2
그래서 list.php를 주~욱 봤는데요,
$cur_num=$total_no-$list_num*(page-1);//현재 글 번호
이 부분에서 오타가 났네요.
page → $page
이럴 경우 매 페이지마다 동일한 글 번호가 나타납니다.
그 외에도 오타가 조금씩 있는 것 같습니다만, 프로그램에 결정적인 영향을 미치는 것은 $page 변수 오타인 것 같네요.
아래와 같은 오타도 있는 것 같구요...
echo",a href='list.php?page=$next'>[$page_num 개 뒤]</a> ";
여기서는 쉼표(,) 대신 <를 써야할 것 같구요...
FORM 태그에서 method="get"을 method="post"로 바꾸어서 사용하면 됩니다.
히든으로 처리한다는 것은,
<input type="hidden" name="xxxx" value="oooo">와 같은 식으로 소스 중간에 집어넣고, FORM 태그에서 method="post"로 지정하라는 것입니다.
그러나 이렇게 하면 웹 브라우저의 주소 표시줄에 복잡한 문자(이걸 query string이라고 하는데요...), 이게 보이지 않아서 좋기는 하지만, 프로그램을 짤 때 불편할 경우가 있습니다. 잘 구현이 안될 때도 있구요.
예를 들어 글 목록을 볼 때 현재 페이지에서 다음 페이지로 가기 위해 [다음] 버튼을 눌렀을 때 해당 링크를 처리하려면 get 방식이 매우 편리합니다. post 방식으로 하려면... 못할 거야 없지만 머리를 좀 더 굴려야(?) 됩니다. 대개 그렇게 잘 쓰지 않습니다.