와 정말 너무 오래간만에 강좌를 쓰게 되네요. ^^

그 동안 제가 일때문에 정신이 없어서 ㅜㅜ (완전 핑계 ㅎㅎ)

여튼 오늘부터 예약프로그램을 만들어 보도록 하겠습니다.

이번시간에는 어떤 기능을 넣을 것인지 , 또 DB는 어떻게 설계 할것인지 알아보도록 하겠습니다.

우선 어떤 기능을 구현할 것인지 기능정의부터 해보겠습니다.

[예약프로그램 기능]
1. 펜션에 사용하는 방을 예약하는 기능을 구현한다.
2. 방을 생성하고 각 방의 이름,설명,가격등을 설정할수 있게 한다.
3. 예약은 하루 단위로 하게 한다.
4. 결제는 포함하지 않는다.
5. 회원 가입은 포함하지 않는다.

우선 위처럼 간단한 기능만 넣어 보도록 하겠습니다.

하루단위가 아니라 시간단위로 하게되면 음식점, 노래방, 수업등에서 응용할수 있습니다.

그러면 DB 설계부터 해보도록 하겠습니다.

1. 방 테이블 (r__room)


rm_idx (고유번호), rm_name(방이름), rm_intro(방소개), rm_price(방가격), rm_regdate(작성일시) 정도로 간단하게 만들었습니다.

2. 예약테이블 (r__reservation)


re_idx(예약 고유번호), rm_idx(방 고유번호), re_name(예약자 이름), re_date(예약일)

아주 간단하게 설정했어요.

다음 시간에는 필요한 함수들을 정리해보고 include 할 파일들을 만들어보겠습니다.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. LEE
    2010/11/07 23:04
    댓글 주소 수정/삭제 댓글
    오옷.. 멋진 강좌.
    기대됩니다~~
  2. 2010/11/09 15:35
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
    • 2010/11/10 22:07
      댓글 주소 수정/삭제
      예약프로그램 강좌를 시작하니까 예약프로그램 의뢰가 들어와서 다음 강좌가 좀 늦어지네요 ㅎㅎ
  3. 스이
    2010/11/28 11:48
    댓글 주소 수정/삭제 댓글
    오랜만에 강좌 기대기대 ㅎㅎ
  4. id
    2010/12/04 09:44
    댓글 주소 수정/삭제 댓글
    5개월 만에 강좌 기다렸어요
  5. id
    2010/12/04 09:44
    댓글 주소 수정/삭제 댓글
    그동안 기다림이 보람이 있어요
    5개월 만인가요.
  6. 쇼스타퍼
    2010/12/05 21:32
    댓글 주소 수정/삭제 댓글
    혹 스마트폰용 홈페이지 강좌같은것은 안하나여?
  7. domminika
    2011/02/01 19:32
    댓글 주소 수정/삭제 댓글
    저자께 진심으로 되는 감사 드립니다....
    덕분에 살았습니다...
    음... 무었이든 사려ㅣ 하고 싶습니다...

    대신 제 이름 알려드립니다... {최충성} 꼭 기억하시길.............
  8. domminika
    2011/02/01 19:43
    댓글 주소 수정/삭제 댓글
    무례하다 생각하셨으면... 용서하십시오...
  9. 죠스바
    2011/02/15 17:29
    댓글 주소 수정/삭제 댓글
    다음 강좌 내용 너무 궁금합니다 ㅠㅠ
  10. hdh
    2011/02/22 01:30
    댓글 주소 수정/삭제 댓글
    간만입니다. ㅜㅜ
    다음 강의에는 카드, 무통장입급, 핸드폰 등의 실 결제 수단을 구현하는 방법 궁금합니다.
  11. space
    2011/05/22 15:29
    댓글 주소 수정/삭제 댓글
    언제쯤 다음 강좌를 볼수 있을가요..
  12. violetmidi
    2011/07/25 14:55
    댓글 주소 수정/삭제 댓글
    잘보고있습니다,! 너무너무 기다려지네요-ㅎ
    두근두근하는 마음으로 기다려봅니다,
  13. 2011/11/19 08:11
    댓글 주소 수정/삭제 댓글
    좋은 정보 감사! ㅎ ㅎ
    즐거운 하루 되세요 ~
  14. 2011/11/25 06:36
    댓글 주소 수정/삭제 댓글
    이것은 훌륭한 리소스입니다.
  15. 2011/11/28 15:50
    댓글 주소 수정/삭제 댓글
    강좌 잘보고 있습니다 그런데 php강좌가 너무 많다보니 강좌 찾는것도 일이네요. 강좌목록이 한번에 다 안떠서 일일이 클릭해서 찾아가고 있습니다. 이전 강좌를 좀 찾아보기 쉬운 목록형태로 바꿔주시면 안될까요??? ㅠㅠ
  16. 2011/11/28 15:50
    댓글 주소 수정/삭제 댓글
    강좌 잘보고 있습니다 그런데 php강좌가 너무 많다보니 강좌 찾는것도 일이네요. 강좌목록이 한번에 다 안떠서 일일이 클릭해서 찾아가고 있습니다. 이전 강좌를 좀 찾아보기 쉬운 목록형태로 바꿔주시면 안될까요??? ㅠㅠ
  17. 와이령
    2011/12/10 06:27
    댓글 주소 수정/삭제 댓글
    강좌가 엄청난 도움이 되고있습니다ㅠㅠ
    웹프로그래밍 시작해서 php 어떻게 공부하나 고민중이었는데
    슬픈기쁨님 강좌 보고 빛이 보입니다ㅠㅠㅠㅠㅠㅠ
    격하게 사랑해요ㅠㅜㅜ앞으로도 좋은 강좌 많이 올려주세요!!

이번시간에는 메일을 보내는 명령어 mail() 에 대해 배워보도록 하겠습니다.

mail() 함수는 이메일을 보내는 함수로 기본적인 사용방법은 다음과 같습니다.

mail(받는이메일주소, 제목, 내용)

위 형식으로 사용을 하면 메일이 보내집니다.

그런데 보내는 사람 같은것은 어디에 적어줘야할까요?

mail 함수의 인자에서 내용 다음에 메일의 header 를 넣어줍니다.

mail(받는이메일주소, 제목, 내용, header)

이 header 에 메일의 언어셋이나 보내는 사람 참조등의 여러 정보를 넣을수 있습니다.

아래 예문을 보면서 설명드리겠습니다.(PHP 함수 검색에 나오는 예제입니다.)
<?php
// 받는 사람이 여럿일 경우 , 로 늘려준다.
$to  = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';

// 제목
$subject = 'Birthday Reminders for August';

// 내용
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// HTML 내용을 메일로 보낼때는 Content-type을 설정해야한다
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=euc-kr' . "\r\n";

// 추가 header

// 받는사람 표시
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";


// 보내는사람
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";

// 참조
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";

// 숨은참조
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// 메일 보내기
mail($to, $subject, $message, $headers);
?>

주석을 보시면 알겠지만 위와 같은 방식으로 메일을 보낼 내용과 header 등을 설정해서 보낼수가 있습니다.

그러면 다음시간부터 예약 프로그램에 대해 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 하늘사랑
    2010/06/17 19:51
    댓글 주소 수정/삭제 댓글
    예약 프로그램이 기대가 됩니다.
    오늘 월드컵 중계가 있는 날 !!!
    16강 의 분수령 입니다.
  2. Lifth
    2010/06/25 16:15
    댓글 주소 수정/삭제 댓글
    안녕하세요. 강좌 잘보고 있습니다.

    다음에는 DB에 대해서도 좀 깊게 강좌 해주실 수 없으실까요?

    innoDb를 이용한 트랜잭션이나 외래키 설정하여 회원관리하는 그런 강좌 해주시면 감사하겠습니다. ^^
  3. 2010/07/22 17:48
    댓글 주소 수정/삭제 댓글
    컴퓨터는 언제봐도 어려워요 참..;;
  4. 또리
    2010/11/05 19:48
    댓글 주소 수정/삭제 댓글
    여기서 도움 많이 얻고 갑니다. 좋은 강좌 정말 감사합니다.
  5. 2011/02/18 08:15
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  6. 2012/03/07 05:22
    댓글 주소 수정/삭제 댓글
    단지 좋은 직장, 귀하의 사이트를 방문 반가워요.

이번시간에는 달력을 그려보기로 하겠습니다.

이 강좌는 날자별 예약을 배우기 위해 필요한 부분입니다.

우선 소스를 보면서 설명드리겠습니다.

<?
// 1. 총일수 구하기
$last_day = date("t", time());

// 2. 시작요일 구하기
$start_week = date("w", strtotime(date("Y-m")."-01"));

// 3. 총 몇 주인지 구하기
$total_week = ceil(($last_day + $start_week) / 7);

// 4. 마지막 요일 구하기
$last_week = date('w', strtotime(date("Y-m")."-".$last_day));
?>
<table width='500' cellpadding='0' cellspacing='1' bgcolor="#999999">
  <tr>
    <td height="50" align="center" bgcolor="#FFFFFF" colspan="7"><?=date("Y년 n월")?></td>
  </tr>
  <tr>
    <td height="30" align="center" bgcolor="#DDDDDD">일</td>
    <td align="center" bgcolor="#DDDDDD">월</td>
    <td align="center" bgcolor="#DDDDDD">화</td>
    <td align="center" bgcolor="#DDDDDD">수</td>
    <td align="center" bgcolor="#DDDDDD">목</td>
    <td align="center" bgcolor="#DDDDDD">금</td>
    <td align="center" bgcolor="#DDDDDD">토</td>
  </tr>
       
  <?
    // 5. 화면에 표시할 화면의 초기값을 1로 설정
    $day=1;

    // 6. 총 주 수에 맞춰서 세로줄 만들기
    for($i=1; $i <= $total_week; $i++){?>
  <tr>
    <?
        // 7. 총 가로칸 만들기
        for ($j=0; $j<7; $j++){
    ?>
    <td height="30" align="center" bgcolor="#FFFFFF">
      <?
        // 8. 첫번째 주이고 시작요일보다 $j가 작거나 마지막주이고 $j가 마지막 요일보다 크면 표시하지 않아야하므로
        //    그 반대의 경우 -  ! 으로 표현 - 에만 날자를 표시한다.
        if (!(($i == 1 && $j < $start_week) || ($i == $total_week && $j > $last_week))){

            if($j == 0){
                // 9. $j가 0이면 일요일이므로 빨간색
                echo "<font color='#FF0000'>";
            }else if($j == 6){
                // 10. $j가 0이면 일요일이므로 파란색
                echo "<font color='#0000FF'>";
            }else{
                // 11. 그외는 평일이므로 검정색
                echo "<font color='#000000'>";
            }

            // 12. 오늘 날자면 굵은 글씨
            if($day == date("j")){
                echo "<b>";
            }
           
            // 13. 날자 출력
            echo $day;

            if($day == date("j")){
                echo "</b>";
            }

            echo "</font>";

            // 14. 날자 증가
            $day++;
        }
        ?>
    </td>
    <?}?>
  </tr>
  <?}?>
</table>
[calendar.php 소스]



우선 주석으로 거의 설명을 해놨습니다.

중요한곳은 8번 부분입니다.

1일 앞의 칸은 날자가 표시되지 않아야 하고 또 마지막 날자 다음도 날자가 표시되지 않아야하므로

8번과 같은 조건을 사용한 것입니다.

여기서 나오는 함수 date(), strtotime(), time() 은 날자관련 함수입니다.

우선 시간표시는 PHP에서는 프로그램에서만 알아먹는 시간이 있습니다.

Unix Time stamp 라는건데요.

1970년 1월 1일 0시 0분 0초부터 몇초가 지났는지입니다.

time() 은 지금 현재 시간이 UNIX TIme Stamp로 얼마인지를 알려줍니다.

strtotime() 은 인수로 날자를 표시하는 형식을 넣어서 그 날자를 Unix Time Stamp로 만들어 주는 함수입니다.

date() 함수는 첫번째 인자에 들어간 형식대로 두번째 인자로 들어온 Unix Time Stamp 를 바꿔주는 함수입니다.

두번째 인자가 생략되면 두번째 인자에 time() 으로 구해진 숫자가 들어간것이라고 보면됩니다. 바로 지금 현시간이죠.

첫번째 인자는 아주 많은 종류가 있습니다. Y는 네자리 연도 처럼 각 기호가 하나의 표시형식을 표현합니다.

자세한 인자는 제 블로그 오른쪽에 php 함수 검색에서 date 를 검색해 보시면 됩니다.

우선 여기에 쓰인인자만 설명하면

Y : 네자리 년도 (예: 2010)
m : 0을 포함한 월 (예: 06, 12)
n : 0을 포함하지 않는 월 (예: 6, 12)
j : 0을 포함하지 않는 일 (예, 3, 15)
t : 그 달의 마지막 날자
w : 그 날의 요일, 일요일부터 0 , 토요일은 6

이런 형식의 함수입니다.

다음시간에는 메일을 보내는 함수에 대해 알아보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 골목대장
    2010/06/15 14:35
    댓글 주소 수정/삭제 댓글
    좋은강좌 감사합니다. 추천하고 가요~
  2. 2010/06/16 14:48
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
    • 2010/06/16 22:32
      댓글 주소 수정/삭제
      아 시작요일 구하기 부분을 잘못했네요.
      $start_week = date("w", time()); 를
      $start_week = date("w", strtotime(date("Y-m")."-01")); 로 변경했습니다.
  3. 2010/06/18 12:28
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  4. 2010/08/14 18:16
    댓글 주소 수정/삭제 댓글
    정말 감사합니다 덕분에 해결 됬습니다. 정말 ㄳ 추천 함~~~~~~~
  5. 죠스바
    2011/02/15 17:31
    댓글 주소 수정/삭제 댓글
    감사합니다^^ 제 블로그로 담아갈께요^^
  6. 2012/01/11 10:11
    댓글 주소 수정/삭제 댓글
    // 10. $j가 0이면 일요일이므로 파란색
    주석이 잘못 되었네요.
    $j가 6이면 토요일이므로 파란색 이네요~

이제 포인트몰 만들기의 마지막 시간입니다.

지난시간에 장바구니까지 했는데요.

오늘은 주문하기와 주문한 구매 목록, 그리고 판매목록을 배워보도록 하겠습니다.

우선 주문하기 메뉴입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 장바구니 목록 뽑기
$sql = "select c.*, i.i_name, i.i_price from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx where c.c_m_idx = '".$_SESSION[user_idx]."' and c.c_o_idx = '0'";
$result = mysql_query($sql, $connect);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">장바구니</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품단가</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품수량</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">소계</td>
    </tr>
<?
// 4.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 5.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[i_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_cnt])?>개</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_price])?>원</td>
    </tr>
<?

    // 6.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[c_price];
}

// 7.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
<br/>
<?
// 8. 내 포인트 구하기
$sql = "select * from m__member where m_id = '".$_SESSION[user_id]."'";
$my_data = sql_fetch($sql);
?>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">내 포인트 : <?=number_format($my_data[m_point])?>점</td>
    </tr>
</table>
<br>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle">
        <?
        // 9. 내 포인트가 총합보다 크면 구매 작으면 포인트 충전
        if($my_data[m_point] >= $sum){
        ?>
        <input type="button" value=" 구매하기 " onClick="location.href='./order_save.php';">
        <?}else{?>
        <input type="button" value=" 포인트 충전" onClick="location.href='./point.php';">
        <?}?>
        </td>
    </tr>
</table>
[order.php 소스]

장바구니 페이지와 똑같습니다.

단지 구매하는 버튼이 다를뿐입니다. ^^

가격의 총합이 내가 가진 포인트보다 많으면 구매를 적으면 포인트 충전을 보여줍니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 내 포인트 구하기
$sql = "select * from m__member where m_id = '".$_SESSION[user_id]."'";
$my_data = sql_fetch($sql);
$my_point = $my_data[m_point];

// 4. 장바구니 총합 구하기
$sql = "select sum(c_price) as sum_c_price from m__cart where c_m_idx = '".$_SESSION[user_idx]."' and c_o_idx = '0'";
$cart_data = sql_fetch($sql);
$total_price = $cart_data[sum_c_price];

// 5. 포인트가 합계보다 작으면 포인트 충전으로 보내기
if($my_point < $total_price){
    alert("포인트가 부족합니다.","./point.php");
}

// 6. 주문테이블에 적기
$sql = "insert into m__order (o_m_idx, o_m_name, o_amount, o_status, o_regdate) values ('".$my_data[m_idx]."', '".$my_data[m_name]."', '".$total_price."', '결재완료', now())";
sql_query($sql);

// 7. 주문번호 구하기
$o_idx = mysql_insert_id();

// 8. 장바구니 물건들을 구매상태로(주문번호를 적어주면 됨)
$sql = "update m__cart set c_o_idx = '".$o_idx."' where c_m_idx = '".$_SESSION[user_idx]."' and c_o_idx = '0'";
sql_query($sql);


// 9. 포인트 빼기
$sql = "update m__member set m_point = m_point - ".$total_price." where m_id = '".$_SESSION[user_id]."'";
sql_query($sql);

// 10. 구매내역 페이지로 보내기
alert("상품구매가 완료 되었습니다.","./member.php");
?>
[order_save.php 소스]

여기서는 배송이나 이런것들을 빼버렸기 때문에 넘어오는 변수가 없습니다.

배송메세지나 이런것들이 있다면 입력받아서 이 페이지로 넘겨주면 됩니다.

넘겨준 변수들은 주문테이블에 적으면 되구요.

주문페이지처럼 포인트와 총합을 비교해 부족하면 포인트 충전으로 보내고 그렇지 않으면 주문태ㅔ이블에 적은 후

주문번호를 찾아내 장바구니 테이블의 주문번호란에 적습니다.

그리고 포인트를 뺀 후 구매내역 페이지로 보냅니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 구매 목록 뽑기
$sql = "select * from m__order where o_m_idx = '".$_SESSION[user_idx]."' order by o_idx desc";
$result = mysql_query($sql, $connect);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">구매내역</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">주문번호</td>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">주문금액</td>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">주문일시</td>
    </tr>
<?
// 4.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 5.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[o_idx]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./order_detail.php?o_idx=<?=$data[o_idx]?>"><?=number_format($data[o_amount])?>원</a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[o_regdate]?></td>
    </tr>
<?

    // 6.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[o_amount];
}

// 7.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="3" style="height:50px;background-color:#FFFFFF;">주문이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="3" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
[member.php 소스]



여기부터는 설명할게 없습니다.

이미 다 배운것들이죠. 소스만 나열하겠습니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 주문번호가 있는지 그리고 본인 주문인지 확인
$sql = "select * from m__order where o_idx = '".$_GET[o_idx]."' and o_m_idx = '".$_SESSION[user_idx]."'";
$order_data = sql_fetch($sql);
if(!$order_data[o_idx]){
    alert("주문번호가 정확하지 않습니다.");
}

// 4. 상품 목록 뽑기
$sql = "select c.*, i.i_name, i.i_price from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx where c.c_o_idx = '".$order_data[o_idx]."'";
$result = mysql_query($sql, $connect);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">상세주문 보기</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품단가</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품수량</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">소계</td>
    </tr>
<?
// 5.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 6.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[i_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_cnt])?>개</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_price])?>원</td>
    </tr>
<?

    // 7.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[c_price];
}

// 8.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 돌아가기 " onClick="location.href='./member.php';"></td>
    </tr>
</table>
[order_detail.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 한 페이지에 보일 상품 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";


// 4. 전체 주문 갯수 알아내기
$sql = "select count(*) as o_m_idx from m__item where 1 ";
$total_count = sql_total($sql);


// 5. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count, "");

// 6. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 7. 구매목록 구하기
$query = "select * from m__order where 1 limit ".$from_record.", ".$page_row;
$result = mysql_query($query, $connect);

?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">판매 내역</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">주문번호</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">주문자 이름</td>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">주문금액</td>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">주문일시</td>
    </tr>
<?
// 8.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 9.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[o_idx]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[o_m_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./order_detail2.php?o_idx=<?=$data[o_idx]?>&page=<?=$page?>"><?=number_format($data[o_amount])?>원</a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[o_regdate]?></td>
    </tr>
<?

    // 10.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[o_amount];
}

// 11.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">주문이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
<br>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><?=$paging_str?></td>
    </tr>
</table>
[order_list.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 주문번호가 있는지 확인
$sql = "select * from m__order where o_idx = '".$_GET[o_idx]."'";
$order_data = sql_fetch($sql);
if(!$order_data[o_idx]){
    alert("주문번호가 정확하지 않습니다.");
}

// 4. 상품 목록 뽑기
$sql = "select c.*, i.i_name, i.i_price from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx where c.c_o_idx = '".$order_data[o_idx]."'";
$result = mysql_query($sql, $connect);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">상세주문 보기</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품단가</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품수량</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">소계</td>
    </tr>
<?
// 5.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 6.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[i_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_cnt])?>개</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_price])?>원</td>
    </tr>
<?

    // 7.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[c_price];
}

// 8.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 돌아가기 " onClick="location.href='./order_list.php?page=<?=$_GET[page]?>';"></td>
    </tr>
</table>
[order_detail2.php 소스]

이제 간단한포인트 몰은 배워봤습니다.

지난번 강좌의 댓글에서 날자별 관련 예약과 그에 따른 메일 보내기 강좌를 요청하셨네요.

그러면 예약에 들어가기에 앞서 달력만들기와 메일보내기 부분을 배워보도록 할께요.

다음 강좌는 달력만들기 , 그 다음은 메일 보내기, 그 다음은 예약 이렇게 진행하도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 골목대장
    2010/06/11 17:08
    댓글 주소 수정/삭제 댓글
    좋은강좌 정말 감사합니다.
  2. 쇼스타퍼
    2010/06/28 14:03
    댓글 주소 수정/삭제 댓글
    현재 여러 상황을 만드는데여.. 게시판에다 fckeditor를 삽입해서 만드는데여
    혹 fckeditor도 잘 사용하시는지요? 저는 잘 안돼던데여...
    특히 그림삽입해서 하는 부분이 안돼더라고여....
    • 2010/06/29 20:41
      댓글 주소 수정/삭제
      이미지 저장하는 디렉토리 퍼미션이나 설정부분을 확인해 보세요.
  3. 임철균
    2011/09/26 11:07
    댓글 주소 수정/삭제 댓글
    좋은 강좌 감사합니다 ^^

이번 시간은 지난번에 입력한 상품을 보고 또 상품을 구매하기 위해 장바구니에 담는 과정을 해보겠습니다.

오늘 디비에서 두 테이블을 연관지어서 합치는 JOIN 중에 OUTER JOIN 이 나오니 잘 봐두시기 바랍니다.

우선 상품 목록입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 한 페이지에 보일 상품 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";


// 3. 전체 상품 갯수 알아내기
$sql = "select count(*) as cnt from m__item where 1 ";
$total_count = sql_total($sql);


// 4. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count, "");

// 5. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 6. 상품목록 구하기
$query = "select * from m__item where 1 limit ".$from_record.", ".$page_row;
$result = mysql_query($query, $connect);

?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">포인트몰 - 상품목록</td>
    </tr>
</table>
<br/>
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
        <td align="center" valign="middle" width="70%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="25%" style="height:30px;background-color:#CCCCCC;">상품가격</td>
    </tr>
<?
// 7.데이터 갯수 체크를 위한 변수 설정
$i = 0;

// 8.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - (($page - 1) * $page_row) - $i )?></td>
        <td align="left" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./item_view.php?i_idx=<?=$data[i_idx]?>&page=<?=$page?>"><?=$data[i_name]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
    </tr>
<?
    // 9.데이터 갯수 체크를 위한 변수를 1 증가시킴
    $i++;
}

// 10.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="3" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
</table>
[index.php 소스]



이 부분은 상품관리에서의 목록과 똑같습니다.

다만 상품에 걸리는 링크가 item_view.php 일 뿐입니다.

하지만 실제 쇼핑몰에서는 사용자페이지인 만큼 많이 꾸미겠죠? ^^

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 상품 존재 검사
$data = sql_fetch("select * from m__item where i_idx = '".$_GET[i_idx]."'");
if(!$data[i_idx]){
    alert("존재하지 않는 상품입니다.");
}
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">포인트몰 - 상품보기</td>
    </tr>
</table>
<br/>
<form name="itemForm" method="post" action="./cart_save.php" style="margin:0px;">
<!-- 3. 장바구니나 바로구매 버튼 클릭시 mode 의 값을 채워서 전달 -->
<input type="hidden" name="mode" value="">
<input type="hidden" name="page" value="<?=$_GET[page]?>">
<input type="hidden" name="i_idx" value="<?=$data[i_idx]?>">
<input type="hidden" name="price" value="<?=$data[i_price]?>">

<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=$data[i_name]?></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품가격</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=$data[i_price]?></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품설명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=nl2Br($data[i_explain])?></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">구매수량</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="c_cnt" onChange="caluate_item();">개</td><!-- 4. 수량변경 시 체크 후 총가격값을 입력 -->
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">총가격</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="c_price" value="0" readOnly>원</td>
    </tr>
    <!-- 5. 로그인 한 사람만 장바구니와 바로구매 버튼이 보기고 버튼 클릭시 cart_save함수로 검사 -->
    <tr>
        <td align="center" valign="middle" colspan="2">
        <?if($_SESSION[user_id]){?>
        <input type="button" value=" 장바구니 " onClick="cart_save('cart');">
        <input type="button" value=" 바로구매 " onClick="cart_save('direct');">
        <?}?>
        <input type="button" value=" 목록 " onClick="location.href='./index.php?page=<?=$_GET[page]?>';"></td>
    </tr>
</table>
</form>
<script>
// 수량 검사 밑 총 가격 만드는 함수
function caluate_item()
{
    var f = document.itemForm;
    var cnt_obj = f.c_cnt;    // 수량

    if(cnt_obj.value == ""){
        alert("구매수량을 입력해 주세요.");
        return false;
    }else{
        // 숫자인지 검사
        for (var i = 0; i < cnt_obj.value.length; i++){

            if (cnt_obj.value.charAt(i) < '0' || cnt_obj.value.charAt(i) > '9'){
                alert("구매수량을 숫자로 입력해 주세요.");
                return false;
            }
        }
    }

    // 수량과 가격을 곱해 총가격은 만듬
    var price = parseInt(f.price.value) * parseInt(cnt_obj.value);

    f.c_price.value = price;

    return true;
}

// 입력필드 검사함수
function cart_save(arg)
{
    // form 을 f 에 지정
    var f = document.itemForm;

    // 수량검사 후 장바구니담기인지 바로구매인지 값을 mode 에 저장 후 서브밋
    if(caluate_item()){
        f.mode.value = arg
        f.submit();
    }

}
</script>
[item_view.php 소스]



상품 보기 페이지 입니다.

중요한 부분만 설명해 드리자면 장바구니 , 바로구매 버튼은 로그인한 사람에게만 보이게 했다는 점.

그리고 구매수량에 값을 입력하면 onChange 이벤트에 의해서 자바스크립트 caluate_item() 함수가 수량이 숫자인지 검사하고

물건의 가격과 수량을 곱해서 총 가격을 만들어 줍니다.

이 caluate_item() 함수는 장바구니 , 바로구매 버튼 클릭시 한번더 검사 후 장바구니에 담는것인지 바로 구매인지를 구분하는 값을 mode 에 넣고 서브밋을 합니다.

이제 이렇게 설명드려도 아시겠죠?

아! onChange 이벤트는 값이 변할때 작동한다는 의미입니다.

즉 쓰고 있을때는 변하지 않고 다른곳으로 커서가 이동시 값이 이전과 비교해 변화가 있으면 동작한다는 의미입니다.

이제 장바구니에 상품들을 담는 cart_save.php 입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 넘어온 변수 검사
if(trim($_POST[mode]) != "cart" && trim($_POST[mode]) != "direct"){
    alert("정상적인 접근이 아닙니다.");
}

if(!$_POST[i_idx]){
    alert("상품페이지에서 상품을 선택 후 구매해주세요.");
}

if(!is_numeric($_POST[c_cnt])){
    alert("상품수량을 숫자로 입력해 주세요.");
}

// 4. 장바구니에 적어 넣기
$sql = "insert into m__cart (c_m_idx, c_i_idx, c_cnt, c_price) values ('".$_SESSION[user_idx]."', ".$_POST[i_idx].", ".$_POST[c_cnt].", '".$_POST[c_price]."')";
sql_query($sql);

// 5. 장바구니인지 바로구매인지에 따라서 이동
if($_POST[mode] == "cart"){
    alert("장바구니에 담았습니다.","./cart.php");
}else if($_POST[mode] == "direct"){
    alert("구매페이지로 이동합니다.","./order.php");
}else{
    alert("정상적인 접근이 아닙니다.");
}

?>
[cart_save.php 소스]

역시 딱 보시면 알수 있을겁니다.

장바구니에 담든 바로 구매를 하던 일단 장바구니에 넣습니다.

그리고 장바구니에 담기를 했으면 장바구니 페이지로 바로구매를 했으면 주문페이지로 이동시킵니다.

이제 장바구니 페이지 입니다.

여기를 잘 봐주셔야해요 ^^

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 장바구니 목록 뽑기
$sql = "select c.*, i.i_name, i.i_price from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx where c.c_m_idx = '".$_SESSION[user_idx]."' and c.c_o_idx = '0'";
$result = mysql_query($sql, $connect);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">장바구니</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:0px;">
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="40%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품단가</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">상품수량</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">소계</td>
    </tr>
<?
// 4.데이터 갯수화 총합 체크를 위한 변수 설정
$i = 0;
$sum = 0;


// 5.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[i_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_cnt])?>개</td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[c_price])?>원</td>
    </tr>
<?

    // 6.데이터 갯수 체크를 위한 변수를 1 증가시키고 총합을 더하기
    $i++;
    $sum += $data[c_price];
}

// 7.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">총 합 : <?=number_format($sum)?>원</td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 구매하기 " onClick="location.href='./order.php';"></td>
    </tr>
</table>
[cart.php 소스]

우선 전체적인 순서를 보고 설명드릴께요.

1. 기본인클루드 하고,
2. 로그인 여부 체크후에
3. 장바구니에 있는 물건을 뽑아서
4. 각 변수들을 초기화 시킨 후
6. 물품들을 출력 하고
7. 총 합계를 구하기 위해 물건 값들을 더한 다음
9 데이타가 없으면 없다고 표시하고
총합계를 적어줍니다.

다 배운건데 안 배운게 한가지 있죠?

장바구니 목록을 뽑을 때의 쿼리문입니다.

select c.*, i.i_name, i.i_price from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx where c.c_m_idx = '".$_SESSION[user_idx]."' and c.c_o_idx = '0'

위 쿼리문을 좀 쪼개보겠습니다.

select
c.*, i.i_name, i.i_price
from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx
where c.c_m_idx = '".$_SESSION[user_idx]."' and c.c_o_idx = '0'

위처럼 쪼갤수 있습니다.

이제 잘 들으세요.

where 문이나 select 다음에 c.* 이나 c.c_o_idx , i.i_name 이 보이죠?

그런데 전에 못본 c. i. 같은게 튀어 나왔습니다.

이걸 Alias(알리아스) 라고 합니다.

from 다음에 보면 m__cart as c 처럼 m__cart 테이블을 c 라고 Alias를 지정겁니다. 그래서 c. 이라고 쓰면 m__cart 테이블의 필드를 뜻하게 됩니다.

그런데 못보던게 또 있죠.
left join 이것은 LEFT OUTER JOIN 입니다.

left join 의 왼쪽 테이블을 기준으로 오른쪽의 테이블의 값을 합치는데 그 조건은 on 뒤에 나오는 c.c_i_idx = i.i_idx 를 따른다는 겁니다.

테이블 A
 a a1
 10
 20  나
 30  다

테이블 B
 b b1
 20 데이타1
 30  데이타2

이렇게 두개의 테이블이 있다고 해보죠.

A left join B on A.a = B.b 의 경우
 a a1
b
b1
 10
   
 20  나  20 데이타1
 30  다  30  데이타2

B left join B on B.b = A.a 의 경우
 b b1
a
a1
20  데이타1  20  나
30
 데이타2  30  다

이렇게 됩니다.

즉 left join 의 왼쪽에 있는 테이블을 먼저 골라놓고 on 뒤의 조건이 일치하는 left join의 오른쪽 테이블의 값을 가져와

왼쪽 테이블뒤에 필드를 더 붙이는 것과 같습니다.

그래서 예제의 쿼리문
select
c.*, i.i_name, i.i_price
from m__cart as c left join m__item as i on c.c_i_idx = i.i_idx
where c.c_m_idx = '".$_SESSION[user_idx]."' and c.c_o_idx = '0'
는 카트테이블(m__cart)의 데이타에
상품테이블(m__item)의 데이타 중
카트테이블(m__cart) 의 상품번호(c_i_idx)와 상품테이블(m__item)의 상품번호(i_idx)가 같은 값을 가져와 뒤에 붙이고
where 문의 조건에 따라 값을 뽑아서
카트테이블의 모든 값(c.*) 과 상품테이블의 상품명(i.i_name)과 상품가격(i.i_price)의 값을 가져온다는 쿼리문입니다.

좀 헤깔리셔도 아셔야합니다. ^^ 제일 많이 사용하는 join 문중의 하나입니다.

left join 말고 right join 하면 반대로 오른쪽것을 기준으로 하는것만 다르답니다.

자 이제 오늘 장바구니까지 배웠습니다.

이제 다음시간에는 주문 부분을 배우고 구매내역과 판매내역을 배우겠습니다.

그러면 포인트몰도 끝입니다. ^^

그럼 포인트 몰이 끝나고 나면 어떤걸 하고 싶은지 댓글 달아주세요~


저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 골목대장
    2010/06/09 16:01
    댓글 주소 수정/삭제 댓글
    좋은강좌 정말 감사합니다. 잘보갑니다.
    그리고 다음강좌 정말 할게 생각안나시면 날짜관련된 예약기능포함된 강좌해주시면 좋겠습니다. 미니 팬션예약같은 혹시라도 다음강좌 진행해야되는데 마땅히 할게없다면 이걸로 해주시구요 다른강좌도 좋습니다.

    진짜좋은강좌 감사합니다. 추천하고갑니다.~
    • 2010/06/09 17:29
      댓글 주소 수정/삭제
      음.. 네 그거 괜찮네요.
  2. 하늘사랑
    2010/06/10 00:44
    댓글 주소 수정/삭제 댓글
    정말 휼륭한 강좌 감사히 보고 있습니다.
    저도 날짜 관련 예약부분과 그에 따른 안내 e-mail
    보내기 강좌를 추천합니다.
    진짜 좋은 강좌에 저도 한표추가 합니다.
  3. 김형우
    2010/06/18 10:57
    댓글 주소 수정/삭제 댓글
    음 저도 같은 생각이네요

    항상 댓글 남기진못하지만

    오늘도 강의잘보구 가구요 수고하셨습니다 ^^
  4. 뉴코크
    2011/04/12 14:32
    댓글 주소 수정/삭제 댓글
    정말 좋은 강좌입니다. 많이 배우고 갑니다. 감사합니다.

이번시간에는 상품관리에 대해 배워보도록 하겠습니다.

원래는 관리자가 등록하지만 간단하게 하느라 회원들에 권한을 주지 않았기 때문에 아무나 등록 가능하도록 했습니다.

이 부분은 게시판과 동일하다고 보시면 됩니다.

그래서 꼭 필요한 부분만 설명하도록 하겠습니다.

우선 상품목록입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 한 페이지에 보일 상품 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";


// 4. 전체 상품 갯수 알아내기
$sql = "select count(*) as cnt from m__item where 1 ";
$total_count = sql_total($sql);


// 5. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count, "");

// 6. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 5. 상품목록 구하기
$query = "select * from m__item where 1 limit ".$from_record.", ".$page_row;
$result = mysql_query($query, $connect);

?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">상품관리 - 상품목록</td>
    </tr>
</table>
<br/>
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
        <td align="center" valign="middle" width="70%" style="height:30px;background-color:#CCCCCC;">상품명</td>
        <td align="center" valign="middle" width="25%" style="height:30px;background-color:#CCCCCC;">상품가격</td>
    </tr>
<?
// 6.데이터 갯수 체크를 위한 변수 설정
$i = 0;

// 7.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - (($page - 1) * $page_row) - $i )?></td>
        <td align="left" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./item_modify.php?i_idx=<?=$data[i_idx]?>&page=<?=$page?>"><?=$data[i_name]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=number_format($data[i_price])?>원</td>
    </tr>
<?
    // 8.데이터 갯수 체크를 위한 변수를 1 증가시킴
    $i++;
}

// 9.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="3" style="height:50px;background-color:#FFFFFF;">상품이 하나도 없습니다.</td>
    </tr>
<?
}
?>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><?=$paging_str?></td>
    </tr>
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 상품등록 " onClick="location.href='./item_insert.php';"></td>
    </tr>
</table>
[item_list.php 소스]

게시판때와 다른 부분은 전혀 없습니다. 간단하죠?

다음은 상품 등록 부분입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">상품관리 - 상품등록</td>
    </tr>
</table>
<br/>
<form name="itemForm" method="post" action="./item_save.php" style="margin:0px;">
<!-- 4. 등록이면 mode 의 값은 insert 수정이면 modify -->
<input type="hidden" name="mode" value="insert">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="i_name" style="width:800px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품가격</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="i_price" style="width:100px;">원</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품설명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><textarea name="i_explain" style="width:800px;height:200px;"></textarea></td>
    </tr>
    <!-- 5. 상품등록 버튼 클릭시 입력필드 검사 함수 item_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 상품등록 " onClick="item_save();"> <input type="button" value=" 목록 " onClick="location.href='./item_list.php?page=<?=$_GET[page]?>';"></td>
    </tr>
</table>
</form>
<script>
// 6.입력필드 검사함수
function item_save()
{
    // 7.form 을 f 에 지정
    var f = document.itemForm;

    // 8.입력폼 검사
    if(f.i_name.value == ""){
        // 9.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("상품명을 입력해 주세요.");
        return false;
    }

    if(f.i_price.value == ""){
        alert("상품가격을 입력해 주세요.");
        return false;
    }else{
        // 10.숫자인지 검사
        for (var i = 0; i < f.i_price.value.length; i++){
            if (f.i_price.value.charAt(i) < '0' || f.i_price.value.charAt(i) > '9'){
                alert("상품가격은 숫자로 입력해 주세요.");
                return false;
            }
        }

    }

    if(f.i_explain.value == ""){
        alert("상품설명을 입력해 주세요.");
        return false;
    }

    // 11.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[item_insert.php 소스]

화면


여기서 게시판과 다른 부분이 있습니다.

첫번째는 4번의 <input type="hidden" name="mode" value="insert"> 부분입니다.

이것은 item_save.php 에서 저장인지 등록인지를 구분하기 위한 변수입니다.

10번에서 자바스크립트에서 숫자인지 검사하는 부분입니다.

자바스크립트에서 length 는 배열의 갯수또는 글자수를 의미합니다.

for 문으로 글자수만큼 반복하게 합니다.

chatAt(i)은 몇번째 글자만 빼내는 겁니다. 즉 글자수만큼 반복하면서 해당글자가 0 ~ 9 사이의 글자가 아니면 숫자가 아니므로 함수를 빠져나가게 합니다.

이제 저장할 차례죠.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 넘어온 변수 검사
if(trim($_POST[mode]) != "insert" && trim($_POST[mode]) != "modify"){
    alert("정상적인 접근이 아닙니다.");
}


if(trim($_POST[i_name]) == ""){
    alert("상품명을 입력해 주세요.");
}

if(trim($_POST[i_price]) == ""){
    alert("상품가격을 입력해 주세요.");
}

if(!is_numeric($_POST[i_price])){
    alert("상품가격을 숫자로 입력해 주세요.");
}

if(trim($_POST[i_explain]) == ""){
    alert("상품설명을 입력해 주세요.");
}

// 4. 등록, 수정인지에 따라서 상품정보 적기
if($_POST[mode] == "insert"){
    $sql = "insert into m__item (i_name, i_price, i_explain) values ('".trim($_POST[i_name])."', ".trim($_POST[i_price]).", '".$_POST[i_explain]."')";
    sql_query($sql);

    // 5. 상품등록 고유번호 알아내기
    $i_idx = mysql_insert_id();

    alert("상품등록이 완료 되었습니다.","./item_modify.php?i_idx=".$i_idx);

}else if($_POST[mode] == "modify" && $_POST[i_idx]){

    $i_idx = $_POST[i_idx];
    $sql = "update m__item set i_name = '".trim($_POST[i_name])."', i_price = ".trim($_POST[i_price]).", i_explain = '".$_POST[i_explain]."' where i_idx = '".$i_idx."'";
    sql_query($sql);
    alert("상품등록이 완료 되었습니다.","./item_modify.php?i_idx=".$i_idx."&page".$_POST[page]);

}else{
    alert("정상적인 접근이 아닙니다.");
}
?>
[item_save.php 소스]

저장하는 부분을 보면 변수 검사시에 못보던 함수가 나옵니다.

is_numeric() 함수는 인자로 들어온것이 숫자인지 아닌지를 검사하는 함수입니다.

즉 가격이 숫자인지 아닌지 검사하는 부분이죠.

그리고 $_POST[mode]의 값으로 item_insert.php 에서 온 등록인지 item_modify.php 에서 온 수정인지를 구분해서 저장부분을 다르게 합니다.

이제 수정부분입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 상품 존재 검사
$data = sql_fetch("select * from m__item where i_idx = '".$_GET[i_idx]."'");
if(!$data[i_idx]){
    alert("존재하지 않는 상품입니다.");
}
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">상품관리 - 상품수정</td>
    </tr>
</table>
<br/>
<form name="itemForm" method="post" action="./item_save.php" style="margin:0px;">
<!-- 4. 등록이면 mode 의 값은 insert 수정이면 modify -->
<input type="hidden" name="mode" value="modify">
<input type="hidden" name="page" value="<?=$_GET[page]?>">
<input type="hidden" name="i_idx" value="<?=$data[i_idx]?>">

<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="i_name" style="width:800px;" value="<?=$data[i_name]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품가격</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="i_price" style="width:100px;" value="<?=$data[i_price]?>">원</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">상품설명</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><textarea name="i_explain" style="width:800px;height:200px;"><?=$data[i_explain]?></textarea></td>
    </tr>
    <!-- 5. 상품수정 버튼 클릭시 입력필드 검사 함수 item_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 상품수정 " onClick="item_save();"> <input type="button" value=" 목록 " onClick="location.href='./item_list.php?page=<?=$_GET[page]?>';"></td>
    </tr>
</table>
</form>
<script>
// 6.입력필드 검사함수
function item_save()
{
    // 7.form 을 f 에 지정
    var f = document.itemForm;

    // 8.입력폼 검사
    if(f.i_name.value == ""){
        // 9.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("상품명을 입력해 주세요.");
        return false;
    }

    if(f.i_price.value == ""){
        alert("상품가격을 입력해 주세요.");
        return false;
    }else{
        // 10.숫자인지 검사
        for (var i = 0; i < f.i_price.value.length; i++){
            if (f.i_price.value.charAt(i) < '0' || f.i_price.value.charAt(i) > '9'){
                alert("상품가격은 숫자로 입력해 주세요.");
                return false;
            }
        }
    }

    if(f.i_explain.value == ""){
        alert("상품설명을 입력해 주세요.");
        return false;
    }

    // 11.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[item_modify.php 소스]

이곳에서도 <input type="hidden" name="mode" value="modify"> 를 사용해서 mode 의 값을 수정을 나타내는 modify 로 정해줍니다.

게시판을 배우고 나니 정말 쉽죠?

게시판이 거의 모든 프로그램의 기본입니다.

DB에서 목록과 데이터를 읽고 또 데이터를 쓰고 수정하고 삭제하는 모든게 있습니다.

혹시 여기서 이해가 되지 않는다면 게시판 만드는 부분부터 다시 공부하셔야합니다.

그럼 다음 시간에는 쇼핑몰에서 상품 목록과 상품보기 그리고 장바구니까지 배우도록 하겠습니다.

저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 손재민
    2010/06/06 11:34
    댓글 주소 수정/삭제 댓글
    [php 강좌] 51 이 기대가 됩니다.
  2. 김형우
    2010/06/06 13:32
    댓글 주소 수정/삭제 댓글
    기다리고기다리던 강의를 다시뵈서 좋네요

    거진 몇개월을 확인하러왔다가 그냥 갔었는데 ㅠㅠ 역시 기다린 보람이있네요 ^^

포인트몰 만들기의 두번째 시간입니다.

지난시간에는 DB 를 설계 하였는데요.

먼저 기본 인클루되는 파일들입니다.

<?
//######################################
//
//  사용자정의함수파일 : lib.php
//
//######################################

$mysql_host = 'localhost';
$mysql_user = 'handsome';
$mysql_password = 'handsome';
$mysql_db = 'handsome';

//DB 접속 및 데이터 베이스 선택 사용자 함수
function sql_connect($db_host, $db_user, $db_pass, $db_name)
{
    $result = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
    mysql_select_db($db_name) or die(mysql_error());
    return $result;
}

// 쿼리 함수
function sql_query($sql)
{
    global $connect;
    $result = @mysql_query($sql, $connect) or die("<p>$sql<p>" . mysql_errno() . " : " .  mysql_error() . "<p>error file : $_SERVER[PHP_SELF]");
    return $result;
}

// 갯수 구하는 함수
function sql_total($sql)
{
    global $connect;
    $result_total = sql_query($sql, $connect);
    $data_total = mysql_fetch_array($result_total);
    $total_count = $data_total[cnt];
    return $total_count;
}

// 쿼리를 실행한 후 결과값에서 한행을 구하는 함수
function sql_fetch($sql, $error=TRUE)
{
    $result = sql_query($sql, $error);
    $row = mysql_fetch_array($result);
    return $row;
}

// 쿼리를 실행 한 후 결과값의 목록을 배열로 구하는 함수
function sql_list($sql)
{
    $sql_q = sql_query($sql);
    $sql_list = array();
    while($sql_r = mysql_fetch_array($sql_q)){
        $sql_list[]= $sql_r;
    }

    return $sql_list;
}


// 경고창 띄우고 이동시키는 함수
function alert($msg='', $url='')
{
    if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.';
    echo "<script language='javascript'>alert('$msg');";
    echo "</script>";
    if($url){
        goto_url($url);
    }else{
        echo "<script language='javascript'>history.back();";
        echo "</script>";
    }
    exit;
}

// 페이지 이동시키는 함수
function goto_url($url)
{
    echo "<script language='JavaScript'> location.replace('$url'); </script>";
    exit;
}


// 페이징 사용자 함수
function paging($page, $page_row, $page_scale, $total_count, $ext = '')
{
    // 1. 전체 페이지 계산
    $total_page  = ceil($total_count / $page_row);

    // 2. 페이징을 출력할 변수 초기화
    $paging_str = "";

    // 3. 처음 페이지 링크 만들기
    if ($page > 1) {
        $paging_str .= "<a href='".$_SERVER[PHP_SELF]."?page=1&'".$ext.">처음</a>";
    }

    // 4. 페이징에 표시될 시작 페이지 구하기
    $start_page = ( (ceil( $page / $page_scale ) - 1) * $page_scale ) + 1;

    // 5. 페이징에 표시될 마지막 페이지 구하기
    $end_page = $start_page + $page_scale - 1;
    if ($end_page >= $total_page) $end_page = $total_page;

    // 6. 이전 페이징 영역으로 가는 링크 만들기
    if ($start_page > 1){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($start_page - 1)."&'".$ext.">이전</a>";
    }

    // 7. 페이지들 출력 부분 링크 만들기
    if ($total_page > 1) {
        for ($i=$start_page;$i<=$end_page;$i++) {
            // 현재 페이지가 아니면 링크 걸기
            if ($page != $i){
                $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$i."&'".$ext."><span>$i</span></a>";
            // 현재페이지면 굵게 표시하기
            }else{
                $paging_str .= " &nbsp;<b>$i</b> ";
            }
        }
    }

    // 8. 다음 페이징 영역으로 가는 링크 만들기
    if ($total_page > $end_page){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($end_page + 1)."&'".$ext.">다음</a>";
    }

    // 9. 마지막 페이지 링크 만들기
    if ($page < $total_page) {
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$total_page."&'".$ext.">맨끝</a>";
    }

    return $paging_str;
}

// 세션사용은 위한 초기화
session_start();

// DB 연결
$connect = sql_connect($mysql_host, $mysql_user, $mysql_password, $mysql_db);
?>
[lib.php 소스] 사용하는 함수들의 모음 파일


<?
include "./lib.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>PHPer's Heaven 포인트몰</title>
</head>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">
        PHPer's Heaven 포인트몰
        </td>
    </tr>
</table>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./index.php">포인트몰</a></td>
    <?
    // 1.로그인 여부에 따라 상단 메뉴가 다르게
    if($_SESSION[user_idx]){
    ?>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./cart.php">장바구니</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./member.php">구매내역</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./point.php">포인트관리</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./order_list.php">판매내역</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./item_list.php">상품관리</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./logout.php">로그아웃</a></td>
    <?}else{?>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./member_join.php">회원가입</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./login.php">로그인</a></td>
    <?}?>
    </tr>
</table>
<br>
[head.php 소스] 모든 파일의 상단과 인클루드 파일을 포함한 파일

메뉴를 보면 포인트를 사는 포인트몰, 장바구니와 본인의 구매내역, 포인트를 구매하고 구매한 목록을 보는 포인트관리, 판매한 내역을 보는 판매내역, 상품을 관리하는 상품관리가 있습니다.

이번시간에는 기존에 해봤던 회원가입, 로그인, 로그아웃 과 포인트관리를 배워봅니다.

일단 회원 부분은 설명없이 소스만 보고 가도록 하겠습니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}

// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원가입</td>
    </tr>
</table>
<br/>
<form name="registForm" method="post" action="./member_join_save.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">아이디</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_id" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">이름</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_name" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호 확인</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass2" style="width:380px;"></td>
    </tr>
    <!-- 4. 회원가입 버튼 클릭시 입력필드 검사 함수 member_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 회원가입 " onClick="member_save();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function member_save()
{
    // 6.form 을 f 에 지정
    var f = document.registForm;

    // 7.입력폼 검사
    if(f.m_id.value == ""){
        // 8.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("아이디를 입력해 주세요.");
        return false;
    }

    if(f.m_name.value == ""){
        alert("이름을 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value != f.m_pass2.value){
        // 9.비밀번호와 확인이 서로 다르면 경고창으로 메세지 출력 후 함수 종료
        alert("비밀번호를 확인해 주세요.");
        return false;
    }

    // 10.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[member_join.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_id]) == ""){
    alert("아이디를 입력해 주세요.");
}

if(trim($_POST[m_name]) == ""){
    alert("이름을 입력해 주세요.");
}

if($_POST[m_pass] == ""){
    alert("비밀번호를 입력해 주세요.");
}

if($_POST[m_pass] != $_POST[m_pass2]){
    alert("비밀번호를 확인해 주세요.");
}

// 4. 같은 아이디가 있는지 검사
$chk_sql = "select * from m__member where m_id = '".trim($_POST[m_id])."'";
$chk_result = sql_query($chk_sql);
$chk_data = mysql_fetch_array($chk_result);

// 5. 가입된 아이디가 있으면 되돌리기
if($chk_data[m_idx]){
    alert("이미 가입된 아이디 입니다.");
}

// 6. 회원정보 적기
$sql = "insert into m__member (m_id, m_name, m_pass, m_point) values ('".trim($_POST[m_id])."', '".trim($_POST[m_name])."', '".$_POST[m_pass]."', 0)";
sql_query($sql);

// 7. 로그인 페이지로 보내기
alert("회원가입이 완료 되었습니다.","./index.php");
?>
[member_join_save.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}
// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원 로그인</td>
    </tr>
</table>
<br/>
<form name="loginForm" method="post" action="./login_chk.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">아이디</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_id" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <!-- 4. 로그인 버튼 클릭시 입력필드 검사 함수 login_chk 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 로그인 " onClick="login_chk();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function login_chk()
{
    // 6.form 을 f 에 지정
    var f = document.loginForm;

    // 7.입력폼 검사
    if(f.m_id.value == ""){
        // 8.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("아이디를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    // 9.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[login.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_id]) == ""){
    alert("아이디를 입력해 주세요.");
}

if($_POST[m_pass] == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 4. 같은 아이디가 있는지 검사
$chk_sql = "select * from m__member where m_id = '".trim($_POST[m_id])."'";
$chk_result = sql_query($chk_sql);
$chk_data = mysql_fetch_array($chk_result);

// 5. 아이디가 존재 하는 경우
if($chk_data[m_idx]){

    // 6. 입력된 비밀번호와 저장된 비밀번호가 같은지 비교해서
    if($_POST[m_pass] == $chk_data[m_pass]){
        // 7. 비밀번호가 같으면 세션값 부여 후 이동
        $_SESSION[user_idx] = $chk_data[m_idx];
        $_SESSION[user_id] = $chk_data[m_id];
        $_SESSION[user_name] = $chk_data[m_name];
       
        alert("환영합니다.", "./index.php");
    }else{
        // 8. 비밀번호가 다르면
        alert("비밀번호가 다릅니다.");
    }
}else{
    // 9. 아이디가 존재하지 않으면
    alert("존재하지 않는 회원입니다.");
}
?>
[login_chk.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 모든 세션값을 빈값으로
$_SESSION[user_idx] = "";
$_SESSION[user_id] = "";
$_SESSION[user_name] = "";

session_destroy();

alert("로그아웃이 되었습니다.", "./login.php");
?>
[logout.php 소스]

이전에도 많이 설명했으니 아시리라 봅니다.

이제 포인트 구매페이지 입니다.

포인트 구매 페이지에서는 현재 자신이 보유한 포인트를 볼수 있고 또 포인트를 구매할 수 있는 페이지 입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 회원 데이터 불러오기
$sql = "select * from m__member where m_idx = '".$_SESSION[user_idx]."'";
$m_data = sql_fetch($sql);

// 4. HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;font-zise:15px;font-weight:bold;">보유 포인트</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=number_format($m_data[m_point])?>점</td>
    </tr>
</table>
<br/>
<form name="registForm" method="post" action="./point_save.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">포인트 구매</td>
    </tr>
    <tr>
        <td align="center" valign="middle" height="80">
        <input type="radio" name="b_point" value="1000" checked> 1,000 포인트
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input type="radio" name="b_point" value="5000"> 5,000 포인트
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input type="radio" name="b_point" value="10000"> 10,000 포인트
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input type="radio" name="b_point" value="50000"> 50,000 포인트
        </td>
    </tr>
    <tr>
        <td align="center" valign="middle"><input type="submit" value=" 포인트 구매 "></td>
    </tr>
</table>
</form>
[point.php 소스]

우선 2번에서 로그인 여부를 체크한 후 3번에서 현재 회원의 포인트 정보를 불러 옵니다.

현재 포인트를 표시할때 사용한 number_format 함수가 보이실겁니다.

이 함수는 인자로 받은 변수를 숫자형태로 보여주면서 천단위 즉 세자리 마다 ',' 를 찍어 줍니다.

입력받은 변수 뒤에 인자를 추가해서 표시되는 소수점 자리수와 소수점 기호 '.'과 천단위 구분기호 ',' 를 변경할 수도 있습니다.

함수에 대한 자세한 내용은 이 블로그 오른쪽에 php 함수 검색을 통해 살펴 보시면 됩니다.

그리고 포인트 구매를 위해서 구매할 포인트들을 선택하게 해 줍니다.

이때 radio 태그가 사용되었는데요. radio 태그는 같은 이름(name)으로 여러개를 사용해서 그중에 하나를 선택하는 태그입니다.

그리고 선택이 되면 검사할게 없으므로 바로 submit 태그로 저장페이지로 넘깁니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 하지 않은 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인하셔야 이용이 가능합니다.", "./login.php");
}

// 3. 포인트 더하기
$sql = "update m__member set m_point = m_point + ".$_POST[b_point]." where m_id = '".$_SESSION[user_id]."'";
sql_query($sql);

// 4. 포인트관리 페이지로 보내기
alert("포인트 구매가 완료 되었습니다.","./point.php");
?>
[point_save.php 소스]

point.php 에서 구매를 희망하는 포인트를 더해주는 페이지 입니다.

실제 포인트몰에서는 point.php 와 point_save.php 사이에 결제모듈이 들어가서 결제 결과에 따라 포인트를 올려주거나 실패메세지를 보여줍니다.

여기서는 결제모듈없이 바로 구매되는 형태로 구현했습니다.

3번에 보면 sql 문이 구매한 포인트를 더해주는 부분입니다.

update m__member set m_point = m_point + ".$_POST[b_point]." where m_id = '".$_SESSION[user_id]."'

사용자 테이블에서 포인트 필드인 m_point 의 값을 기존 m_point 에 넘어온 변수 b_point 를 더한값을 업데이트 하라는 sql 문입니다.

쉽죠? ^^

실제 화면으로 보시면

5000 포인트 구매전


5000 포인트 구매후

포인트가 변화된것을 보실수 있습니다.

그럼 다음시간에는 상품을 등록하고 관리하는 상품관리를 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 2010/06/24 15:04
    댓글 주소 수정/삭제 댓글
    회원가입을 처음 하였읍니다
  2. 2010/06/24 15:05
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  3. 김기태
    2010/08/05 12:04
    댓글 주소 수정/삭제 댓글
    와우 잘만드셨네요...
  4. 2010/11/08 18:35
    댓글 주소 수정/삭제 댓글
    잘보고 갑니다 ㅎㅎ
    그 한가지 수정할점이 있는거 같은데요
    session_start(); 오류 계속 뜨느라 하루종일 고생했는데 앞에 @이 빠진거 같네요.. ㅠㅠ
    • 2010/11/09 04:35
      댓글 주소 수정/삭제
      @는 warning 을 무시하라는 뜻이구요.
      워닝이 뜬다면 session_start() 앞에 뭔가 출력되는 문자가 있어서 일거예요.
    • 2010/11/09 04:36
      댓글 주소 수정/삭제
      사이트 보니까
      Cannot send session cookie - headers already sent by (output started at /home/blythe/public_html/header.php:14) in /home/blythe/public_html/lib.php on line 136
      이런 메세지가 뜨는데요. headers already sent by
      이 부분이 먼저 어떤건지 모르지만 출력되었다는거예요.
  5. 2010/11/12 00:54
    댓글 주소 수정/삭제 댓글
    아 댓글 남겨주셨네요 ㅎㅎ
    저건 아직 인덱스 수정을 안해서..
    수정파일은 다 다른데에 ㅎㅎ
    그냥 @붙여도 큰문제 없어서 쓰고있답니다 ㅎ
  6. 신희승
    2010/11/17 14:02
    댓글 주소 수정/삭제 댓글
    안녕하세요 덕분에 많은걸 얻어 갑니다^^초보자에게 정말 좋은 정보같네요.
    다름이 아니고 몇명 파일이 index.php로 링크가 걸리던데

    작성자님꼐서 작성하신 소스에 아무리 찾아봐도 index.php는 없네요ㅠ.ㅠ
    설명 좀 부탁 드리곘습니다^^
  7. 임철균
    2011/09/26 10:54
    댓글 주소 수정/삭제 댓글
    정말로 좋은소스들이내요
    초보자라 많이 배워가요

그동안 제가 너무 바쁘고 이거저거 추스릴 틈이 없어서 강좌를 쉬었습니다.

지난번 약속드렸던 포인트몰부터 다시 강좌를 시작합니다.

많이 기다려 주신분 들께 죄송하다는 말씀을 드리면서 앞으로 더욱 열심히 강좌 올려보도록 하겠습니다.

포인트 몰이 끝나면 어떤 내용의 강좌가 되었으면 하는지 댓글로 남겨주시면 여러분의 의견을 반영해서 강좌를 꾸려가보도록 하겠습니다.

꼭 하나의 완성된 프로그램이 아니더라도 그 안에 들어가는 컴퍼넌트 (썸네일 만들기, 이미지 편집, 동적테이블 등) 들도 괜찮습니다.

단 상업적으로 이용하기 위한 내용 - PG 모듈 분석 같은 내용 - 은 피했으면 합니다.

제 강좌는 PHP 를 알리고 또 어느정도 수준까지 쉽게 배우기 위해 쓰는것일뿐

제 강좌를 이용해 자신의 업무내용에 사용하겠다 라는 생각은 없었으면 합니다.

PHP 프로그래머 라는 이름을 달고 업무를 하려면 제 강좌뿐만이 아니라 좀더 심도있는 학습을 하셔야 하기 때문입니다.


저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. 낭만
    2010/05/25 01:28
    댓글 주소 수정/삭제 댓글
    오 드디어~~~
    • 2010/05/25 14:00
      댓글 주소 수정/삭제
      네 간만에 다시 하게되었네요 ^^
  2. 골목대장
    2010/05/28 09:46
    댓글 주소 수정/삭제 댓글
    우와 드디어 다시하시는군요 정말 감사합니다.
  3. 김재명
    2010/06/04 02:12
    댓글 주소 수정/삭제 댓글
    헉 당장이라도 가고싶지만. 아흑 먹고사는문제때문에 ㅜㅜ
    강좌 감사합니다.
  4. 에르네스토
    2010/06/12 17:04
    댓글 주소 수정/삭제 댓글
    멋지십니다
    근데 어떻게 그렇게 마음도 넓으신지
    너무 고마우신분 같아요
  5. hdh
    2011/02/22 01:25
    댓글 주소 수정/삭제 댓글
    카드, 무통장입급, 핸드폰 등의 실 결제 수단을 구현하는 방법이 궁금합니다.
    제발~! 꼬옥~! 알려주세요!!!!!!!!!!!!!!!!!!!!!!!
    • 2011/02/24 17:51
      댓글 주소 수정/삭제
      PG사에서 모듈을 제공하구요. 모듈제공시에 매뉴얼에 구현방법이 예제까지 나와있습니다.

안녕하세요. 너무너무 오랜만에 뵙습니다.

그 동안 프로젝트 때문에 많이 바빠서 약속한 강의 일정을 지키지 못해서 죄송합니다.

그간 기다려 주신분들이 계신지는 모르지만 (계시리라 믿습니다 ^^) 기다려주셔서 감사드립니다.

그러면 이번 시간에는 지난번에 말씀드린대로 쇼핑몰의 기본이 되는 포인트 몰을 만들어 보도록 하겠습니다.

오늘은 그 첫번째로 전체적인 기획 내용과 데이터베이스 설계 부분에 대해 알아보도록 하겠습니다.

그런데 왜 쇼핑몰인데 포인트 몰이냐? 하시겠죠?

여기서 제가 말하는 포인트 몰은 포인트로 물건을 구매 하는 것을 이야기 합니다.

즉 쇼핑몰과 과정은 똑같으나 그 지불수단중에서 카드, 무통장입급, 핸드폰 등의 실 결제 수단을 제외한 포인트로 결제하는 것이기 때문에 쇼핑몰과 결제 부분을 제외하면 동일한 내용이 됩니다.

그리고 실제로 포인트를 구매 한 후 물건을 사는 경우의 쇼핑몰도 있습니다.

자 그럼 우리가 만들고자 하는 포인트 몰의 기능정의 입니다.

1. 포인트는 포인트 구매 메뉴에서 구매 버튼을 누르면 구매가 된다.

2. 판매내역, 상품올리기는 권한 제한을 두지 않고 누구나 보고, 만들수 있게 한다. (카테고리는 없고 상품내용도 아주 간단하게)

3. 물건은 포인트로 구매하며 마이페이지에서 내가 산 물건들을 볼수 있게 한다.

4. 주문을 하고 포인트로 결제하면 모든 거래과정이 끝난다.

5. 배송은 생략한다.

6. 거래단계의 변화(주문, 거래완료)는 관리하지 아니한다.


위와 같이 최소한의 기능을 가진 포인트 몰을 만들어 보도록 하겠습니다.

우선 데이터베이스들을 설계 해 보도록 하죠.

1. 회원 테이블 (m__member)

어드민은 두지 않기로 했으니 level 은 필요 없구요. 단 회원들의 보유 포인트를 적기 위해 m_point 란 필드를 만들었습니다.

2. 상품 테이블 (m__item)


간단하게 고유번호, 상품명, 상품설명, 상품가격 만 만들었습니다.

3. 거래 테이블 (m__order)


고유번호, 주문자 고유번호, 주문자이름, 거래금액, 거래상태 (결제대기, 거래완료), 주문일자

4. 장바구니 테이블 (m__cart)


고유번호 , 주문고유번호, 주문자 고유번호, 상품 고유번호, 주문수량, 상품가격

이런 정도로만 하면 아주 간단한 내용으로 만들수 있습니다.

그러면 다음 시간에는 회원가입, 포인트 구매를 배워보도록 하겠습니다.

가급적이면 기존의 스케쥴대로 화요일과 목요일에 포스팅 할 예정입니다. 단 먹고 사는 문제때문에 가끔 다른 요일에 포스팅 될수도 있으니 양해 바랍니다.


저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. phper k
    2010/05/25 21:35
    댓글 주소 수정/삭제 댓글
    정말 많이 기다렸는데....^^
    이제야 다시 들을 수 있어서 너무 좋네요.
  2. 김재명
    2010/06/04 02:08
    댓글 주소 수정/삭제 댓글
    켁..... 이런곳이 있었네요?
    ㅋㅋㅋㅋㅋㅋㅋ 행복합니다. 너무 감사합니다.
    공부 열심히 하겠습니다.
  3. 정진성
    2010/07/30 09:36
    댓글 주소 수정/삭제 댓글
    정말 이런 강좌를 무료로 올려주시니 너무 갑사할 따름입니다. 정말 감사합니다.
  4. 서상현
    2010/12/06 10:43
    댓글 주소 수정/삭제 댓글
    이거 지금 계속 DB에 한글로 안들어가지가고 ???이렇게 물음표랑 영어랑 섞여서 들어갑니다.
    DB에 한글 저장이 안되는것 같은데 어떻게 하면 좋을까요???
  5. 질문요
    2012/04/03 23:40
    댓글 주소 수정/삭제 댓글
    데이터베이스저런걸 무슨프로그램에서하는거죠 ㅠ?

강좌 휴강안내

2010/01/19 11:23
제가 프로젝트가 너무 밀려서요.

다음주 그러니까 1월 26일에 다시 시작하도록 하겠습니다.

포인트를 이용한 쇼핑몰 이 진행될 예정이니 조금만 기다려 주세요.
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. phper k
    2010/01/19 18:36
    댓글 주소 수정/삭제 댓글
    공부 할 수 있게 해 주셔서 항상 감사합니다. 프로젝트 잘 되셨으면 좋겠네요.
    그럼 1월 26일 뵙겠습니다.
    • 2010/01/19 22:55
      댓글 주소 수정/삭제
      네 감사합니다 ^^
      잘되야죠 ㅎㅎ
  2. phper k
    2010/02/02 13:57
    댓글 주소 수정/삭제 댓글
    혹시나 해서 들어왔는데 프로젝트 하시느라고 많이 바쁘시나봐여 빨리 프로젝트 좋은성적 내시고 좋은강좌 봤으면 좋겠네요.
    • 2010/02/02 15:48
      댓글 주소 수정/삭제
      블로그는 쳐다 보는데
      플젝때문에 머리가 다른곳으로 가질 않아요 ㅜㅜ
      최대한 시간 내보도록 할께요 ㅜㅜ
  3. phper k
    2010/02/03 14:42
    댓글 주소 수정/삭제 댓글
    감사합니다. 일이 더 중요하니까 일 잘 끝내시고 좋은 강좌 부탁드립니다.수고하세요.
  4. 2010/02/25 12:32
    댓글 주소 수정/삭제 댓글
    성공적으로 업무 마무리하시고 좋은 강좌가 어서 계속되어서 엔딩까지 갈 수 있었으면 좋겠습니다.
    아자아자 화이팅~
  5. 킥스
    2010/03/15 06:02
    댓글 주소 수정/삭제 댓글
    에공....강좌가 아직....목빠지게 기다리고 있습니다

    반드시 강좌가 끝까지 이어졌으면 좋겠습니다 ^^
  6. 크롬
    2010/03/20 12:12
    댓글 주소 수정/삭제 댓글
    얼렁얼렁 나왔으면좋겠다
  7. 2010/03/24 11:41
    댓글 주소 수정/삭제 댓글
    많이 바빴습니다 ^^
    4월이 되면 다시 시작하도록 하겠습니다. ^^
  8. 나무
    2010/03/24 18:44
    댓글 주소 수정/삭제 댓글
    먹고 사는게 우선이죠..!!
    시간되실때 부탁드립니다.
  9. 킥스
    2010/03/31 06:32
    댓글 주소 수정/삭제 댓글
    아~ 4월에 시작되는군요

    드뎌 기다리던 강좌가 시작된다니 기쁨 만땅입니다.

    화이팅~!
  10. gang
    2010/04/06 21:47
    댓글 주소 수정/삭제 댓글
    슬픈기쁨님의 강좌는 어느 책, 어느 강의보다 쉽게 이해가 되서 너무 좋아요^^
    많이 배우고, 남는 강좌입니다~

    어서, 기다리는 강좌도 빨리 시작이 됐으면 좋겠어요^^;;
    수고하시고~
    항상 감사합니다:)
  11. 2010/04/16 14:17
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  12. php-novice
    2010/05/17 10:10
    댓글 주소 수정/삭제 댓글
    언넝 시작해 주세요 (+.,+;)
    슬픈기쁨님의 멋진강좌를 듣고파~~
  13. ccs0097
    2011/01/31 18:10
    댓글 주소 수정/삭제 댓글
    sdfsf
  14. ccs0097
    2011/01/31 18:12
    댓글 주소 수정/삭제 댓글
    정말 많이 배움니다...
    감사드려요...^_^ ^_^ ^_^
  15. 2011/02/18 15:50
    댓글 주소 수정/삭제 댓글
    정말 많이 배우고 가요 ~
    지금 소셜네트워크서비스 구축하는데 많은 도움이 됐습니다
    감사합니다

<< PREV : [1] : [2] : [3] : [4] : [5] : ... [6] : NEXT >>

BLOG main image
PHPer를 위한 Tip , 휴식, 그리고........ by 슬픈기쁨

카테고리

분류 전체보기 (120)
PHP Tip (9)
PHP 강좌 (58)
Project 이야기 (5)
My Story (15)
꼬리 & 달이 이야기 (19)
의뢰하기 (1)
흥얼흥얼 (12)
Total : 160,044
Today : 26 Yesterday : 227