6. PHP 홈페이지 만들기 프로그램 메뉴 2

2014.07.10 16:44
저자 : Kurien


5. PHP 홈페이지 만들기 프로그램 메뉴 1에서 나눠 적는다고 해놓고 깜빡해서 이제야 올리네요.

아래의 코드에서 초록색 부분을 제외한 부분은 모두 설명을 했습니다.

오늘은 초록색으로 된 부분을 설명해드리겠습니다.


/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();

?>


초록색 부분에서는 $tn이 공백이 아닐 때만 실행이 됩니다.

그러므로 $tn이 latest이거나, 카테고리가 존재할 때만 실행이 되는거죠.

먼저 $base->style로 스타일을 지정한 뒤 바로 $db->DBQ();가 나옵니다.


위에 있는 파란색으로 된 부분과 보라색으로 된 부분의 마지막 줄의 $db->query를 DBQ로 전송해주는 역할이죠.


그 다음 while을 이용해서 변수 $date에 $db->result->fetch_row()가 존재하지 않을 때까지 반복합니다.

그리고 while이 하나 더 나오는데, layout.inc 코드에 있는 $pmenu를 $base->pmenu로 출력하고, $key 부분을 $cate에 넣어줍니다.

이렇게 하는 이유는 카테고리에 있는 값이 최신의 경우 latest로 출력되는데 이 while을 거치면 최신으로 출력되는거죠.


그리고 $base->content로 각각의 데이터를 자리잡아줍니다.

이 부분도 while 내부에 있어서 여러번 반복 되므로 $base->content=$base->content.내용으로 합쳐지게끔 했습니다.


그리고 $db->result->fetch_row()로 돌아가던 while 문은 끝나게 되구요.


마지막으로 그 밑부분은 글의 최하단에 존재하는 paging 부분인데, 페이지를 나타내줍니다.


$thispage는 현재 페이지, $totalpage는 전체, 총 페이지

$oneblock은 몇개가 한 블록인지 설정하는건데, 블록이란건 10을 설정했을 때 1~10까지가 한 블록입니다.


다음에 나오는 if문은 현재 페이지가 전체 페이지를 오버했을 경우 존재하지 않는 페이지라는 경고창을 출력합니다.


그리고 $thisblock은 현재 블록이 몇 번 블록인지, $lastblock은 마지막 블록이 몇 번인지,

$startnum은 현재 블록의 첫번째 페이지가 몇번인지(1, 11, 21, 31 같은 번호), $endnum은 마지막 번호가 몇번인지를 나타냅니다.


그렇게 if문과 for문을 이용해서 << < 1 2 3 4 5 6 7 8 9 10 > >>과 같은 페이지를 만들어줍니다.

여기까지가 페이징이고 페이징을 끝으로 초록색으로 된 부분이 끝납니다.


마지막으로 $base->LayoutMain();으로 지금까지 작성된 코드를 화면에 뿌려줍니다.


제가 봐도 엄청 복잡해보이네요 ㅋㅋㅋ


솔직히 이 이상으로 설명을 어떻게 해야할지 모르겠네요;

보시는 분들이 PHP에 대한 지식이 많길 빕니다...


제가 하루에도 몇십번씩 블로그 확인하니 댓글 남겨주시면 그 부분에 대해서 자세히 설명해드릴께요!

모르는 부분은 댓글에 남겨주세요!


다음 포스팅 부분은 /programs/view.php 부분입니다!



http://kurien.speeds.kr 이곳으로 들어가시면 먼저 확인하실 수 있어요~!

TAG , ,
  1. Dr.A 2014.08.07 16:59 신고  댓글주소  수정/삭제  댓글쓰기

    제꺼 프로그램부분보면 ㅠ 저래 오류가나는데 뭐가문제인지모르겟네여 ㅠ
    36번째줄에 while (list($key, $value) = each($base->pmenu))
    요게들어있는데 ㅠㅠ

    • Kurien 2014.08.07 17:02 신고  댓글주소  수정/삭제

      http://kurien.tistory.com/375
      여기 댓글 맨 아래부분을 보시면 layout.inc 부분에 대해 적혀있는데요.
      private를 다시 public으로 바꿔주시면 될껍니다.

  2. 영자님 2018.03.28 18:51 신고  댓글주소  수정/삭제  댓글쓰기

    올려주신 php 강좌 공부하는데 도움이 많이 되었습니다.
    한가지 물어볼께있어요.
    본문 우측에 이전 버전을 표시 하고싶은데 어떤 방식으로 해야 되나요.
    예를 들면 곰플레이어 다운로드 이면 우측에 곰플레이어 이전 버전이 있으면 같이 출력하는 방법이요.
    댓글 기능처럼 db를 하나더 만들어야 하나요?
    간략하게 설명이라도 해주시면 고맙겠습니다..

    • Kurien 2018.04.06 10:46 신고  댓글주소  수정/삭제

      말씀하신 것 처럼 DB에서 테이블을 하나 더 만드셔야합니다.

      게시판에 글 내용이 있는 것이 아니라 프로그램의 이력에 대한 정보가 있고,
      사용자가 글 제목을 클릭하여 글을 보게 되는 경우, 해당 프로그램의 최신 이력을 출력합니다.

      이전 버전 버튼을 누른다면 해당 프로그램의 전체 이력을 출력하면 되겠죠.