5. PHP 홈페이지 만들기 프로그램 메뉴 1

2014.07.07 16:07
저자 : Kurien


큰일났습니다...

어디까지 수정한지를 모르겠습니다... ㅋㅋㅋㅋㅋ

일단 Programs 메뉴 부분은 80퍼센트 이상 완성한 것 같네요.


최근에 수정한건 Programs 메뉴와 Layout.inc 파일이 대부분이니 그 두 가지를 설명하겠습니다.


먼저 Programs에 사용될 DB Table을 만들었습니다.


MySQL


create table programs

(no int unsigned auto_increment not null primary key,

id char(16) not null,

pass char(41) not null,

date date not null,

time time not null,

category char(20) not null,

title varchar(50) not null,

content text not null,

link varchar(100) not null,

OS varchar(50) not null,

korean char(1) not null,

image varchar(100) not null,

licence tinyint not null);


뭐가 많네요 ㅋ

순서대로 글 번호, 작성자, 작성자 비밀번호, 날짜, 시간, 카테고리, 제목, 내용, 링크, OS(Windows, Linux, Mac 등),

korean(한국어 지원 여부), 이미지 경로, 라이센스 순으로 있습니다.



나중에 view.php를 만들기 위해 저 많은 열 부분이 필요합니다.

그럼 DB를 사용해서 Programs 부분을 수정하겠습니다.


/programs/index.php


<?php

require_once '../layout.inc';

require_once '../db.php';


$base = new Layout;

$base->link = '../style.css';


$tn=$_GET['tn'];

$onepage=3;


if($_GET['p']==false)

{

$_GET['p']=1;

}


$db = new DBC;

$db->DBI();


if($tn=='') //programs 메인

{

$base->style='

div.left {padding:1%; width:48%;}

div.right { padding:1%; width:48%;}

div.wrap {margin:3% 0; box-sizing:border-box; border:1px solid #ddd; min-height:150px;padding:4%; min-width:300px; width100%;}

div.wrap div {text-align:center;padding:1% 0;}

div.content{margin-top:20px;}

div.paging{text-align:center;}

div.image > div {text-align:center;}

div.image > div  img {min-witdth:300px;width:100%; max-width:100%;}

div.header > h1 {font-size:2em;margin:2% 1%;}

';

$base->content = "<div class='header'><h1>인기 프로그램</h1></div>";

$left = $left."<div class='left' style='float:left'>";

$right = $right."<div class='right' style='float:right'>";

while (list($key, $value) = each($base->pmenu))

{

$db->query = "select no, date, category, title, os, image, licence from programs where category='".$value."' order by no desc limit 0, 1";/* no으로 정렬을 인기순으로 */

$db->DBQ();

$data=$db->result->fetch_row();

switch($data[6])

{

case 1:

$licence='페이웨어';

break;

case 2:

$licence='부분적 프리웨어';

break;

case 3:

$licence='프리웨어';

break;

case 4:

$licence='쉐어웨어';

break;

case 5:

$licence='부분적 쉐어웨어';

break;

default:

$licence='페이지 오류입니다.';

break;

}


if($data!='')

{

if($num==0)

{

$num=1;

$left = $left."

<div class='wrap'>

<div class='image'><div><a href='./view.php?v=".$data[0]."'><img src='.".$data[5]."'/></a></div></div>

<div class='header'><a href='./view?v=".$data[0]."'>".$data[3]."</a></div>

<div class='category'>카테고리 : <a href='./?tn=".$data[2]."'>".$key."</a></div>

<div class='date'>".$data[1]."</div>

<div class='os'>OS : ".$data[4]."</div>

<div class='licence'>라이센스 : ".$licence."</div>

</div>";

} else

{

$num=0;

$right = $right."

<div class='wrap'>

<div class='image'><div><a href='./view.php?v=".$data[0]."'><img src='.".$data[5]."'/></a></div></div>

<div class='header'><a href='./view?v=".$data[0]."'>".$data[3]."</a></div>

<div class='category'>카테고리 : <a href='./?tn=".$data[2]."'>".$key."</a></div>

<div class='date'>".$data[1]."</div>

<div class='os'>OS : ".$data[4]."</div>

<div class='licence'>라이센스 : ".$licence."</div>

</div>";

}

}

}

$left = $left."</div>";

$right = $right."</div>";


$base->content=$base->content.$left.$right."<div style='clear:both'></div>";

} else if($tn=='latest') //latest 부분

{

$db->query = "select count(*) from programs";

$db->DBQ();

$quantity = $db->result->fetch_row();


$limit=$onepage*$_GET['p']-$onepage;


$db->query = "select no, id, date, time, category, title, content, link, os, korean, image, licence from programs order by no desc limit ".$limit.", ".$onepage;

} else

{ $db->query = "select count(*) from programs where category='".$tn."'";

$db->DBQ();

$quantity = $db->result->fetch_row();


$limit=$onepage*$_GET['p']-$onepage;


$db->query = "select no, id, date, time, category, title, content, link, os, korean, image, licence from programs where category='".$tn."' order by no desc limit ".$limit.", ".$onepage;

}


if($tn!='')

{

$base->style='

div.wrap {margin-bottom:10px;border:1px solid #ddd;min-height:400px;padding:8px;}

div.wrap div {padding:8px;}

div.left {float:left;width:50%;}

div.right {float:right;width:40%;width:43%;}

div.header{border-top:3px solid #aaa;border-bottom:3px solid #aaa;}

div.header > h2{margin:0;}

div.content{border:1px solid #ddd;margin-top:10px;min-height:170px;}

div.image {text-align:center;min-height:316px;}

img{max-height:330px;}

div#paging{text-align:center;}

div#paging > a{padding:2px 5px 2px 5px;border:1px solid transparent;}

div#paging > b{padding:2px 5px 2px 5px;border:1px solid transparent;}

div#paging > a:hover{border:1px solid #ddd;}

';


$db->DBQ();

while($data = $db->result->fetch_row())

{

while (list($key, $value) = each($base->pmenu))

{

if($data[4] == $value)

{

$cate = $key;

}

}


$base->content = $base->content."

<div class='wrap'>

<div class='header'><h2><a href='./view.php?v=".$data[0]."'>".$data[5]."</a></h2></div>

<div class='left'>

<div class='name'><b>".$data[1]."</b></div>

<div class='date'>".$data[2]."</div>

<div class='category'>카테고리 : <a href='./?tn=".$data[4]."'>".$cate."</a></div>

<div class='link'>다운로드 페이지 : <a href='".$data[7]."' target='_blank'>연결하기</a></div>

<div class='content'>".nl2br($data[6])."</div>

</div>

<div class='right'>

<div class='image'><a href='./view.php?v=".$data[0]."'><img class='maxwidth' src='.".$data[10]."'/></a></div>

</div>

</div>";

}

$thispage = $_GET['p']; //현재 페이지

$totalpage=(int)ceil ($quantity[0]/$onepage); //전체 페이지

$oneblock = 10; //페이지 블록 한 페이지에 몇개 보일지.

if($thispage>$totalpage)

{

echo "<script>alert('존재하지 않는 페이지입니다.');location.replace('./');</script>";

}



$thisblock = (int)(ceil($thispage/$oneblock)-1);

$lastblock = (int)(ceil($totalpage/$oneblock)-1);

$startnum = (int)($thisblock*$oneblock+1);

$endnum = (int)($thisblock*$oneblock+$oneblock+1);


if($thispage!=1) $paging = $paging."<a href='".$_SERVER['PHP_SELF']."?tn=".$tn."&p=1'><< </a>";

if($thisblock!=0) $paging = $paging."<a href='".$_SERVER['PHP_SELF']."?tn=".$tn."&p=".($thisblock*$lastblock)."'>< </a>";

for($i=$startnum; $i<$endnum; ++$i)

{

if($i>$totalpage) break;

if($i==$thispage) $paging = $paging."<b>".$i."</b>";

else $paging = $paging."<a href='".$_SERVER['PHP_SELF']."?tn=".$tn."&p=".$i."'>".$i."</a>";

}

if($thisblock!=$lastblock) $paging = $paging."<a href='".$_SERVER['PHP_SELF']."?tn=".$tn."&p=".$endnum."'> ></a>";

if($thispage!=$totalpage) $paging = $paging."<a href='".$_SERVER['PHP_SELF']."?tn=".$tn."&p=".$totalpage."'> >></a>";


$base->content = $base->content."<div id='paging'>".$paging."</div>";

}


$base->LayoutMain();

?>


프로그램 부분을 3가지 방식으로 나눠서 하나의 파일에 작성하다보니 엄청 길어졌네요.


먼저 맨 윗줄에 검은색으로 된 부분부터 알아보겠습니다.


$tn=$_GET['tn'] 이 부분은 현재 카테고리가 어떤건지 확인해서 $tn 변수에 입력해줍니다.

$onepage=3; 이건 하나의 페이지에 몇 개의 글을 보여줄지 설정해줍니다.


if($_GET['p']==false)

{

$_GET['p']=1;

} 이건 만약 $_GET['p']에 아무런 값도 없다면 1로 설정해줍니다.

이건 아래쪽에 사용할 페이지 부분을 위해서 만들었습니다.


빨간색으로 칠해진 부분을 보겠습니다.



이 부분은 메뉴의 Programs를 누르거나 위에 있는 이미지에서 프로그램 부분을 누르면 보이는 부분입니다.


$base->style 부분은 단순히 style 효과를 주기 위해 둔 곳이구요.


$base->content 부분은 본문이 출력되는 부분입니다.

먼저 제목 부분을 이 변수 안에 넣어줬고, 각각 $left와 $right 변수를 만들어서 좌우를 나눠서 출력하려고 합니다.


while(list($key, $value) = each($base->pmenu)) 이 부분은 전체 카테고리를 인기순으로 출력하려고 만들었습니다.

아직 인기도 부분을 안만들었기 때문에 일단 카테고리 별 최신 순으로 해뒀습니다.


여기서 $value 부분을 가지고 select 쿼리를 보낸 후 나온 값으로 메뉴를 작성하는데,

licence 부분은 DB 용량을 줄이기 위해 숫자로 저장해서 switch 문을 이용해서 라이센스 부분을 글자로 출력되게 했습니다.


그 다음 if($data!='')를 이용해서 $data가 빈칸이 아닐 때, if($num==0)을 검사합니다.


$num은 선언을 한적이 없기 때문에 참이 되고 $num에 1을 넣어줍니다.

그 후 $left에 목록을 저장됩니다.


그 다음 반복문에서는 $num이 1이기 때문에 $right에 목록을 저장합니다.

이렇게 전체 카테고리 부분을 돌고 $left와 $right 맨 뒤에 </div>를 추가합니다.


그리고 $base->content 부분에 $left와 $right, 그리고 스타일에 float를 사용 했으므로 clear:both를 스타일로 준 div를 추가한 후 코드 제일 아래 있는 $base->LayoutMain()을 출력합니다.


파란색으로 된 부분은 $tn이 latest일 때인데, 최신 순으로 출력하려고 만든 곳입니다.



먼저 select count(*)로 programs 테이블에 목록이 총 몇개인지 $quantity에 저장합니다.


그리고 페이지를 몇개나 만들지 알기 위해서 $limit 변수를 만드는데, $onepage는 3이니 3*현재 페이지-3을 해줬네요.

그리고 다시 쿼리를 만들었는데, 맨 뒤에 $limit, $onepage로 원하는 페이지만큼 출력되게 합니다.


그리고 이 부분은 초록색 부분으로 넘어갑니다.


다음은 보라색 부분입니다.


이 부분도 latest와 비슷한데, 최신순 부분과 같은 방식으로 출력됩니다.

그리고 카테고리 부분은 모두 이 부분에서 처리됩니다.


$tn과 같은 카테고리가 몇 개인지 count(*)로 확인하고 이번에도 $quantity를 얻은 후,

그 다음 $tn과 같은 카테고리와 원하는 페이지만큼 출력합니다.


그리고 이 부분도 초록색 부분으로 넘어갑니다.

너무 길어서 나눠 적어야겠네요.


워낙 변수도 많고 복잡해서 여러번 봐야 이해하실 수 있을 것 같습니다.

이해 안되는 부분 댓글에 남겨주세요!

TAG , ,
  1. 2014.07.22 09:33  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Kurien 2014.07.22 10:19 신고  댓글주소  수정/삭제

      아 private 부분을 안적었네요.
      만들다 보니 그런 오류가 보이는 것 같아서 pmenu 부분은 다시 public으로 변경했습니다.

      윗 질문의 경우 이름 변경하시려면, 지금 당장 생각나는건 layout.inc, programs 파일 명, database 테이블 명과 작성된 programs 관련 쿼리 하나하나들 정도네요...
      이렇게 하려면 거의 새로 페이지 하나를 만들어야 한다고 보시면 될 것 같네요.

      페이지, 게시판 명을 따로 관리하는 페이지를 만들려면 좀 더 뜯어 고쳐야할 것 같구요.

  2. kyr0222 2015.11.16 19:52 신고  댓글주소  수정/삭제  댓글쓰기

    index 84번째 줄에

    $data=$db->result->fetch_row(); 이 부분이 오류가 나는데 원인이 뭔지 알수있나요??

    • Kurien 2015.11.27 11:24 신고  댓글주소  수정/삭제

      오류를 남겨주신게 아니라서 어떤 오류인지는 잘 모르겠네요.
      주로 PHP 버전이 낮거나, db 연결을 mysqli가 아닌 mysql 모듈로 연결해서 나는게 많습니다.

  3. 수정수정 2016.05.22 17:51 신고  댓글주소  수정/삭제  댓글쓰기

    소스 출력해보면 글쓰기와 관리 부분이 화면상 안보이는데 왜그러는거죠

    • Kurien 2016.06.10 18:18 신고  댓글주소  수정/삭제

      php, css, script 등의 차이가 있을 수 있어서 확답을 드리기가 어렵네요.
      직접 코드를 보내주셔야 그나마라도 확인해드릴 수 있을 것 같습니다.