'전체 글'에 해당되는 글 1607건

  1. 2015.12.11 PHP 기초 강좌
  2. 2015.12.11 날짜 구하기
  3. 2015.12.11 MD5방식 암호화

PHP 기초 강좌

Programming/Php 2015. 12. 11. 14:46





반응형

현재 웹프로그래밍에는 ASP, PHP, JSP 등이 많이 사용되고 있습니다.
그런데 왜 PHP를 선택했는가?

이건 순전히 제 개인적인 취향때문입니다.
(참고로 이 사이트는 PHP 페이지가 많습니다. zero님의 zeroboard가 PHP로 만들어졌는데, 이 사이트도 zeroboard를 기반으로 하고 있습니다.)

저는 위의 세가지 언어 중에서 어느 것이 더 훌륭하다고 평가할 수는 없습니다. 많은 사람들이 각각에 대한 장단점을 나열하기도 하고 심지어는 어느 것은 형편없다고까지 얘기하기도 하지만 제가 그런 말들을 인용하여 언어에 대한 편견을 확대시키고 싶지는 않습니다.

ITmembers.net의 모든 학습이 그러하듯 지금부터 시작되는 PHP 학습 역시 특정 툴이나 언어의 홍보에 목적이 있는 것이 아니라 웹 프로그래밍의 기본을 이해하기 위한 것입니다.
사실 어떤 언어를 쓰든 그것은 개인적인 취향에 따라 다를 수 있습니다. 중요한 것은 원하는 결과만 나오면 된다는 것입니다.

이 학습은 오직 웹 프로그래밍에 대한 기본적인 이해와 기초적인 실습에 중점을 두었습니다.(그 이상은 저도 못합니다.)
보다 전문적인 강좌는 PHP 전문 프로그래머의 강좌를 보시기 바랍니다.

본 학습은 중앙교육진흥연구소에서 발간한 Webmaster 시리즈 중의 하나인『Easy&Fast PHP』에서 아이디어를 얻었습니다.
기본적인 학습 순서가 위 책의 목차를 따르되 인터넷 강좌의 성격상 많은 부분 요약된 형태로 진행하며, 저자의 저작권을 존중하여 대부분의 예제는 변형하여 진행하도록 하겠습니다.

PHP 실습을 위해서는 다음과 같은 프로그램이 있어야 합니다.

  • 에디터
  • PHP
  • Apache
  • MySQL



우선 에디터는 개인적으로 AcroEdit라는 프로그램을 사용합니다.
이유는 Freeware이기 때문이라는 것과 한글이 지원된다는 것 때문입니다.
실제로 전문 프로그래머라면 울트라에디트나 에디트플러스 등의 에디터를 사용하겠지만 단지 학습용이라면 굳이 정식 등록이 필요한 상용 프로그램을 사용할 필요는 없을 것입니다.
그러나 아래 상용 프로그램도 그리 비싼 편은 아니니 구입하는 것도 괜찮으시다면 아래 사이트를 방문해 보시기 바랍니다.
에디트플러스 다운로드
울트라에디트 다운로드

참고로 많은 사람들이 위의 상용 에디터를 크랙하여 사용한다고 하는군요.
저는 귀찮아서 그냥 프리웨어인 AcroEdit를 사용하렵니다.

아크로에디트를 다운로드하시려면 여기(AcroEdit Download)를 클릭하세요

다음으로 필요한 것이 흔히 APM이라고 불리우는 Apache, PHP, MySQL입니다.
Apache는 웹서버, PHP는 PHP 해석기, MySQL은 데이터베이스 관리 프로그램입니다.
보통 PHP나 JSP는 리눅스에서 하는 것이 안정적이라고 하나 우리는 그냥 Windows에서 실습하기로 합니다. 본 학습은 PHP를 통한 웹 프로그램의 이해가 목적입니다. 리눅스와 리눅스에서의 Apache, PHP, MySQL 세팅 등 복잡한 절차까지 모두 밟는다면 저도 힘들고 여러분들도 힘들지 않을까 싶네요.

다행히 APM Setup이라는 훌륭한 Windows용 Apache 서버, PHP 서버, MySQL 서버 일괄 세팅 프로그램이 있어 한번에 설치를 마칠 수 있습니다.(게다가 JSP를 사용할 수 있는 Tomcat 서버까지 사용할 수 있습니다.)

현재까지의 APM Setup 프로그램의 최신 버전은 3.0인데 아래 사이트에서 다운로드하여 그냥 설치하시면 됩니다.(이것 역시 완전 무료인 Freeware입니다.)
아래 페이지에는 자세한 셋업 방법까지 설명되어 있습니다.
굳이 중복 설명할 필요가 없으니 아래 링크를 클릭하여 APM Setup 페이지로 이동하여 자세한 설명을 보시고 설치하시기 바랍니다.

근사모의 APM Setup 페이지 바로가기

이번 시간에는 실제로 PHP 페이지를 하나 만들어 보겠습니다.
그러기 위해서는 먼저 아파치 서버가 정상적으로 작동되어야 합니다.
아파치 서버가 정상적으로 작동되는지 간단하게 테스트해 보고, 아주 기본적은 PHP 페이지 하나 만들어 보겠습니다.


  1. 바탕 화면에 APM_Setup 3 모니터라는 아이콘 보이죠?

    이거 실행하세요.

  2. 다음과 같이 APM_Setup 3 모니터가 보일 것입니다.
    [확인] 단추를 눌러 모니터를 닫아두죠.


  3. 인터넷 익스플로러를 실행하여 주소 입력줄에 http://localhost/를 입력해 보세요.
    그럼 아래 그림과 같이 자동으로 http://localhost/apmsetup/ 또는 http://127.0.0.1/apmsetup/ 페이지로 이동합니다. 그러면 정상입니다. 만약 아파치 서버가 실행되지 않았다면 '페이지를 표시할 수 없습니다.'라는 메시지가 나왔을 것입니다.


    상단 주황색 메뉴에서 PHP4 Info를 클릭해 보세요. PHP 버전이 표시됩니다. 이 글을 쓰고 있는 현재(2002.3.22)의 APM Setup3의 경우 PHP Version 4.1.1이 표시되네요.

  4. 잠깐 탐색기를 실행해서 AMP Setup3이 설치된 드라이브를 살펴보세요. 만약 C: 드라이브에 설치를 했다면 오른쪽 그림과 같은 폴더들이 보일 것입니다.
    지금부터 실습할 예제 파일들은 htdocs 폴더에 저장하시면 됩니다. 바로 이 폴더가 웹 브라우저에서 http://localhost/ 또는 http://127.0.0.1/을 입력하면 기본적으로 표시되는 폴더입니다.
    가만히 살펴보면 이 폴더에 index.html 파일이 있을텐데 일단은 이 파일을 건드리지 마세요. 이 파일이 없으면 http://localhost/라고 했을 때 APM Setup 페이지가 나타나지 않습니다.

    이 정도면 기본적은 세팅은 끝났다고 봐도 되겠습니다.

  5. 텍스트 에디터(메모장이나 울트라에디트, 에디트플러스, 아크로에디트 같은 프로그램)를 실행해서 다음과 같이 입력한 다음, C:\APM_Setup\htdocs\ 폴더에 first.php라는 이름으로 저장하세요.


    직접 입력하세요. 아마도 위의 문장을 드래그해서 복사하려고 해도 안될 겁니다.(그림이니까요.^^)

    무슨 뜻일까요?
    참고로 이 강좌에서는 기본적인 HTML 태그는 설명하지 않습니다. 그것까지 설명하다가 보면 한없이 길어지니까요.
    일단 HTML 태그가 아닌 것만 볼까요.

    • 4행에서 <?php라고 씌여진 거. 대충 감이 오겠지만, 여기서부터 PHP 코드가 시작한다는 것을 나타냅니다. 이거 그냥 <?라고 써도 됩니다.
      그리고 문장 끝에 세미콜론(;)이 있는데, PHP 문의 모든 문장 마지막에는 세미콜론(;)이 있어야 합니다.
    • 8행의 ?>는 PHP 코드가 끝임을 알리죠.
    • 5행의 echo는 큰 따옴표(" ") 안의 문자열을 출력합니다.
    • 6행의 $str은 변수 이름입니다. PHP의 모든 변수 이름 앞에는 $ 표시가 붙습니다.
    • 7행에서는 $str이라는 변수에 저장된 문자열을 출력하라는 것이지요.


  6. 인터넷 익스플로러를 실행해서 주소 입력줄에 http://localhost/first.php라고 입력해 보세요.
    아래와 같은 결과가 나타나나요?


    드디어 성공했습니다.

    생애, 첫 PHP 페이지를 만드신 걸 진심으로 축하드립니다.

 

지난 시간에 PHP를 이용해 페이지 하나를 만들어 봤습니다.
그러면서 PHP는 <?로 시작하고 ?>로 끝난다는 것과 변수 이름 앞에 $ 기호를 쓴다는 것까지 알았습니다.


  1. PHP의 변수

    PHP에서 변수는 정수형, 실수형 외에 문자열, 배열, 객체를 저장할 수 있는 변수가 있습니다. 그러나 그냥 변수명 뒤에 대입만 해 주면 되기 때문에 특별히 프로그래머 입장에서 변수 형을 선언하거나 지정할 필요는 없습니다. PHP가 알아서 변수의 값에 따라 변수 형을 스스로 결정하기 때문입니다.

  2. 배열

    $class라는 변수(배열)에 "손병목", "정광훈", "임재호", "헐랭이"라는 내용을 넣어볼까요.
    일단 아래와 같이 무조건 입력하고 실행해 보세요.(파일 이름은 04array.php로 저장합니다.)

    1 : <?
    2 : $class = array("손병목", "정광훈", "임재호", "헐랭이");
    3 : echo "첫번째 : $class[0] <br>";
    4 : echo "두번째 : $class[1] <br>";
    5 : echo "세번째 : $class[2] <br>";
    6 : echo "네번째 : $class[3] <br>";
    7 :
    8 : $class[3] = "껄떡이";
    9 : echo "네번째 바뀐 값 : $class[3] <br>";
    10 : ?>

    2행에서와 같이 array()함수를 사용해서 한꺼번에 많은 데이터를 입력할 수도 있습니다.
    또는 8행에서와 같이 직접 하나의 데이터를 입력할 수도 있습니다.
    2행에서와 같이 입력하면 $class 변수에 아래와 같은 데이터가 순서대로 저장됩니다.


    배열이 0부터 시작하는 것을 알 수 있습니다. 1부터 시작하는 것이 아닙니다. 주의!
    그리고 array()함수를 사용할 때는 변수 이름을 그냥 $class와 같이 써주면 되고,
    직접 데이터를 입력할 때는 $class[3]과 같이 저장될 데이터의 위치를 [ ] 안에 써 주어야 합니다.

    이런 결과가 안 나왔다면 다위 처음부터 차근차근 살펴 보세요.
    만약 Parse error: parse error in c:\apm_setup\htdocs\array.php on line 5와 같은 오류가 났다면 해당 라인을 주의깊게 살펴 보세요. 분명 어딘가 잘못 입력한 부분이 있을 겁니다.

    배열의 위치를 위와 같이 0, 1, 2, ...와 같이 숫자로 표시할 수도 있지만 문자열을 사용할 수도 있습니다.
    아래와 같이 입력하고 실행해 보세요. (파일 이름은 04array2.php로 저장합니다.)

    1 : <?
    2 : $nickname["박상관"] = "껄떡이";
    3 : $nickname["김민수"] = "헐랭이";
    4 : $nickname["최재석"] = "띨띨이";
    5 :
    6 : echo "박상관 별명 : $nickname[박상관] <br>";
    7 : echo "김민수 별명 : $nickname[김민수] <br>";
    8 : echo "최재석 별명 : $nickname[최재석] <br>";
    9 : ?>

    위와 같이 문자열을 사용해서 서로 연관된 것들끼리 짝 지어 놓은 배열을 따로 '연관 배열'이라고 부르기도 합니다.

    배열에 대해서는 이 정도만 알고 있으면 될 것 같네요.


모든 프로그래밍 언어가 그러하듯 PHP에도 산술 연산자, 문자열 연산자, 대입 연산자, 비교 연산자, 논리 연산자, 비트 연산자 등이 있습니다. 한마디로 C 언어의 연산자와 거의 동일합니다.
그 중 문자열 연산자와 몇 가지 실수하기 쉬운 연산자에 대해 예를 들어 설명하겠습니다.


  1. 산술 연산자


    위의 연산자에 대해 별다른 설명은 필요없을 것입니다만 나머지 연산자인 %에 대해서만 짚고 넘어가겠습니다.

    1 : <?
    2 : $a = 10
    3 : $b = 3
    4 : $result = $a % $b;
    5 : echo "$a % $b = $result";
    6 : ?>

    어떤 결과가 나올까요?
    10을 3으로 나누면 몫이 3이고 나머지가 1이겠죠. 그래서 $result의 값은 1이 됩니다.

  2. 대입 연산자
    설명이 필요없겠네요.
    모든 언어에서와 마찬가지로 PHP도 등호(=)를 사용하여 등호(=) 오른쪽의 값을 왼쪽의 변수에 대입하게 됩니다.

  3. 비교 연산자
    크다, 작다, 크거나 같다, 작거나 같다. 같다, 같지 않다 등을 나타내죠.
    이 중에서 '같다'와 '같지 않다'만 주의하시면 될 것 같네요.


  4. 논리 연산자


  5. 문자열 연산자
    두 문자열을 연결하는 기능을 하는 문자열 연산자는 마침표(".") 하나밖에 없습니다.
    문자열 연산자를 concatenation 연산자라고 합니다.

    1 : <?
    2 : $str1 = "첫번째 문자열";
    3 : $str2 = "두번째 문자열";
    4 : $result = $str1.$str2;
    5 : echo $result;
    6 : echo "문자열을 연결한 결과 : ".$result;
    7 : ?>

    4행과 6행에서 문자열 연산자를 사용하였습니다. 특히 6행과 같은 경우에는 연산자(.)를 빠뜨리기 쉽습니다. 주의하세요.

    연산자에 대해서는 이 정도만 알고 있으면 될 것 같네요.
    다음 시간에는 제어문에 대해 다루겠습니다.


PHP의 제어문은 C의 제어문과 비슷합니다.
if, else, elseif, while, do∼while, for, break, continue, switch, require, include 등이 제어문에서 사용됩니다.
이번 시간에는 if, else, elseif, while, do∼while 문의 쓰임새를 간단한 실습을 통해서 살펴보기로 하겠습니다.


  1. if 문
    이거 무지무지 많이 쓰이는 문장입니다. 이거 제대로 사용 못하면 PHP 프로그램 하나도 못 만듭니다.
    기본적으로,
    if (표현식)
    명령문
    과 같은 식으로 씁니다.
    if 다음의 괄호 안에 참과 거짓을 구분하는 표현식을 쓰고 이 표현식이 참이면 명령문을 실행합니다.
    그러나 이건 명령문이 단 한 줄일 때의 경우이고 명령문이 여러 문장이면 중괄호({})를 사용하여 반드시 묶어 주어야 합니다. 그리고 대개의 경우 명령문이 단 한 줄이라도 중괄호로 묶어주는 경우가 많습니다.

    1 : <?
    2 : $a = 10;
    3 : $b = 3;
    4 : if($a>$b) {
    5 : echo "$a 가 $b 보다 더 크다.";
    6 : }
    7 : if($a<=$b) {
    8 : echo "$a 가 $b 보다 작거나 같다.";
    9 : }
    10: ?>

    5행과 8행을 보면 $a와 $b 뒤에 한 칸을 띄었습니다.
    만약 "$a가 $b보다..."와 같이 사용하면 "$a가"까지 하나의 변수로 인식하기 때문에 원하는 결과가 나오지 않습니다. 반드시 변수 뒤에는 한 칸을 띄어 써야 합니다.

  2. else 문
    위의 if 문에서 표현식이 거짓일 경우에 실행하는 문장을 나열합니다. 따라서
    if (표현식)
    명령문 1
    else
    명령문 2
    와 같은 식으로 사용하죠.
    위의 if문을 else를 사용하여 바꾸면 이렇게 됩니다.

    1 : <?
    2 : $a = 10;
    3 : $b = 3;
    4 : if($a>$b) {
    5 : echo "$a 가 $b 보다 더 크다.";
    6 : } else {
    8 : echo "$a 가 b$ 보다 더 작거나 같다.";
    9 : }
    10: ?>

  3. elseif 문
    else와 if를 합쳐 놓은 것과 같죠.

    1 : <?
    2 : $a = 10;
    4 : if($a<5)
    5 : echo "$a 가 5보다 작다.";
    6 : elseif($a<10)
    7 : echo "$a 는 10보다 작다.";
    8 : elseif($a<15)
    9 : echo "$a 는 15보다 작다.";
    10: else
    11:echo "$a 는 15보다 크거나 같다.";
    12: ?>

  4. while 문
    표현식이 참인 동안 계속 명령문을 실행합니다.
    while (표현식)
    명령문


    1 : <?
    2 : //1부터 10까지의 출력합니다.
    3 : $number=1;
    4 : while ($number <= 10) {
    5 : echo $number."
    ";
    6 : $number=$number+1;
    7 : }
    8 : ?>

    6행을 C언어에서와 같이 $number += 1이라고 써도 됩니다.(C언어에 대한 경험이 없는 분은 그냥 무시하고 넘어가세요.)
    5행에서 문자열 연산자(.)를 잘 보시구요.
    2행의 //는 실제로 실행되지 않는 주석문입니다.

  5. do ∼ while 문
    while 문과 비슷하지만 일단 명령문을 한번 실행하고 난 다음 while의 표현식을 점검합니다.
    do
    명령문
    while (표현식)


    위에서 실습한 1부터 10까지 출력하는 프로그램을 do∼while 문을 사용해서 만들면 다음과 같습니다.

    1 : <?
    2 : //1부터 10까지의 출력합니다. (do - while 문 사용)
    3 : $number=1;
    4 : do {
    5 : echo $number."
    ";
    6 : $number=$number+1;
    7 : } while ($number <= 10)
    8 : ?>


크게 어렵지는 않은 내용이지만 대개 중괄호({})와 문장의 끝을 나타내는 세미콜론(;) 그리고 echo 문에 사용하는 큰따옴표("")를 쓸 때 실수하여 오류가 나는 경우를 많이 봅니다.

이번 시간에는 for문, break, continue, switch 문 등에 대해 알아 보겠습니다.
for 문은 실제 프로그래밍에서 반복문으로 매우 많이 사용됩니다. 나머지 break, continue, switch 문도 매우 유용하게 사용할 수 있습니다.
간단한 예제를 통해 위의 제어문들에 대해 꼭 이해하고 넘어가는 시간이 되었으면 좋겠습니다.


  1. for 문
    for 문은,
    for (표현식1 ; 표현식2 ; 표현식3)
    명령문
    과 같은 식으로 사용됩니다.
    여기서 표현식1은 for 문을 시작할 때 처음 실행되는 식입니다.
    표현식2는 검사 조건을 나타내는데 표현식2가 참일 경우에만 명령문이 실행됩니다.
    표현식3은 반복이 끝나고 실행되는 식입니다.

    1부터 10까지의 합계를 구하는 프로그램을 while 문과 for 문을 이용해 만들어 보고 그 차이점을 살펴 봅시다.

    1 : <?
    2 : //1부터 10까지의 합계를 while 문을 이용해서
    3 : $sum = 0 ;
    4 : $number = 1 ;
    5 : while ($number < 10 ) {
    6 : $sum = $sum + $number ;
    7 : $number = $number + 1 ;
    8 : }
    9 : echo "1부터 $number 까지의 합계 = $sum <br>";
    10 :
    11 : //1부터 10까지의 합계를 for 문을 이용해서
    12 : $sum = 0 ;
    13 : $number = 1 ;
    14 : for($number = 1 ; $number < 10 ; $number++) {
    15 : $sum = $sum + $number;
    16 : }
    17 : echo "1부터 $number 까지의 합계 = $sum";
    18 : ?>

    14행이 핵심이죠.
    먼저 $number=1 이 먼저 실행됩니다. 그리고 $number < 10인지 검사합니다. 만약 참이면 $sum=$sum+$number가 실행됩니다. 그리고 $number++이 실행됩니다. 그리고 다시 $number < 10인지 검사하여 참이면 $sum=$sum+$number가 실행됩니다.
    10까지의 합계를 구하려면 이런 식으로 하는구나하는 정도의 논리적인 해결은 할 줄 알아야 합니다. 이해될 때까지 보시구요.
    참, 여기서 $number++$number=$number+1과 같은 뜻입니다.


  2. break 문과 continue 문
    break를 만나면 for, while, switch 등의 반복문을 빠져나갑니다.
    반대로 continue를 만나면 반복문의 처음으로 되돌아 갑니다.
    간단한 예제를 통해 직접 눈으로 확인해 봅시다.

    1 : <?
    2 : // break 문을 이용하여 반복문 빠져 나가기
    3 : $sum = 0 ;
    4 : $count = 1;
    5 : while(TRUE) {
    6 : $sum = $sum + $count ;
    7 : $count = $count + 1 ;
    8 : if ($count == 10) break ;
    9 : }
    10 : echo "1부터 $count 까지의 합계 = $sum <br>";
    11 :
    12 : // 1부터 10까지의 정수 중 홀수의 합계 구하기
    13 : $sum = 0;
    14 : $count = 0;
    15 : while ($count < 10) {
    16 : $count++ ;
    17 : if($count % 2 == 0) continue;
    18 : $sum = $sum + $count ;
    19 : }
    20 : echo "1부터 $count 정수 중에서 홀수의 합 = $sum ";
    21 : ?>

    5행을 보면 조건이 무조건 참인 것을 알 수 있습니다. 이것은 무조건 반복하라는 뜻입니다. 그리고 반복문 안에서 break 문을 사용해서 빠져나가게 됩니다.(실무에서도 이런 식으로 자주 사용합니다.)
    8행을 보면 $count가 10이면 반복문을 빠져나가는 것을 알 수 있습니다.
    17행을 보면 $count를 2로 나눈 나머지가 0이면, 즉 2의 배수(짝수)이면 18행을 실행하지 말고 15행으로 다시 돌아가라는 뜻입니다.
    16행의 $count++은 $count=$count+1과 같은 뜻입니다.
    비슷한 방식으로 18행의 $sum=$sum+$count를 $sum+=$count로 바꿔서 사용해도 됩니다. (이런 것은 모두 C언어의 연산자를 그대로 이어받은 경우라고 할 수 있습니다.)

  3. switch 문
    switch 문은 여러 개의 if 문을 사용하는 것과 비슷한 효과를 냅니다.
    형식은,
    switch(표현식) {
    case 표현식1 :
    명령문1
    case 표현식1 :
    명령문1

    default
    명령문
    }
    와 같이 사용합니다.

    1 : <?
    2 : $number = 10 ;
    3 : switch ($number) {
    4 : case $number < 0 :
    5 : echo "$number 는 음수입니다.";
    6 : break;
    7 : case 0 : // case $number == 0; 과 동일함
    8 : echo "$number 는 0입니다.";
    9 : break;
    10 : case $number > 0 ;
    11 : echo "$number 는 양수입니다.";
    12 : break;
    13 : }
    14 : ?>

    3행의 $number의 값을 기준으로 case 문에서 일치하는 값이 있으면 그 명령문을 실행합니다.
    만약 해당 사항이 없을 경우 default의 명령문을 실행하는데 여기서는 default를 사용하지 않았습니다.



프로그래밍을 정말 처음으로 접한 분이라면 이번 시간의 내용이 어렵게 느껴질 수도 있습니다. 제가 '이런 것은 C와 비슷합니다.'라고 말하는 것이 아무런 의미없이 다가오는 분이 분명 있을 겁니다. 그러면 그냥 무시하고 넘어가세요. 열번의 설명보다 실제 코드를 스스로 열번 뚫어지게 쳐다보는 것이 더 중요합니다. 그러면 자연스레 이해가 되게 되어 있습니다.

이번 시간에는 PHP 파일 내에서 다른 파일을 불러오는 require와 include에 대해 실습해 보겠습니다.
아래의 두 실습 예제를 통해 require와 include의 차이점을 정확하게 이해하시길 바랍니다.

require 문과 include 문은 둘 다 다른 파일을 불러와서 문서 내에 삽입하는 기능을 하는데,
require는 파일을 반복문 안에서 사용할 수 없고,
include는 반복문 안에서도 사용할 수 있다는 것이 다릅니다.

  1. 오늘 실습 예제에서 불러올 파일을 먼저 만들어 두어야 합니다.

    • define.php
      1 : <?
      2 : $a = "require";
      3 : $b = "실습";
      4 : ?>

    • include1.php
      1 : <?
      2 : $a = "include 실습 1";
      3 : ?>

    • include2.php
      1 : <?
      2 : $a = "include 실습 2";
      3 : ?>

    • include3.php
      1 : <?
      2 : $a = "include 실습 3";
      3 : ?>


  2. require 문을 가장 간단한 예제를 통해 쓰임새를 알아 보겠습니다.

    다음과 같이 만들어 실행해 보세요.(08-1.php)
    1 : <?
    2 : require("define.php");
    3 : echo "$a $b";
    4 : ?>

    달리 설명을 드리지 않아도 되겠죠?
    다시 말씀드리지만 require 문은 반복문 내에서 사용할 수 없습니다. 반면 아래의 include 문은 반복문 안에서도 사용할 수 있습니다.

  3. 그러면 include 문을 반복문 안에서 사용한 예를 봅시다.(08-2.php)
    1: <?
    2: $files = array('include1.php','include2.php','include3.php');
    3:
    4: for ($count=0; $count<3 ; $count++) {
    5: include($files[$count]);
    6: echo "$a <br>";
    7: }
    8: ?>

    2행의 배열에 대한 설명은 4회차 강좌에 있습니다.
    4행의 for문은 지난 시간에 다루었습니다. 혹시 기억 안나시면 참조하시구요.



매일을 열심히 살아가는 여러분들, 비록 힘들지만 벌써 주말을 앞둔 금요일입니다.
화이팅!

이번 시간을 마지막으로 PHP 기초 문법에 대해서 끝내려고 합니다. 겨우 6번의 강좌 내용으로 기초 문법이 끝난 것은 아닙니다. 그러나 이 강좌(학습)의 주제가 PHP 게시판 프로젝트인만큼 실제 PHP 게시판을 만드는 실전을 통해 여러 문법과 함수, 기타 PHP 프로그래밍 방식 등에 대해 하나하나 알아나가도록 하겠습니다.
이번 시간에는 PHP에서 제공하는 기본 함수가 아닌 프로그래머가 만들 수 있는 사용자 정의 함수에 대해 알아보기로 하겠습니다.

PHP의 사용자 정의 함수는 다음과 같이 구성됩니다.

function 함수명(인자1, 인자2, ...) {
명령문
return 변수 ;
}

  • 함수명은 영문을 사용합니다.
  • 인자가 필요없을 때는 괄호 안의 인자를 생략해도 됩니다.
  • 마찬가지로 return할 변수가 필요없을 때는 return 문은 생략해도 됩니다.


프로그래밍이 완전히 처음이신 분은 이해하기 좀 힘드실 겁니다. 비주얼베이직이나 C언어 같은 것을 아주 조금이라도 다뤄보신 분은 금방 이해가 됩니다. 심지어 그냥 베이직이라도 다루어보신 분이라면 이해가 쉽겠죠.(근데 도스에서 돌아가는 BASIC이 언제적 얘기지?)

먼저 다음과 같은 my_age()라는 함수를 하나 만들어 실행해 봅시다.

1: <?
2: function my_age($birth) {
3: return 2002 - $birth ;
4: }
5:
6: $age = my_age(1980) ;
7: echo "나이는 만 $age 세 입니다.";
8: ?>

2행을 보면 my_age라는 함수의 인자로 $birth가 사용되었습니다.
3행을 보면 2002에서 $birth를 뺀 값을 리턴해주는 것을 알 수 있습니다.
이상이 my_age라는 사용자 정의 함수였고,
6행에서 my_age 함수를 실행하는데 인자로 1980을 넘겼습니다. 따라서 위의 3행에서와 같이 2002에서 1980을 뺀 값이 다시 되돌아 오겠죠. 이렇게 되돌아 온 값은 $age에 저장됩니다.
7행에서 $age를 출력하고 있습니다.

참, 사용자 정의 함수는 반드시 그 함수를 사용하기 전에 만들어 두어야 합니다. 꼭!

다음 예제는 여러 개의 값을 리턴할 때 사용하는 방식입니다. 리턴할 때는 배열로 리턴하고 받을 때는 list 함수를 사용해서 받아야 합니다. 이해가 안되시더라도 'array를 이용해 배열로 리턴하고 받을 때는 list 함수를 사용해서 받는다'라고만 알아두시면 됩니다. (자주 사용하면 그냥 익히게 됩니다.)

1: <?
2: function my_age($birthyear) {
3: $re_age = 2002 - $birthyear ;
4: return array(2002, $re_age) ;
5: }
6:
7: list($year, $age) = my_age(1975);
8: echo "$year 기준 만 $age 세 입니다";
9: ?>

4행을 보면 2개의 값을 리턴합니다.
PHP에서는 원칙적으로 하나의 값만 리턴하게 되어 있습니다. 따라서 2개 이상의 값을 리턴하려면 배열 함수인 array()를 사용해 배열을 통째로 넘겨야 합니다.
그리고 받을 때는,
7행에서와 같이 list 함수를 써서 받습니다. list 함수는 각각의 변수를 마치 배열처럼 만듭니다.
(이해가 안되시면 위의 예제를 그냥 외워버리세요.^^)

다음 실습은 함수의 인자에 기본 값을 지정하는 예입니다.

1: <?
2: function my_age($year = 1980) {
3: return 2002 - $year ;
4: }
5:
6: $age1 = my_age();
7: $age2 = my_age(1975);
8: echo "처음 $age1, 나중 $age2" ;
9: ?>

2행을 보면 $year라는 변수에 기본 값으로 1980을 지정해 놓고 있습니다. 그러면,
6행에서와 같이 인자를 쓰지 않고 그냥 함수명만 호출하면 이 함수는 기본적으로 인자를 1980으로 전제하고 계산을 한 다음 그 결과를 리턴합니다.
7행에서와 같이 1975라는 인자를 사용하면 기존의 기본 값은 무시하고 실제로 넘어온 값(1975)를 가지고 처리합니다.

프로그래밍 초보자 입장에서 보자면 오늘 내용은 이전에 비해 어렵습니다. 비록 본문 내용은 짧지만 충분히 설명되지 못한 부분도 있습니다. 그러나 앞으로 설명의 수준은 이 정도로 하고자 합니다. 너무 자세하게 설명할 수도 없는 것이, 만약 그렇게 한다면 PHP 게시판 하나 만들다가 1년이 다 가버릴 수도 있기 때문입니다. 이 점 널리 양해하시길 바랍니다.

PHP 기초 문법에 대해서는 이것으로 마감합니다.
드디어 다음 시간부터 실전 프로그래밍에 돌입하겠습니다.

이번 시간부터 PHP를 이용한 본격적인 프로그래밍에 들어갑니다.
오늘은 그 첫 시간으로 간단한 카운터를 하나 만들어 봅니다.
그리고 다음 시간부터는 게시판 만들기 프로젝트에 본격 돌입하겠습니다.

이번 시간에 만들어 볼 카운터는 제목 그대로 매우 간단한 방식으로 구현되는 카운터입니다.
단순히 파일을 액세스할 때마다 숫자를 하나씩 증가시켜 주는 것입니다.

  1. 먼저 counter.txt 라는 파일을 하나 만들어야 됩니다.
    그냥 쉽게 메모장에서 숫자 0이라는 데이터만 입력하고 counter.txt로 저장하면 됩니다. (물론 어느 폴더에다 저장해야 되는지는 알고 계시죠? APM_setup 아래의 htdocs 폴더에 저장하시면 됩니다.)

  2. 이제 PHP 파일을 만들어야죠. 다음과 같은 내용으로 파일을 만들어 counter.php 라는 이름으로 저장합니다.

    1: <?
    2: $read = file("counter.txt");
    3: $count = trim($read[0]);
    4: $sum_count = $count + 1;
    5:
    6: $fp = fopen("counter.txt", "w");
    7: fwrite($fp, $sum_count);
    8: fclose($fp);
    9:
    10:echo "당신은 $sum_count 번째 방문자입니다.";
    11:
    12:?>

  3. 자, 이제 실행해 볼까요?
    http://localhost/counter.php 라고 입력해 보세요. 제대로 실행됩니까?
    http://127.0.0.1/counter.php 라고 입력해도 됩니다. 127.0.0.1이 바로 localhost를 뜻하니까요.
    만약 회사에서와 같이 자신의 PC가 고정 IP인 분은 localhost 대신 해당 IP를 직접 입력하셔도 됩니다. (그럴려면 먼저 APM_Setup 3 모니터에서 [메뉴]-[서버 환경 설정]-[Apach, PHP GUI 환경설정]을 실행하여 서버 이름을 바꿔주어야 됩니다.)



이제 소스를 분석해 볼까요?

  • $read = file("counter.txt");
    먼저 2행을 보면 counter.txt라는 파일을 읽어들여서 그 내용을 $read라는 변수에 집어 넣으라는 뜻입니다.
    여러 줄의 내용이 있더라도 모두 불러들여 $read라는 변수에 저장을 합니다. 따라서 $read 변수는 여러 줄의 내용을 저장하기 위한 배열 변수가 됩니다. 즉 첫째 줄의 내용은 $read[0]에 저장되고 둘째 줄의 내용은 $read[1], 그리고 순서대로 $read[2], $read[3]...에 저장되게 됩니다.
    그러나 이 실습에서는 0이라는 숫자 하나만 달랑 $read[0] 저장되겠죠.
  • $count = trim($read[0]);
    3행을 보면, $read 변수에 저장된 내용 중에서 첫 번째 줄의 내용을 좌우 모든 공백을 잘라내어 다시 $count라는 변수에 저장한다는 뜻입니다.
    trim() 함수는 대부분의 프로그래밍 언어에서 공통으로 사용되는 함수입니다. 좌우 공백을 잘라내고 순수하게 텍스트만 가져오죠.
  • $sum_count = $count + 1;
    4행을 보면 3행의 $count 에 1을 더한 다음 $sum_count 변수에 저장을 합니다. 여기에 만약 1 대신 3을 쓰면, counter.txt 파일을 한번 읽을 때마다 숫자가 3씩 증가하게 됩니다.
  • $fp = fopen("counter.txt", "w");
    6행에서는 이제 파일을 열게 됩니다.
    2행에서 file("counter.txt") 한 것과는 다릅니다. 2행에서는 단순히 내용을 읽어들여서 저장하기 위한 함수이고
    6행의 fopne() 함수는 어떠한 작업을 위해서 파일을 읽어들일 때 쓰는 함수입니다.
    6행에서는 파일을 쓰기 모드로 열었습니다. 그리고 쓰기 모드로 연 counter.txt 파일의 이름을 $fp로 지정하였습니다.
    위에서 w 가 쓰기 모드라는 뜻입니다. 만약 w 대신 a를 쓰면 추가(append) 모드로 열리고, r을 쓰면 읽기(read) 모드로 열립니다.
    counter.txt에 기록된 숫자를 새롭게 바꾸어야되기 때문에 w 모드로 열었습니다. 만약 기존의 내용은 그대로 두고 그 아래에 한 줄 더 추가하려면 a 모드로 열면 됩니다.
    이렇게 열어놓은 파일은 반드시 닫아 주어야 하는데,
    8행에서 fclose($fp); 로 닫아줍니다.
  • fwrite($fp, $sum_count);
    7행에서 fwrite() 함수를 이용해 파일에 데이터를 씁니다.
    $fp에 $sum_count를 쓰라는 뜻이죠.
  • echo "당신은 $sum_count 번째 방문자입니다.";
    마지막으로 10행에서 $sum_count를 출력합니다.
    10행에서는 화면에 표시하고 7행에서는 counter.txt 파일에 기록합니다. 그래야 다음에 counter.txt에 기록된 숫자에 1을 더해 다시 출력하니까요.



어떻습니까?
생각보다 많이 어렵지 않죠?

웹 게시판에 글을 쓰거나 입력된 글을 전송하기 위해서 HTML 태그 중에서 FORM 태그를 이용합니다.
이번 시간에 다룰 내용은 PHP 문법이 아닙니다. HTML 태그 중의 하나인 FORM 태그를 이용하여 웹에서 입력된 내용을 전달하는 방법을 알아보도록 하겠습니다.


  1. 글을 입력하기 위한 폼을 만들기 위해 다음과 같이 입력하고 write_test.php로 저장합니다.
    이 예제를 통해 FORM 태그에 대해 설명할 예정입니다.

    1 : <html>
    2 : <head>
    3 : <title>PHP 게시판 프로젝트 - 쓰기</title>
    4 : </head>
    5 :
    6 : <form name='myForm' method='post' action='write_ok.php'>
    7 :
    8 : 이름 : <input type='text' name='name' size=20 maxlength=20> <br>
    9 : 비밀번호 : <input type='password' name='password' size=20 maxlength=20> <br>
    10 :전자우편 : <input type='text' name='email' size=50 maxlength=70> <br>
    11 :홈페이지 : <input type='text' name='homepage' size=50 maxlength=70> <br>
    12 :제목 : <input type='text' name='subject' size=50 maxlength=70> <br>
    13 :내용 : <textarea name='memo' cols=50 rows=20 maxlength=500></textarea> <br>
    14 :
    15 :<br>
    16 :<input type='submit' value='글쓰기'>
    17 :
    18 :</form>
    19 :
    20 :</body>
    21 :</html>

  2. write_test.php에서 입력한 내용을 보여주는 프로그램입니다.
    다음과 같이 입력한 다음 wirte_ok.php로 저장합니다.

    1 : <html>
    2 : <head><title></title></head>
    3 : <body>
    4 :
    5 : <?
    6 : echo "이름 : $name <br>";
    7 : echo "비밀번호 : $password <br>" ;
    8 : echo "전자우편 : $email <br>" ;
    9 : echo "홈페이지 : $homepage <br>";
    10 :echo "제목 : $subject <br>";
    11 :echo "내용 : $memo <br>";
    12 :?>
    13 :
    14 :</body>
    15 :</html>

  3. Apache와 MySQL을 실행한 다음 웹 브라우저 주소 표시줄에 http://localhost/write_test.php를 입력하여 위에서 작성한 프로그램을 실행합니다.


자세한 설명은 다음 시간에 하겠습니다.

지난 시간에 만든 write_test.php와 write_ok.php 프로그램을 하나하나 살펴보도록 하겠습니다.
웹 프로그래밍을 위한 기본 중의 기본이므로 반드시 이해와 숙달을 할 수 있도록 해 주시기 바랍니다.

먼저 write_test.php 프로그램부터 분석해 볼까요?

  1. 6행의 <form name='myForm' method='post' action='write_ok.php'>
    FORM 태그는 말 그대로 문자열이나 명령 등을 입력받기 위한 폼을 만들 때 사용하는 태그입니다.
    FORM 태그는 name, method, action, target 등의 속성이 있습니다.

    • name
      폼이 여러 개일 때 구분하기 위한 이름입니다.
    • method
      입력한 데이터를 서버의 프로그램(CGI)에 전달하는 방식을 지정하는 것인데, post 방식과 get 방식이 있습니다.
      위의 예에서는 post 방식을 사용하였는데, 입력한 데이터의 양이 많을 때 주로 사용되는 방법입니다.
      만약 위의 예에서 post 대신 get를 사용하여 실행하면 다음과 같이 입력한 내용이 주소 표시줄에 모두 나타나게 됩니다. 즉 get 방식은 데이터를 전송할 때 HTTP 헤더 부분에 실어서 보냅니다. 반면 post 방식은 데이터를 본문에 실어서 전송합니다.

    • action
      폼의 데이터를 실행(처리)할 프로그램의 주소를 지정하는 곳입니다.
      위의 예를 보면, 폼에서 입력한 데이터를 처리하기 위해 write_ok.php 프로그램을 실행한다는 뜻입니다.
    • target
      위의 예에서는 사용되지 않았는데, 결과물을 보여 줄 창을 선택합니다. 위의 예에서는 현재의 창에 그 결과물을 보여주기 때문에 별도의 target 속성을 사용하지 않았습니다.</ul>


  2. 8행의 이름 : <input type='text' name='name' size=20 maxlength=20>
    input 태그는 form 태그 내에서 입력 양식을 만들기 위한 태그입니다.
    input 태그는 type, name, value, size, maxlength 등의 속성이 있습니다.

    • type
      입력 방식을 지정할 때 사용합니다.
      8행서는 text 입력 방식, 9행에서는 password 방식, 16행에서는 submit 방식을 사용하고 있습니다.
      type에는 text, password(입력되는 내용이 별표로 표시됨), checkbox, radio, submit(폼의 데이터를 전송할 때), reset(취소), hidden(입력 양식을 숨김), button, image(이미지 버튼) 방식 등이 있습니다.
    • name
      여러 개의 input을 구분하기 위한 이름을 지정합니다.
    • value
      위의 예에서는 사용되지 않았지만, 기본 입력 값을 지정하는 것입니다.
      text에서는 기본 입력값이 표시되고, submit나 button, reset 등에서는 버튼 제목으로 표시됩니다.
    • size와 maxlength
      입력 양식이 화면에 표시되는 길이(크기)와 실제 입력할 수 있는 최대 문자 수를 지정합니다.


  3. 13행의 내용 : <textarea name='memo' cols=50 rows=5 maxlength=500></textarea>
    여러 줄의 내용을 입력하기 위해서는 textarea 태그를 사용합니다.
    name은 이름, cols는 화면에 표시될 컬럼 수, rows는 화면에 표시될 행의 수, maxlength는 실제 입력 가능한 문자 수를 지정합니다.

  4. 16행의 <input type='submit' value='글쓰기'>
    글쓰기라는 버튼이 표시되고 이것을 클릭하면 현재 폼에 입력된 데이터를 전송합니다.
    어디로 전송할까요?
    바로 6행의 action='write_ok.php'에서 지정한 대로 write_ok.php 프로그램으로 전송합니다.

  5. 18행의 </form>
    폼 태그가 종료되는 곳입니다.




write_ok.php 프로그램은 매우 간단합니다.

write_test.php에서 입력한 데이터를 전송받아서 화면에 보여주는 역할을 합니다.

여기서 $name, $password, $email, $homepage, $subject, $memo는 write_test.php의 input 태그의 name 속성에서 지정한 이름입니다.

form, input, textarea 태그는 웹에서 데이터를 입력하고 전송할 때 기본이 되는 HTML 태그입니다.
위의 예를 통해 반드시 그 용례를 익혀 두시기 바랍니다.

게시판에 글을 쓸 때 이름이나 제목, 내용 등이 공란일 때 다음과 같이 오류 메시지를 출력할 수 있는 입력 검사 기능을 추가해 봅시다.



입력 검사를 하기 위해 PHP 프로그래밍을 할 수도 있지만 일반적으로 자바스크립트를 이용해 간단한 입력 검사가 많이 사용됩니다.

앞서 실습한 write_test.php 파일을 열어 다음과 같이 수정한 다음 write_test2.php 파일로 저장해 두세요.

  • 녹색으로 표시된 부분이 새롭게 추가된 부분이고
  • 빨간색으로 표시된 부분이 기존 코드에서 수정된 부분입니다.



1 : <html>
2 : <head>
3 : <title>PHP 게시판 프로젝트 - 쓰기</title>
4 :
5 : <script language="javascript">
6 :
7 : function check_submit() {
8 :
9 : if (document.myForm.name.value == "") {
10 : alert('이름을 입력하세요');
11 : document.myForm.name.focus();
12 : return;
13 :
14 : } else if (document.myForm.password.value == "") {
15 : alert('비밀번호를 입력해야 글을 수정하거나 삭제할 수 있습니다.');
16 : document.myForm.password.focus();
17 : return;
18 :
19 : } else if (document.myForm.subject.value == "") {
20 : alert('제목을 입력하세요');
21 : document.myForm.subject.focus();
22 : return;
23 :
24 : } else if (document.myForm.memo.value == "") {
25 : alert('내용을 입력하세요');
26 : document.myForm.memo.focus();
27 : return;
28 :
29 : } else {
30 : document.myForm.action = "write_ok.php";
31 : document.myForm.submit();
32 : }
33 :
34 : }
35 :
36 : </script>
37 : </head>
38 :
39 : <form name='myForm' method='post'>
40 :
41 : 이름 : <input type='text' name='name' size=20 maxlength=20> <br>
42 : 비밀번호 : <input type='password' name='password' size=20 maxlength=20> <br>
43 : 전자우편 : <input type='text' name='email' size=50 maxlength=70> <br>
44 : 홈페이지 : <input type='text' name='homepage' size=50 maxlength=70> <br>
45 : 제목 : <input type='text' name='subject' size=50 maxlength=70> <br>
46 : 내용 : <textarea name='memo' cols=50 rows=5 maxlength=500></textarea> <br>
47 :
48 : <br>
49 : <input type='button' value='글쓰기' onclick='javascript:check_submit();'>
50 :
51 : </form>
52 :
53 : </body>
54 : </html>


다 입력하셨으면 write_test2.php를 실행한 다음 아무 것도 입력하지 않은 상태에서 '글쓰기' 버튼을 눌러 보세요.

  • 49행을 보면 '글쓰기' 버튼을 눌렀을 때 check_submit()라는 자바스크립트 함수를 실행하라는 것을 볼 수 있습니다.
    여기서 지정한 check_submit() 함수는 5행 ∼ 36행에 걸쳐 정의하고 있습니다.
  • 49행의 input type이 submit가 아니라 button인 까닭은,
    만약 submit으로 할 경우 자바스크립트로 입력 오류 검사를 해서 오류가 있든 없든 무조건 현재의 데이터를 전송(submit)해 버리기 때문입니다.
  • 따라서 그냥 button 타입으로 해 둔 다음,
    29행∼32행에서와 같이 입력 검사에서 아무런 이상이 없을 경우 보내도록 했습니다.
  • 30행에서 action 속성을 별도로 지정하고 있기 때문에
    39행에서 action 속성을 따로 지정하지 않고 있습니다.



위에서 사용된 자바스크립트에 대해 조금 설명 드리자면,

  • 9행의 if (document.myForm.name.value == "")
    if (!document.myForm.name.value)와 같은 뜻입니다.
  • 10행의 alert('이름을 입력하세요');는 대화 상자를 표시합니다.
  • 11행의 document.myForm.name.focus();는 myForm의 name란에 커서를 위치하도록 하는 역할을 합니다.



앞으로 본 강좌에서 자바스크립트까지 일일이 설명드리긴 어려울 것 같습니다.
위 실습 예제의 자바스크립트를 직접 실행해 보면서, 위에서 사용된 정도만이라도 그 기능을 하나하나 이해하고 습득해 나가도록 합시다.

11~13강까지 실습한 내용을 기본으로 하여 글 입력 폼을 보다 예쁘게 꾸며보도록 하겠습니다.

원래는 바로 다음 단계(MySQL 연결)로 진행하려고 했는데, 전 시간에 만든 글 입력 폼이 너무 없어 보이는지라 강좌를 진행하는 강사로서의 자존심이 가만히 있질 않네요.

비록 잡다한 코드가 많기는 하지만, 보기 좋은 떡이 먹기도 좋다고, 먼저 예쁘게 꾸며 보겠습니다. (사실은 DB 연동까지 설명하려니 너무 졸리고 피곤하고... -.-)

일단 다음과 같이 만든 다음
파일 이름은 write.php로 저장합시다.

관련된 이미지 파일과 소스는 자료실에 모두 올려 놓았습니다.

write.php 게시판 미리보기


  1. 스타일 시트를 사용하여 본문에 사용되는 서체를 굴림, 9포인트, 회색으로 설정하였습니다.
  2. 자바스크립트를 사용하여 입력 검사를 합니다. (전 시간에 다룬 내용입니다.)
  3. 글 입력과 목록 보기 명령을 이미지로 처리하였습니다.(아래 121, 122행)
  4. 목록 보기를 누르면 이전 화면으로 돌아가도록 하였습니다.(아래 122행)
  5. 기타 이미지와 테이블을 이용하여 입력 폼을 꾸며보았습니다.



1 : <html>
2 : <head>
3 : <title>PHP 게시판 프로젝트 - 쓰기</title>
4 :
5 : <STYLE TYPE="text/css">
6 : BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option {font-family:굴림;font-size:9pt;color:#555555;}
7 : A:link {color:black;text-decoration:none;}
8 : A:visited {color:black;text-decoration:none;}
9 : A:active {color:black;text-decoration:none;}
10 : A:hover {color:gray;text-decoration:none;}
11 : </STYLE>
12 :
13 :
14 : <script language="javascript">
15 :
16 : function check_submit() {
17 :
18 : if (document.myForm.name.value == "") {
19 : alert('이름을 입력하세요');
20 : document.myForm.name.focus();
21 : return;
22 :
23 : } else if (document.myForm.password.value == "") {
24 : alert('비밀번호를 입력해야 글을 수정하거나 삭제할 수 있습니다.');
25 : document.myForm.password.focus();
26 : return;
27 :
28 : } else if (document.myForm.subject.value == "") {
29 : alert('제목을 입력하세요');
30 : document.myForm.subject.focus();
31 : return;
32 :
33 : } else if (document.myForm.memo.value == "") {
34 : alert('내용을 입력하세요');
35 : document.myForm.memo.focus();
36 : return;
37 :
38 : } else {
39 : document.myForm.action = "write_ok.php";
40 : document.myForm.submit();
41 : }
42 :
43 : }
44 :
45 : </script>
46 :
47 : </head>
48 :
49 : <body bgcolor=white background=./images/body_bg.gif>
50 :
51 : <img src=./images/maintitle.gif>
52 :
53 : <br>
54 :
55 : <form name='myForm' method='post' >
56 :
57 : <table border=0 cellspacing=1 cellpadding=0 width=670>
58 : <tr>
59 : <td align=center>
60 : <font color=green><b>글 쓰기 화면입니다.</b></font>
61 : </td>
62 : </tr>
63 : </table>
64 :
65 : <table border=0 bgcolor=#CCCCF><tr><td>
66 :
67 : <table border=0 width=670 cellspacing=0 cellpadding=0 bgcolor=#F0F0F0>
68 :
69 : <col width=100></col><col width=></col>
70 :
71 : <tr>
72 : <td colspan=2>
73 : <table border=0 cellspacing=0 cellpadding=0 width=100%>
74 : <tr>
75 : <td width=100 align=right><b>이름 </b></td>
76 : <td><input type=text name=name size=20 maxlength=20></td>
77 : <td width=100 align=right><b>비밀번호 </b></td>
78 : <td><input type=password name=password size=20 maxlength=20></td>
79 : </tr>
80 : </table>
81 : </td>
82 : </tr>
83 :
84 : <tr><td bgcolor=white height=1 colspan=2></td></tr>
85 :
86 : <tr>
87 : <td align=right><b>전자우편 </b></td>
88 : <td> <input type=text name=email size=40 maxlength=200> </td>
89 : </tr>
90 :
91 : <tr><td bgcolor=white height=1 colspan=2></td></tr>
92 :
93 : <tr>
94 : <td align=right><b>홈페이지 </b></td>
95 : <td> <input type=text name=homepage size=40 maxlength=200> </td>
96 : </tr>
97 :
98 : <tr><td bgcolor=white height=1 colspan=2></td></tr>
99 :
100 : <tr>
101 : <td align=right><b>제목 </b></td>
102 : <td> <input type=text name=subject size=87 maxlength=200> </td>
103 : </tr>
104 :
105 : <tr><td bgcolor=white height=1 colspan=2></td></tr>
106 :
107 : <tr>
108 : <td align=right><b>내용 </b></td>
109 : <td valign=top>
110 : <textarea name=memo cols=85 rows=20></textarea>
111 : </td>
112 : </tr>
113 :
114 : </table>
115 :
116 : <br>
117 :
118 : <table border=0 width=670>
119 : <tr><td>
120 : <center>
121 : <a href="javascript:check_submit();"><img src='./images/write.gif' border=0></a>
122 : <a href=# onclick=history.back()><img src=./images/list.gif border=0></a>
123 : </center>
124 : </td></tr>
125 : </table>
126 : </td></tr></table>
127 :
128 : </form>
129 :
130 : </body>
131 : </html>

다음 시간부터는 DB 연동 실습을 하겠습니다.

지난 시간에 글 입력 폼을 완성하였습니다.
이번 시간에는 글 입력 폼에서 입력한 글을 데이터베이스에 입력하기 위해 데이터베이스와 테이블을 만드는 작업을 합니다.
실습의 편의를 위해 사용자 이름, 암호, 데이터베이스 이름, 테이블 이름을 본문 실습 내용과 동일하게 만들어 주시기 바랍니다.

그림과 따라하기 내용이 조금 많기 때문에 자세한 설명은 생략하겠습니다.
데이터베이스에 대한 보다 자세한 내용은 오라클(데이터베이스) 입문 강좌에서 자세하게 설명하고 있으니 참조하시기 바랍니다.

먼저 이번 시간에 만들 테이블의 구조는 다음과 같습니다.



  1. 웹브라우저 주소 표시줄에 http://localhost/apmsetup/를 입력합니다.
    마지막에 슬래시(/)를 꼭 써야 합니다.

  2. 상단 메뉴에서 phpMyAdmin(MySQL 관리)를 클릭합니다.


  3. 네트워크 암호 입력 창에서 [사용자 이름]란에는 root, [암호]란에는 그냥 엔터를 칩니다.
    로그인한 다음 나타나는 메인 화면을 자세히 보면 다음과 같은 문장이 보입니다.
    MySQL 3.23.46-max-debug 가 실행중입니다. localhost:3306 as root@localhost
    바로 localhost에 root로 로그인했다는 뜻입니다.

  4. 새로운 사용자를 등록하기 위해 Users를 클릭합니다.


  5. 아래 그림과 같이 [호스트]란에는 localhost, [User name]란에는 phpbbs, [Password]란에도 phpbbs를 입력합니다.
    [Privileges] 선택 항목에서는 Check All을 클릭하여 모두 선택합니다.
    마지막으로 [실행] 단추를 클릭해서 위와 같은 사용자를 등록합니다.


  6. 좌측 메뉴에서 Main Page를 클릭하고 본문 중간에서 로그 아웃 항목을 클릭합니다.
    새롭게 나타나는 네트워크 암호 입력 창에서 [사용자 이름]란에는 phpbbs, [암호]란에도 phpbbs를 입력하고 [확인]을 누릅니다.
    • Windows2000에서는 정상적으로 로그인될 것입니다.
    • Windows98에서는 로그인되지 않을 수도 있습니다. 이때는 [취소]를 눌러 암호 입력 대화상자를 닫고, APM_setup을 재실행하여야 합니다.


  7. phpbbs로 로그인하면 본문에 phpbbs@localhost가 보입니다.
    새로운 데이터베이스를 만들기 위해, 입력란에 itmembers를 입력하고 [만들기] 단추를 클릭합니다.


  8. itmembers 데이터베이스에 새로운 테이블을 만들기 위해, 아래와 같이
    [이름] 입력란에 bbs, [필드] 입력란에 10을 입력하고 [실행] 단추를 클릭합니다.


  9. 아래와 같이 필드, 필드 타입, 길이, 보기, 추가, Primary 항목을 입력하거나 선택한 다음 [보존] 단추를 누릅니다.


  10. 아래와 같은 화면이 나오면 정상적으로 수행이 된 것입니다.


    본문 중에 실행된 SQL 쿼리라는 것이 보이죠?
    CREATE TABLE 'bbs'로 시작하는 SQL 문장이 보이는데, 이 문장을 위의 8번 단계의 [Run SQL query] 입력란에 직접 입력한 다음 실행해도 지금과 같은 bbs 테이블이 만들어집니다.
    SQL에 대한 자세한 설명은 오라클 강좌를 참조해 주시기 바랍니다.


전 시간에 글 입력 폼에서 작성한 글이 입력될 테이블을 만들어 봤습니다.
이번 시간에는 bbs 테이블에 실제로 데이터를 입력하는 프로그램을 만듭니다.
SQL에 대한 기본적인 지식이 요구됩니다.
SQL 대한 보다 자세한 내용은 오라클(데이터베이스) 입문 강좌에서 자세하게 설명하고 있으니 참조하시기 바랍니다.

이번 시간에는 DB에 데이터를 입력하는 프로그램을 만들어 실행해 보고,
프로그램과 관련된 설명은 다음 시간에 하겠습니다.

  1. 아래와 같이 입력한 다음 insert.php로 저장합니다.

    1 : <?
    2 : //db 연결 부분입니다.
    3 : mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error()); //host,id,passwd
    4 : mysql_select_db("itmembers"); //db이름
    5 :
    6 : //입력폼(write.php)에서 전송된 내용을 변수에 담습니다.
    7 : $name = addslashes($name);
    8 : $password = addslashes($password);
    9 : $email = addslashes($email);
    10 : $homepage = addslashes($homepage);
    11 : $subject = addslashes($subject);
    12 : $memo = addslashes($memo);
    13 :
    14 : //디폴트 값이 필요한 변수에는 디폴트 값을 넣습니다.
    15 : $writetime = time();
    16 : $ip = getenv("REMOTE_ADDR");
    17 : $count = 0;
    18 :
    19 : //SQL 명령을 이용해 입력받은 내용과 디폴트값 등을 MySQL에 입력(insert)합니다.
    20 :
    21 : $sql = "insert into bbs
    22 : values('','$name','$password','$email','$hompage',
    23 : '$subject','$memo',$count,'$ip',$writetime)";
    24 :
    25 : mysql_query($sql) or die (mysql_error());
    26 : ?>

  2. 예전에 만든 write.php 파일의 39행을 아래와 같이 수정합니다.
    기존 : document.myForm.action = "write_ok.php";
    변경 : document.myForm.action = "insert.php";

  3. http://localhost/wirte.php를 실행하여 임의의 글을 입력합니다.


  4. http://localhost/myadmin/ 을 입력한 다음 ID와 비밀번호를 각각 phpbbs, phpbbs로 입력하여 로그인합니다.


    ①왼쪽 메뉴에서 itmembers DB를 선택합니다.
    ②bbs 테이블의 보기 항목을 클릭합니다.
    ③데이터가 제대로 입력되었는지 확인을 할 수 있습니다.



    위의 소스를 잘 살펴보시기 바랍니다.
    자세한 설명은 다음 시간에 하겠습니다.(굵게 표시된 내용을 중심으로 설명할 예정입니다.)

    정말 오랜만에 글을 쓰네요.
    앞 강좌에서 소스를 설명한다고 하고서는 벌써 반년이 지났습니다.
    변명할 여지가 없네요. 너무 오랫동안 신경을 못 썼으니...

    insert.php 소스를 하나씩 살펴 보겠습니다.

    • 3행
      mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());

      mysql_connect() 함수는 말 그대로 mysql 서버에 연결하는 기능을 합니다.
      괄호 안에 인자는 순서대로 호스트이름, ID, 패스워드입니다.
      (만약 연결되면 정수형 링크 구분자를 반환하고, 실패하면 false를 반환하는데... 여기서는 몰라도 됩니다.)

    • 4행
      mysql_select_db("itmembers");

      3행에서 DB 서버에 접속했으니, 이제 해당 DB에 접속할 차례입니다.
      mysql_slect_db() 함수는 괄호 안의 DB명에 해당되는 DB를 선택하는 기능을 합니다.
      (참고로 성공하면 true, 실패하면 false를 반환합니다.)

    • 25행

      중간에 일단 건너뛰고 25행부터 설명하겠습니다.
      위에서 DB 서버에 접속해서, 원하는 DB를 선택했습니다.
      이제 그 DB에 적절한 SQL 문을 사용해서 원하는 작업을 해야겠죠.... 이럴 때
      mysql_query() 함수를 사용합니다.
      쿼리를 실행할 때 쓰는 함수입니다. 괄호 안에는 쿼리 문장이 들어갑니다.
      (쿼리에 대한 자세한 내용은 오라클 기초 강좌를 참조하세요)
      24행에서 쿼리 문을 $sql이라는 문자열 변수에 저장했으므로, mysql_query($sql)라고 쓰면 됩니다.

    • 24행

      쿼리 문을 자세히 보면,
      bbs 테이블에 values 괄호 안의 값들을 insert하라는 문장입니다.
      (insert 문에 대한 자세한 설명은 오라클 강좌를 참조하세요. 관련 강좌 바로가기)

    • 7행
      $name = addslashes($name);

      글 입력 폼의 name 텍스트 박스의 내용을 $name 변수에 저장을 하는데,
      혹시 특수 기호가 있으면 역슬래시(\)를 붙이라는 뜻입니다.
      PHP에서는 작은 따옴표('), 큰 따옴표("), 역슬래시(\)와 같은 문자를 그대로 표현하려면 해당 기호 앞에 역슬래시를 표시해야 합니다.
      만약 화면에 "손병목"이라는 문자를 따옴표와 함께 표현하려면
      echo " "손병목" "; 이라고 하면 안된다는 것입니다.(오류가 발생합니다. 왜일까요.... 자세히 보세요.... ^^)
      echo " \"손병목\" "; 라고 해야 따옴표가 정확하게 표현됩니다.
      이럴 때 사용하는 함수가 바로 addslashes() 함수입니다.

    • 15행
      $writetime = time();

      $writetime 변수에 현재의 시간을 저장합니다.
      time() 함수는 현재의 시간을 돌려주는 함수입니다.

    • 16행
      $ip = getenv("REMOTE_ADDR");

      getenv() 함수는 서버의 환경 정보를 불러오는 역할을 합니다.
      위와 같이 인자를 "REMOTE_ADDR"이라고 쓰면, 원격지(클라이언트)의 주소를 돌려주는 역할을 합니다.
      게시판에 글 쓴 사람의 ip 주소를 기록하기 위해 사용했습니다.

    • 17행
      $count = 0;
      조회수를 저장하기 위해 $count 변수를 사용했습니다.


    이해는 되셨는지요...
    혹시 이해가 안되는 부분이 있다면 질문/답변 게시판을 이용해 주세요

    지난 시간까지 실습한 내용만으로도 게시물을 훌륭하게 저장할 수 있습니다.
    그러나 그렇게 저장하은 했는데 뭔가 아쉽죠.... 뭔가 다른 페이지로 이동을 해야하는데...

    일반적으로 게시판에 글을 쓰고 나면 바로 글 목록 보기 페이지로 이동하는 걸 볼 수 있습니다.
    이번 시간에는 insert.php 파일에 약간의 코드를 추가해서 다음 페이지(글 목록 보기 페이지; list.php)로 바로 이동하는 기능을 구현해 보겠습니다.


    insert.php 파일을 소스 가장 하단에, 물론 <?안쪽에 다음과 같은 코드를 추가 합니다.


    27: //글 입력이 완료되면 목록 보기 페이지로 자동 이동하도록 합니다
    28:
    29: $msg = "성공적으로 등록되었습니다";
    30: echo " <html><head>
    31: <script name=javascript>
    32:
    33: if('$msg' != '') {
    34: self.window.alert('$msg');
    35: }
    36:
    37: location.href='list.php?';
    38:
    39: </script>
    40: </head>
    41: </html> ";


    위 코드를 자세히 보면 모두 자바스크립트입니다.
    핵심은 37행이죠.
    location.href 뒤에 오는 주소로 이동을 하게 됩니다.

    그 전에 33행을 보면,
    $msg 변수에 무언가가 있으면 alert 창에 $msg 변수 내용을 표시하라는 겁니다. alert(경고) 창은 특정 문자열을 표시하고 [확인] 단추를 누르면 닫히는 그런 역할을 합니다.

    위와 같이 코드를 추가하고 실제로 실행하면, 아래와 같이 메시지 박스가 하나 뜨고, [확인]을 누르면...... 에러가 나죠..... ^^ list.php 라는 파일을 아직 안 만들었으니 당연히 에러가 나죠.


    다음 시간부터는 게시판 프로그래밍의 꽃인 글 목록 보기 기능을 구현해보도록 하겠습니다.(그만큼 가장 복잡한 부분입니다.)

    이번 시간부터는 게시판 프로그램의 백미인 글 목록 보기 기능을 구현할 것입니다.
    DB에 저장된 데이터를 읽어오기, 읽어 온 데이터를 배열에 저장하여 차례대로 보여주기, 한 페이지에 보여줄 목록의 개수를 설정하여 지정된 개수만큼만 보여주기, 목록이 많을 경우 [이전] [다음] 페이지 바로 가기 기능 등 매우 다양한 기능을 구현해야 합니다.
    따라서 글 목록 보기 기능만 제대로 이해해도 게시판의 70~80%는 이해했다고 볼 수 있습니다.

    이번 시간에는 기본적인 '글 목록 보기 ' 화면을 디자인해 보겠습니다.

    프로그래밍을 하다보면, 디자인부터 하고 프로그램을 입히는 경우도 있고, 때에 따라서는 주요 프로그램을 먼저 작성하고 디자인을 나중에 입히는 경우도 있습니다.
    프로젝트의 규모나 프로그램의 성격에 따라서 조금씩 다르니 어느 것이 定道라도 할 수는 없습니다.
    여기서는 먼저 디자인부터하고 HTML 코드 사이에 프로그램을 추가하는 방식으로 실습할 예정입니다.

    글 목록 보기 화면을 아래와 같이 구성할 예정입니다. (파일 이름은 list.php로 저장합니다.)


    손에 익숙한 웹에디터(나모웹에디터, 드림위버, 프론트페이지 등)를 사용하여 디자인한 다음 소스를 베껴오는 것이 가장 쉬운 방법입니다.
    아니면 아래와 같이 처음부터 직접 코딩해도 되구요.
    아래의 코드를 보면 따옴표(" ")를 하나도 사용하지 않았습니다.
    이미 아시다시피 PHP에서 따옴표는 문장의 시작과 끝을 나타내는 기호이기 때문에 매우 조심해서 사용해야 합니다.
    HTML 코드에는 따옴표를 생략한다고 해서 오류가 발생하는 것은 아니니, 웹 에디터로 작성한 소스에서 따옴표를 모두 제거해 주시는 게 좋습니다.

    아래 코드에서 구분선과 원문자는 나중에 설명의 편의를 위해 구분해 놓은 것이니 입력하지 마세요 ^^








    <html>
    <head>
    <meta http-equiv=content-type content=text/html; charset=euc-kr>
    <title>글목록보기</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-decoration:none;}
    A:active {color:black;text-decoration:none;}
    A:hover {color:gray;text-decoration:none;}
    </STYLE>
    </head>
    <body background=./images/body_bg.gif>
    <img src=./images/maintitle.gif>
    <table border=1 cellspacing=0 width=680 bordercolordark=white bordercolorlight=#999999>
    <tr>
    <td width=30 bgcolor=#CCCCCC>
    <p align=center>no</p>
    </td>
    <td bgcolor=#CCCCCC width=490>
    <p align=center>subject</p>
    </td>
    <td width=60 bgcolor=#CCCCCC>
    <p align=center>name</p>
    </td>
    <td width=70 bgcolor=#CCCCCC>
    <p align=center>date</p>
    </td>
    <td width=30 bgcolor=#CCCCCC>
    <p align=center>hit</p>
    </td>
    </tr>




    <tr>
    <td width=30>
    <p align=center>3</p>
    </td>
    <td width=490>
    <p>연습하기</p>
    </td>
    <td width=60>
    <p align=center>손병목</p>
    </td>
    <td width=70>
    <p align=center>2002/10/10</p>
    </td>
    <td width=30>
    <p align=center>1234</p>
    </td>
    </tr>
    <tr>
    <td width=100% colspan=5>




    <p align=center>[처음][이전] [1][2][3] [다음][마지막]</p>




    </td>
    </tr>
    <tr>
    <td width=100% colspan=5>
    <p align=center>[글쓰기]</p>
    </td>
    </tr>
    </table>
    </body>
    </html>




    프로그램을 추가해야할 부분은 ①, ③, ④ 영역입니다.
    다음 시간부터는 ①, ③, ④ 영역에 프로그래밍 코드를 추가하여 글 목록 기능을 구현해 보도록 하겠습니다.

    오늘은 여기까지만 하겠습니다.

    다음 시간부터 소스를 조각조각 자세하게 설명드리도록 하겠습니다.
    이번 시간에는 일단 다음과 같이 입력합니다.

    지난 시간에 입력한 HTML 코드 사이사이에 PHP 코드를 덧붙이는 것이니만큼 정확하게 입력해야 합니다.

    왠만큼 주석을 달아놓았으니, 다음 시간 전이라도 최대한 눈여겨 봐주세요. 아마도 그리 이해가 되지 않는 곳은 없으리라 생각하는데....^^

    1. <?
    2. //DB에 연결하는 부분입니다. 항상 반복되는 부분이니 꼭 암기!!!
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());
    4. mysql_select_db("itmembers");
    5. //게시판 목록보기에 필요한 각종 변수 초기값을 설정합니다.
    6. $tablename="bbs"; //테이블 이름
    7. if($page == '') $page = 1; //페이지 번호가 없으면 1
    8. $list_num = 10; //한 페이지에 보여줄 목록 갯수
    9. $page_num = 10; //한 화면에 보여줄 페이지 링크(묶음) 갯수
    10. $offset = $list_num*($page-1); //한 페이지의 시작 글 번호(listnum 수만큼 나누었을 때 시작하는 글의 번호)
    11. //전체 글 수를 구합니다. (쿼리문을 사용하여 결과를 배열로 저장하는 일반적 인 방법)
    12. $query="select count(*) from $tablename"; // SQL 쿼리문을 문자열 변수에 일단 저장하고
    13. $result=mysql_query($query) or die (mysql_error()); // 위의 쿼리문을 실제로 실행하여 결과를 result에 대입
    14. $row=mysql_fetch_row($result); //위 결과 값을 하나하나 배열로 저장합니다 .
    15. $total_no=$row[0]; //배열의 첫번째 요소의 값, 즉 테이블의 전체 글 수를 저장합니다.
    16. //전체 페이지 수와 현재 글 번호를 구합니다.
    17. $total_page=ceil($total_no/$list_num); // 전체글수를 페이지당글수로 나눈 값의 올림 값을 구합니다.
    18. $cur_num=$total_no - $list_num*($page-1); //현재 글번호
    19. //bbs테이블에서 목록을 가져옵니다. (위의 쿼리문 사용예와 비슷합니다 .)
    20. $query="select * from $tablename order by number desc limit $offset, $list_num"; // SQL 쿼리문
    21. $result=mysql_query($query) or die (mysql_error()); // 쿼리문을 실행 결과
    22. //쿼리 결과를 하나씩 불러와 실제 HTML에 나타내는 것은 HTML 문 중간에 삽입합니다.
    23. ?>
    24. <html>
    25. <head>
    26. <meta http-equiv=content-type content=text/html; charset=euc-kr>
    27. <title>글목록보기</title>
    28. <STYLE TYPE=text/css>
    29. BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote {font-family:굴림;font-size:9pt;color:#555555;}
    30. A:link {color:black;text-decoration:none;}
    31. A:visited {color:black;text-decoration:none;}
    32. A:active {color:black;text-decoration:none;}
    33. A:hover {color:gray;text-decoration:none;}
    34. </STYLE>
    35. </head>
    36. <body background=./images/body_bg.gif>
    37. <img src=./images/maintitle.gif>
    38. <table border=1 cellspacing=0 width=680 bordercolordark=white bordercolorlight=#999999>
    39. <tr>
    40. <td width=30 bgcolor=#CCCCCC>
    41. <p align=center>no</p>
    42. </td>
    43. <td bgcolor=#CCCCCC width=490>
    44. <p align=center>subject</p>
    45. </td>
    46. <td width=60 bgcolor=#CCCCCC>
    47. <p align=center>name</p>
    48. </td>
    49. <td width=70 bgcolor=#CCCCCC>
    50. <p align=center>date</p>
    51. </td>
    52. <td width=30 bgcolor=#CCCCCC>
    53. <p align=center>hit</p>
    54. </td>
    55. </tr>
    56. <?
    57. while ($array=mysql_fetch_array($result)) {
    58. $date=date("Y/m/d", $array[writetime]); //글쓴시각을 Y/m/d 형식에 맞게 문자열로 바꿉니다 .
    59. echo "
    60. <tr>
    61. <td width=30>
    62. <p align=center>$cur_num</p>
    63. </td>
    64. <td width=490>
    65. <p>$array[subject]< /p>
    66. </td>
    67. <td width=60>
    68. <p align=center>$array[name]</p>
    69. </td>
    70. <td width=70>
    71. <p align=center>$date</p>
    72. </td>
    73. <td width=30>
    74. <p align=center>$array[count]</p>
    75. </td>
    76. </tr> ";
    77. $cur_num --;
    78. }
    79. ?>
    80. <tr>
    81. <td width=100% colspan=5>
    82. <?
    83. //여기서부터 각종 페이지 링크
    84. //먼저, 한 화면에 보이는 블록($page_num 기본값 이상일 때 블록으로 나뉘어짐 )
    85. $total_block=ceil($total_page/$page_num);
    86. $block=ceil($page/$page_num); //현재 블록
    87. $first=($block-1)*$page_num; // 페이지 블록이 시작하는 첫 페이지
    88. $last=$block*$page_num; //페이지 블록의 끝 페이지
    89. if($block >= $total_block) {
    90. $last=$total_page;
    91. }
    92. echo "
    93. &nbs p; <p align=center>";
    94. //[처음][*개앞]
    95. if($block > 1) {
    96. $prev=$first-1;
    97. echo "<a href='list.php?page=1'>[처음 ]</a>&nbsp; ";
    98. echo "<a href='list.php?page=$prev'>[$page_num 개 앞]</a>";
    99. }
    100. //[이전]
    101. if($page > 1) {
    102. $go_page=$page-1;
    103. echo " <a href='list.php?page=$go_page'>[이전 ]</a>&nbsp; ";
    104. }
    105. //페이지 링크
    106. for ($page_link=$first+1;$page_link<=$last;$page_link++) {
    107. if($page_link==$page) {
    108. echo "<font color=green><b>$page_link</b></font>";
    109. }
    110. else {
    111. echo "<a href='list.php?page=$page_link'>[$page_link]</a>";
    112. }
    113. }
    114. //[다음]
    115. if($total_page > $page) {
    116. $go_page=$page+1;
    117. echo "&nbsp;<a href='list.php?page=$go_page'>[다음]</a>";
    118. }
    119. //[*개뒤][마지막]
    120. if($block < $total_block) {
    121. $next=$last+1;
    122. echo "<a href='list.php?page=$netxt'>[$page_num 개 뒤]</a>&nbsp;";
    123. echo "<a href='list.php?page=$total_page'>[마지막]</a></p>";
    124. }
    125. ?>
    126. </td>
    127. </tr>
    128. <tr>
    129. <td width=100% colspan=5>
    130. <p align=center><a href='write.php'>[글쓰기]</a></p>
    131. </td>
    132. </tr>
    133. </table>
    134. </body>
    135. </html>

    지난 시간에 공개한 소스 코드를 하나하나 설명합니다.
    어느정도 주석이 있으니 최대한 스스로 이해를 하는 게 중요합니다.

    오늘 다룰 1~27행은 mysql DB에 연결하는 부분과, 프로그램에 필요한 변수를 설정하는 부분, 그리고 bbs 테이블에서 목록을 뽑아내기 위해 sql 쿼리를 날리고(?) 그 결과를 변수에 저장하는 부분 등으로 구성되어 있습니다.

    1. <?
    2. //DB에 연결하는 부분입니다. 항상 반복되는 부분이니 꼭 암기!!!
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());
    4. mysql_select_db("itmembers");
    5. //게시판 목록보기에 필요한 각종 변수 초기값을 설정합니다.
    6. $tablename="bbs"; //테이블 이름
    7. if($page == '') $page = 1; //페이지 번호가 없으면 1
    8. $list_num = 10; //한 페이지에 보여줄 목록 갯수
    9. $page_num = 10; //한 화면에 보여줄 페이지 링크(묶음) 갯수
    10. $offset = $list_num*($page-1); //한 페이지의 시작 글 번호(listnum 수만큼 나누었을 때 시작하는 글의 번호)
    11. //전체 글 수를 구합니다. (쿼리문을 사용하여 결과를 배열로 저장하는 일반적인 방법)
    12. $query="select count(*) from $tablename"; // SQL 쿼리문을 문자열 변수에 일단 저장하고
    13. $result=mysql_query($query) or die (mysql_error()); // 위의 쿼리문을 실제로 실행하여 결과를 result에 대입
    14. $row=mysql_fetch_row($result); //위 결과 값을 하나하나 배열로 저장합니다.
    15. $total_no=$row[0]; //배열의 첫번째 요소의 값, 즉 테이블의 전체 글 수를 저장합니다.
    16. //전체 페이지 수와 현재 글 번호를 구합니다.
    17. $total_page=ceil($total_no/$list_num); // 전체글수를 페이지당글수로 나눈 값의 올림 값을 구합니다.
    18. $cur_num=$total_no - $list_num*($page-1); //현재 글번호
    19. //bbs테이블에서 목록을 가져옵니다. (위의 쿼리문 사용예와 비슷합니다.)
    20. $query="select * from $tablename order by number desc limit $offset, $list_num"; // SQL 쿼리문
    21. $result=mysql_query($query) or die (mysql_error()); // 쿼리문을 실행 결과
    22. //쿼리 결과를 하나씩 불러와 실제 HTML에 나타내는 것은 HTML 문 중간에 삽입합니다.
    23. ?>

    설명의 편의상 14행부터 볼까요. 6~11행에서 선언한 변수는 아래에서 실제 사용될 때 자세하게 설명하기로 하죠.

    14행을 보면 $tablename 즉 bbs 테이블의 레코드 수를 구하는 쿼리문을 $query 변수에 저장한 것입니다.
    15행에서 $query 문을 실행하여 그 결과값을 $result 변수에 저장합니다.(실패하면 에러 메시지를 표시하고...)

    24행의 쿼리문은 bbs 테이블에서 모든 것을 불러오되, number 필드(컬럼)를 기준으로 내림차순으로 정렬하여 표시하라는 문장입니다. 단 $offset 행부터 $list_num 개만큼 불러오라는 뜻입니다.
    여기서 $offset 변수에는 한 페이지의 시작 글 번호가 저장되어 있고, $list_num에는 한 페이지에 표시할 목록의 개수가 저장되어 있습니다.

    위 소스 9행을 보면 $list_num10으로 지정되어 있으므로, 한 페이지에 목록의 개수를 10개씩 표시한다는 뜻입니다.
    11행에서 $offset에는 $list_num*($page-1) 의 값이 저장되도록 되어 있습니다. 이는 현재 페이지 수에서 1을 뺀 값을 $list_num과 곱하여 구한 값입니다. 무슨 뜻일까요?!#$@!#$!@#$

    만약 전체 글의 수가 55개라고 가정해 봅시다. 그리고 $list_num(한 페이지에 보여줄 목록의 수)가 10이라고 하면,
    1페이지에는 0~9 행이,
    2페이지에는 10~19행,
    3페이지에는 20~29행,
    4페이지에는 30~39행,
    5페이지에는 40~49행,
    6페이지에는 50~55행까지 표시될 것입니다. mysql 쿼리를 사용할 때 시작하는 레코드 행 번호는 0부터 시작됩니다. (실제 화면에 표시되는 숫자와는 다르죠...)
    이것을 다시 표로 그리면 다음과 같습니다.

     

    페이지번호($page)

    글 시작 번호($offset)

    글 마지막 번호

    1

    0

    9

    2

    10

    19

    3

    20

    29

    4

    30

    39

    5

    40

    49

    6

    50

    55

     

    16행은 참 중요합니다. 이번에 첨 나오죠?
    15행에서 쿼리의 결과값을 $result에 저장하였습니다. 그러나 이렇게 저장된 값을 그대로 사용할 수는 없습니다. php에서는 mysql 쿼리를 통해 얻은 결과를 다시 배열 형태로 저장하여 하나씩 불러내어 사용하게 됩니다.
    mysql_fetch_row() 함수는 쿼리 결과를 배열로 저장하는 기능을 합니다. 예를 들어 위에서와 같이
    $row=mysql_fetch_row($result); 와 같이 하였다면,
    $row[0]에 실행 결과의 처음 값이 들어가겠죠. 15행의 쿼리 결과는 전체 레코드 수를 구하는 것이므로 하나의 값만 리턴하게 되므로 결국 $row[0]의 값만 있으면 되는 겁니다. 만약 24행에서의 같은 쿼리라면 그 결과로 $row[0], $row[1], $row[2]... 와 같이 차례대로 저장이 될 것입니다. 단 이 함수는 하나의 레코드에에만 해당되므로 여러 레코드의 결과 값을 차례대로 얻을려면 레코드 수만큼 반복해야 합니다.63행은 보면 while 문을 사용하여 레코드 수만큼 반복하여 그 결과값을 배열로 저장하는 예가 되겠습니다.

    mysql_fetch_row()와 비슷한 역할을 하는 함수로 mysql_fetch_array() 함수가 있습니다. 63행에서는 이 함수가 사용되었습니다. 다음 시간에 그 차이를 설명하죠.

    17행에서 전체 레코드 수를 저장하고, 20~21행에서는 전체 페이지 수와 현재 글 번호를 구합니다.
    17행은 위에서 이미 설명드렸으니 생략하고, 20행을 보죠.
    17행에서 구한 전체 레코드 수(전체 글 수가 되겠죠)를 한 페이지당 출력될 목록 수 - 위에서 10이라고 정했었죠? 그 수로 나눈 값의 올림 값을 구하는 겁니다. 즉 전체 글 수가 55개라면, 55/10 = 5.5 이므로 올림 수이니까 6이 되겠죠.
    즉 55개의 글을 모두 표시하려면 6페이지가 필요하다는 겁니다. 왜 6페이지가 필요한 지 그래도 이해가 안되면 위의 도표를 다시 한번 봐주세요.

    이번 시간에는 여기까지 설명드리죠.
    SQL 문에 대해 자세히 설명드리지 않는 것은, SQL 자체만으로도 많은 설명이 필요하기 때문입니다. SQL 문에 대한 자세한 설명은, '재미로 배우는 오라클(SQL) 입문' 과정을 참조하시기 바랍니다.

     

    지난 시간에 이어 계속 설명합니다.

    29행부터 60행까지는 그냥 HTML 코드입니다. 보면 아시겠죠?
    아래와 같이 테이블의 제목 부분에 해당되는 코드입니다.

    no

    subject

    name

    date

    hit

    여기에 이제 글번호, 제목, 작성자 이름, 작성 날짜, 조회수 등의 데이터를 쓰되, 테이블 형식에 맞춰서 써야 합니다.
    따라서 62행부터의 코드는 HTML과 PHP 코드가 섞여 있습니다. 눈여겨 보시면서 헤깔리지 않도록 주의하시기 바랍니다.

    1. <?
    2. while ($array=mysql_fetch_array($result)) {
    3. $date=date("Y/m/d", $array[writetime]); //글쓴시각을 Y/m/d 형식에 맞게 문자열로 바꿉니다.
    4. echo "
    5. <tr>
    6. <td width=30>
    7. <p align=center>$cur_num</p>
    8. </td>
    9. <td width=490>
    10. <p>$array[subject]</p>
    11. </td>
    12. <td width=60>
    13. <p align=center>$array[name]</p>
    14. </td>
    15. <td width=70>
    16. <p align=center>$date</p>
    17. </td>
    18. <td width=30>
    19. <p align=center>$array[count]</p>
    20. </td>
    21. </tr> ";
    22. $cur_num --;
    23. }
    24. ?>

    63행부터 88행까지 하나의 while 제어 블록입니다. while( ) 안의 조건이 참인 동안 계속됩니다.
    괄호 안의 조건을 보면 $array=mysql_fetch_array($result) 으로,

    전 시간에 다뤘던, 24행의 쿼리문을 실행한 25행의 $result 값을 배열 형태로 다시 불러와 화면에 표시하는 역할을 합니다.

    24.$query="select * from $tablename order by number desc limit $offset, $list_num"; // SQL 쿼리문
    25. $result=mysql_query($query) or die (mysql_error()); // 쿼리문을 실행 결과

    mysql_fetch_array() 함수는 전 시간에 다루었던 mysql_fetch_row()와 마찬가지로 쿼리의 결과를 배열 형태로 한 줄씩 리턴하는 기능을 합니다.
    여기서 중요한 건 한 줄씩만 리턴한다는 것입니다.(mysql_fetch_row 함수도 한 줄씩 리턴합니다.)
    만약 select * from $tablename; 과 같은 쿼리문을 사용하여 $tablename 테이블의 모든 행을 조회해서 그 결과를 불러들이더라도, 단 한줄씩만 저장한다는 뜻입니다.
    따라서 63행부터 88행까지는 24행의 쿼리문을 실행한 결과를 한줄씩 불러내서 화면에 표시하게 됩니다.
    쿼리의 결과로 100개의 레코드(행)가 돌아왔다면, 이 함수를 100번 반복해서 하나씩 불러들여야 한다는 것입니다.

    while 의 괄호 안의 조건절을 보면 $array=mysql_fetch_array($result)입니다. 즉, 쿼리의 결과값이 있을 때까지 반복한다는 것이죠.
    만약 mysql_fetch_array($result)의 값이 없다면 이 함수는 flase 값을 돌려주면서 $array 역시 false가 되면서 while문이 종료되는 것입니다. (혹시 설명이 어렵더라도 더 이상 쉽게 설명하기 힘드니 그러려니 하고 받아들이시길....)

    이렇게 mysql_fetch_arry() 함수의 결과는 배열 형태로 저장됩니다. 따라서 $array[xxx]와 같은 식으로 되겠죠. 여기서 xxx 자리에 무엇이 들어갈까요?
    바로 필드(컬럼) 이름이 들어가게 됩니다. 65, 73, 76, 82행에서와 같이 $array[writedate], $array[subject], $array[name], $array[count] 식으로 쓰면 되는 것입니다.
    만약 mysql_fetch_row() 함수를 사용했더라면 $array[0], $array[1],... 등과 같이 숫자를 사용했어야 합니다. 어느 것이 더 편리할지는 쉽게 알 수 있겠죠?
    이제 그 차이를 아시겠죠? mysql_fetch_row를 사용해 얻은 배열값을 사용하려면 배열 첨자로 숫자를 써야하고, mysql_fetch_array를 사용해 얻은 배열값을 사용하기 위해서는 실제 컬럼 이름을 사용한다는 것.

    65행에는 date() 함수를 볼 수 있습니다. 정해진 형식에 맞게 날짜를 표시해주는 역할을 합니다.
    date("Y/m/d", $array[writetime])는 $array[wirtetime]의 값을 년(Y)/월(m)/일(d)의 형태로 표시하라는 뜻입니다.

    67행의 echo 문은 이미 앞에서도 몇 번 나왔으니 아실테고... 단, 여기시 실수하기 쉬운 것이 바로 인용 부호(" ")입니다. 67행에서 " 로 시작한 내용이 84행의 " 로 끝나는 것입니다. 84행에서 " 를 빠뜨리는 실수를 자주하게 되는데 조심하세요. 참, " 뿐만 아니라 ; 역시 빠뜨리기 쉽습니다. 주의!

    70행은 현재의 글번호가 저장된 $cur_num를 표시하는 행입니다. 그런데, 앞 시간에 $cur_num에 대한 설명을 빠뜨린 것 같네요.
    21행을 봅시다.

    21. $cur_num=$total_no - $list_num*($page-1); //현재 글번호

    아래의 테이블을 보면서 설명드리는 게 쉽겠네요. 아래와 같이 세 개의 글이 있다고 가정해 봅시다.
    그러면 처음으로 표시할 행은 글번호 3번이 되겠지요. 이 3에 해당되는 것이 바로 $cur_num입니다.
    그럼, 다시 21행을 보면, 전체 글 수($total_no)에서 $list_num*($page-1)을 뺀 값을 저장합니다. 전체 글 수가 만약 3이라면,
    3 - 10*(1-1)이 되겠지요. 지난 시간에 $list_num은 10으로 했고, $page의 기본값이 현재 1인 상태이기 때문입니다. 그러면 결과는 3이 됩니다.

    그런데 86행을 보면.
    $cur_num -- ;
    이것은 $cur_num = $cur_num - 1 ; 과 동일한 식입니다. 즉 기존의 $cur_num의 값에서 1을 뺀 값이 저장되는 것입니다.
    즉 while 문을 한 바퀴 돌 때마다 숫자가 1씩 줄어드는 것입니다.
    (반대로 $cur_num ++ ; 라고 했다면 이는, $cur_num = $cur_num + 1; 과 같은 뜻이 됩니다.)

     

    no

    subject

    name

    date

    hit

    3

    세 번째 글입니다.

    손병목

    2002/11/16

    5

    2

    두 번째 글입니다.

    손병목

    2002/11/16

    3

    1

    첫 번째 글입니다.

    손병목

    2002/11/16

    4

     

    그렇게 되면 위의 테이블과 같이 3, 2, 1과 같이 숫자가 줄어들게 됩니다. (그러나 화면에 표시되는 글 번호는 실제 레코드 번호와는 다릅니다. 실제 레코드 번호는 0부터 시작합니다.)

    나머지 행들은 보면 이해가 되시죠?
    73행에는 글 제목이, 76행에는 작성자 이름이, 79행에는 65행에서 구한 날짜가, 82행에는 조회수가 표시됩니다.

    설명이 좀 부족했나요?
    while 문에 대한 기본 설명은, PHP 문법의 기초(3) - 제어문(上)을 참조해 주세요.

     

    맘 같아서는 이 강좌, 얼릉 끝내고 싶지만, 잘 안되네요.
    자유게시판에 보면 PHP 강좌를 기다리시는 분도 계시던데, 정말 죄송합니다.
    제 시간이 허락하는 대로 최대한 빠르게 진행을 하겠습니다. (그리고 관심을 가지고 보아주셔서 정말 감사합니다.)


    오늘은 게시판 목록 보기 마지막 시간이네요.
    list.php 소스 93행부터 끝까지 설명드리겠습니다.

    먼저 아래 111행을 주의깊게 봐주세요.
    list.php?page=1으로 링크하도록 프로그래밍되어 있습니다.
    page라는 변수에 1을 대입한 다음 list.php를 실행하라는 의미겠죠. 이렇게 되면 list.php 파일이 실행될 때 page 변수, 즉 $page에 1을 대입하게 됩니다.

    현재 주소 표시줄을 한번 보세요. http://www.itmembers.net/board/view.php?id=php&page=1&sn1=&divpage=1...... 이런 식으로 되어 있죠?\
    id는 php, page는 1, sn1은 없고, divpage는 1.... 이런 식으로 변수 값을 가지고 view.php를 실행한다는 뜻입니다. 여러 개의 변수(파라미터)들을 사용할 때는 가운데 & 기호를 써서 분리합니다.

    아래 소스는 결국 page 변수에 어떤 값을 넘겨주느냐를 결정하기 위한 프로그램입니다.
    111행에는 page에 1을 대입하고 112행에서는 page에 $prev를 대입했습니다. 118행에서는 $go_page를, 140행에서는 $next를 대입했습니다.
    그러면 결국 $prev, $go_page, $next 등이 무엇을 의미하는지만 알면 아래 소스를 가볍게 이해할 수 있겠죠?

    1. <?
    2. //여기서부터 각종 페이지 링크
    3. //먼저, 한 화면에 보이는 블록($page_num 기본값 이상일 때 블록으로 나뉘어짐 )
    4. $total_block=ceil($total_page/$page_num);
    5. $block=ceil($page/$page_num); //현재 블록
    6. $first=($block-1)*$page_num; // 페이지 블록이 시작하는 첫 페이지
    7. $last=$block*$page_num; //페이지 블록의 끝 페이지
    8. if($block >= $total_block) {
    9. $last=$total_page;
    10. }
    11. echo "
    12. &nbs p; <p align=center>";
    13. //[처음][*개앞]
    14. if($block > 1) {
    15. $prev=$first-1;
    16. echo "<a href='list.php?page=1'>[처음 ]</a>&nbsp; ";
    17. echo "<a href='list.php?page=$prev'>[$page_num 개 앞]</a>";
    18. }
    19. //[이전]
    20. if($page > 1) {
    21. $go_page=$page-1;
    22. echo " <a href='list.php?page=$go_page'>[이전 ]</a>&nbsp; ";
    23. }
    24. //페이지 링크
    25. for ($page_link=$first+1;$page_link<=$last;$page_link++) {
    26. if($page_link==$page) {
    27. echo "<font color=green><b>$page_link</b></font>";
    28. }
    29. else {
    30. echo "<a href='list.php?page=$page_link'>[$page_link]</a>";
    31. }
    32. }
    33. //[다음]
    34. if($total_page > $page) {
    35. $go_page=$page+1;
    36. echo "&nbsp;<a href='list.php?page=$go_page'>[다음]</a>";
    37. }
    38. //[*개뒤][마지막]
    39. if($block < $total_block) {
    40. $next=$last+1;
    41. echo "<a href='list.php?page=$next'>[$page_num 개 뒤]</a>&nbsp;";
    42. echo "<a href='list.php?page=$total_page'>[마지막]</a></p>";
    43. }
    44. ?>
    45. </td>
    46. </tr>
    47. <tr>
    48. <td width=100% colspan=5>
    49. <p align=center><a href='write.php'>[글쓰기]</a></p>
    50. </td>
    51. </tr>
    52. </table>
    53. </body>
    54. </html>

    96행은 게시판의 전체 블록 수를 구하는 방법입니다. 전체 페이지 수에서 한 화면에 보여 줄 페이지 수를 나눈 값의 올림 수를 구한 것입니다.
    블록이 뭔지 이해가 잘 안되시면 아래 도표를 보면 좀 이해가 되실 겁니다.

    예를 들어, 전체 글의 수가 225개라고 가정합시다. 그러면 첫 화면에는 이렇게 보여야 됩니다.

    [1][2][3][4][5][6][7][8][9][10][다음][10개 뒤][마지막]

    한 페이지에 10개의 페이지만 바로갈 수 있게 되어 있습니다. 이렇게 10개를 하나의 블록이라고 할 수 있습니다. 그러면 다음 블록으로 넘어가려면 어떻게 해야될까요? [10개 뒤]를 누르면 다음 블록으로 넘어간다고 가정합시다.
    [10개 뒤]를 클릭하면 아래와 같이 되겠죠.

    [처음][이전][10개 앞][11][2][13][14][15][16][17][18][19][20][다음][10개 뒤][마지막]

    여기서 다시 [10개 뒤]를 누르면, 아래와 같이 나와야 되겠죠.

    [처음][이전][10개 앞][21][22][23][다음]

    도표로 정리하면 이렇게 되겠죠.

     

    블록 번호

    처음 페이지

    마지막 페이지

    1

    1

    10

    2

    11

    20

    3

    21

    23

     

    99와 100행에서는 블록의 처음과 마지막 페이지 번호를 구하는 식입니다.
    그런데 실제 계산해 보면 제1블록일 때 $block의 값이 0이 됩니다. 그리고 제2블록일 때 10이, 제3블록일 때 20이 됩니다. 위의 도표와 다르죠.
    그러나 122행에서 실제 사용될 때는 +1을 해서 사용하게 됩니다. 그러면 위의 도표와 맞아 떨어집니다.

    기타 나머지 부분도 소스를 보면서 하나하나 이해해야 합니다. 제가 이리저리 아무리 길게 설명해도 스스로 이해하지 못하면 아무런 소용이 없습니다.
    실제 프로그램을 실행시켜가면서 위의 소스를 반복해서 보다가 보면 조금씩 이해가 될 겁니다.

    당장 이해가 안된다고 포기하지 마세요~~~ (그래도 이해가 안되면 그냥 베껴서 쓰면 되죠 뭐...^^)

     

    이번 시간부터는 글 내용 보기 프로그램을 설명합니다.

    지난 시간까지 글을 쓰고(write.php, insert.php), 글 목록을 확인하는(list.php) 기능까지 구현했습니다.
    이번 시간에는 글 목록에서 해당 글을 클릭했을 때 글 내용을 보여 주는 프로그램(view.php)을 만듭니다.

    우선 글 목록 보기에서 글 제목을 클릭했을 때 글 내용을 보여주기 위해서는, 지난 시간까지 실습했던 list.php 소스에서 다음과 같이 한 줄을 수정해야 합니다.

    list.php의 73행의 $array[subject]를,

    <a href='view.php?page=$page&number=$array[number]'>$array[subject]</a> 와 같이 수정해야 합니다.

    글 제목을 클릭하면, view.php로 이동하면서 현재 목록 보기의 페이지 번호와 해당 글의 글 번호를 가져가게 되는 겁니다.
    글 번호는 해당 글을 조회하기 위해 필요한 것이고, 페이지 번호는 글 내용 보기 화면에서 다시 [목록] 버튼을 눌렀을 때 페이지가 속한 목록을 보여주기 위해 가져가는 것입니다.(view.php를 보다가 보면 저절로 이해가 될 겁니다.)

    그럼, 이제부터 view.php를 만들어 봅시다.

    우선 디자인부터 해야 겠죠.
    웹 에디터를 사용하여 다음과 같이 디자인해 봅시다.

    그러면 아래와 같은 소스가 만들어지겠죠... 에디터에 따라 조금씩 다르겠지만.

    1. <html>
    2. <head>
    3. <title>PHP 게시판 프로젝트 - 보기</title>
    4. <STYLE TYPE="text/css">
    5. BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote {font-family:굴림;font-size:9pt;color:#555555;}
    6. A:link {color:black;text-decoration:none;}
    7. A:visited {color:black;text-decoration:none;}
    8. A:active {color:black;text-decoration:none;}
    9. A:hover {color:gray;text-decoration:none;}
    10. </STYLE>
    11. </head>
    12. <body bgcolor=white background=./images/body_bg.gif>
    13. <img src=./images/maintitle.gif>
    14. <table border=0 cellspacing=1 cellpadding="3" width=670>
    15. <tr>
    16. <td align=center>
    17. <font color=green><b>내용 보기 화면입니다.</b></font>
    18. </td>
    19. </tr>
    20. <tr>
    21. <td bgcolor="#EAC3EA">
    22. <table border=0 cellspacing=1 cellpadding=0 width=670 bgcolor="white">
    23. <tr>
    24. <td width="100">
    25. <p align="right"><b>이름 &nbsp;</b></p>
    26. </td>
    27. <td width="400">
    28. <p>&nbsp;</p>
    29. </td>
    30. <td width="100">
    31. <p align="right"><b>조회수 &nbsp;</b></p>
    32. </td>
    33. <td>
    34. <p>&nbsp;</p>
    35. </td>
    36. </tr>
    37. <tr>
    38. <td width="100">
    39. <p align="right"><b>전자우편 &nbsp;</b></p>
    40. </td>
    41. <td colspan="3">
    42. <p>&nbsp;</p>
    43. </td>
    44. </tr>
    45. <tr>
    46. <td width="100">
    47. <p align="right"><b>홈페이지 &nbsp;</b></p>
    48. </td>
    49. <td colspan="3">
    50. <p>&nbsp;</p>
    51. </td>
    52. </tr>
    53. <tr>
    54. <td width="100">
    55. <p align="right"><b>제목 &nbsp;</b></p>
    56. </td>
    57. <td colspan="3">
    58. <p>&nbsp;</p>
    59. </td>
    60. </tr>
    61. <tr>
    62. <td width="100">
    63. <p align="right"><b>내용 &nbsp;</b></p>
    64. </td>
    65. <td colspan="3">
    66. <p>&nbsp;</p>
    67. </td>
    68. </tr>
    69. </table>
    70. <p align="center">[목록] &nbsp;[쓰기] &nbsp;[수정] &nbsp;[삭제]</p>
    71. </td>
    72. </tr>
    73. </table>
    74. </body>
    75. </html>

    다음 시간부터는 위 소스에 실제 프로그램을 입히는 작업을 해보겠습니다.

     

    지난 시간에 만든 HTML 소스에 프로그램을 입혔습니다.

    설명은 다음 시간에 하는데, 아래 파란 색 부분을 중심으로 설명합니다.
    이전 실습 내용을 이해하셨다면, 아래 파란 색 부분만 주의깊게 보시면 될 겁니다.


    1. <?
    2. //DB에 연결하는 부분입니다. 항상 반복되는 부분이니 꼭 암기!!!
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());
    4. mysql_select_db("itmembers");
    5. //변수 설정합니다.
    6. $tablename="bbs"; //테이블 이름
    7. //테이블에서 글을 가져옵니다.
    8. $query = "select * from $tablename where number='$number'"; // 글 번호를 가지고 조회를 합니다.
    9. $result = mysql_query($query) or die (mysql_error());
    10. $array = mysql_fetch_array($result);
    11. //백슬래쉬 제거, 특수문자 변환(HTML용), 개행(<br>)처리 등
    12. $array[name] = stripslashes($array[name]);
    13. $array[subject] = stripslashes($array[subject]);
    14. $array[memo] = stripslashes($array[memo]);
    15. $array[subject] = htmlspecialchars($array[subject]);
    16. $array[memo] = htmlspecialchars($array[memo]);
    17. $array[memo] = nl2br($array[memo]);
    18. // 조회수 카운터 증가
    19. $query = "update $tablename set count = count + 1 where number='$number'";
    20. mysql_query($query);
    21. ?>
    22. <html>
    23. <head>
    24. <title>PHP 게시판 프로젝트 - 보기</title>
    25. <STYLE TYPE="text/css">
    26. BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote {font-family:굴림;font-size:9pt;color:#555555;}
    27. A:link {color:black;text-decoration:none;}
    28. A:visited {color:black;text-decoration:none;}
    29. A:active {color:black;text-decoration:none;}
    30. A:hover {color:gray;text-decoration:none;}
    31. </STYLE>
    32. </head>
    33. <body bgcolor=white background=./images/body_bg.gif>
    34. <img src=./images/maintitle.gif>
    35. <table border=0 cellspacing=1 cellpadding="3" width=670>
    36. <tr>
    37. <td align=center>
    38. <font color=green><b>내용 보기 화면입니다.</b></font>
    39. </td>
    40. </tr>
    41. <tr>
    42. <td bgcolor="#EAC3EA">
    43. <table border=0 cellspacing=1 cellpadding=0 width=670 bgcolor="white">
    44. <tr>
    45. <td width="100">
    46. <p align="right"><b>이름 &nbsp;</b></p>
    47. </td>
    48. <td width="400">
    49. <p><? echo $array[name]; ?></p>
    50. </td>
    51. <td width="100">
    52. <p align="right"><b>조회수 &nbsp;</b></p>
    53. </td>
    54. <td>
    55. <p><? echo $array[count]; ?></p>
    56. </td>
    57. </tr>
    58. <tr>
    59. <td width="100">
    60. <p align="right"><b>전자우편 &nbsp;</b></p>
    61. </td>
    62. <td colspan="3">
    63. <p><? echo $array[email]; ?></p>
    64. </td>
    65. </tr>
    66. <tr>
    67. <td width="100">
    68. <p align="right"><b>홈페이지 &nbsp;</b></p>
    69. </td>
    70. <td colspan="3">
    71. <p><? echo $array[homepage]; ?></p>
    72. </td>
    73. </tr>
    74. <tr>
    75. <td width="100">
    76. <p align="right"><b>제목 &nbsp;</b></p>
    77. </td>
    78. <td colspan="3">
    79. <p><? echo $array[subject]; ?></p>
    80. </td>
    81. </tr>
    82. <tr>
    83. <td width="100">
    84. <p align="right"><b>내용 &nbsp;</b></p>
    85. </td>
    86. <td colspan="3">
    87. <p><? echo $array[memo]; ?></p>
    88. </td>
    89. </tr>
    90. </table>
    91. <p align="center"><a href="list.php?page=<? echo $page; ?>">[목록]</a> &nbsp;<a href="write.php">[쓰기]</a> &nbsp;<a href="modify.php?number=<? echo $number; ?>&page=<? echo $page; ?>">[수정]</a> &nbsp;<a href="delete.php?number=<? echo $number; ?>&page=<? echo $page; ?>">[삭제]</a></p>
    92. </td>
    93. </tr>
    94. </table>
    95. </body>
    96. </html>

    비교적 복잡한 목록 보기를 이미 실습한 상태이기 때문에 글 내용 보기 소스는 한결 쉽게 이해가 될 겁니다.

    1. //테이블에서 글을 가져옵니다.
    2. $query = "select * from $tablename where number='$number'"; // 글 번호를 가지고 조회를 합니다.
    3. $result = mysql_query($query) or die (mysql_error());
    4. $array = mysql_fetch_array($result);

    10행의 SQL 문에서 중요한 것은 where number='$number'입니다.
    목록 보기에서 해당 글 제목을 클릭했을 때, 현재의 list.php가 실행되니다.
    이 때 글 번호와 페이지 번호를 함께 넘어왔습니다.(금시초문이라구요? 그럼 바로 전 강좌를 다시 보시기 바랍니다.)
    글 번호를 사용하여 글 번호에 해당되는 레코드를 불러오는 SQL 쿼리문입니다.

    1. //백슬래쉬 제거, 특수문자 변환(HTML용), 개행(<br>)처리 등
    2. $array[name] = stripslashes($array[name]);
    3. $array[subject] = stripslashes($array[subject]);
    4. $array[memo] = stripslashes($array[memo]);

    예전에 글 입력 부분 실습할 때,
    $name = addslashes($name);
    이렇게 했습니다. (자세한 설명은 '입력한 글 DB에 저장하기(2)' 강좌를 참조하세요)

    입력할 때 인용부호, 역슬래시 등에 역슬래시 기호를 첨가하여 저장하였습니다.
    위 15행부터는, 그렇게 저장된 문자열을 다시 불러낼 때 역슬래시 기호를 제거하고 저장하는 역할을 합니다.

    1. $array[subject] = htmlspecialchars($array[subject]);
    2. $array[memo] = htmlspecialchars($array[memo]);

    19~20행은 문자열 중에서 특수 문자를 HTML로 표현하기 위한 HTML 문자로 치환하는 역할을 합니다.
    예를 들어, <&lt; 로, >&gt; 로, 작은 따옴표인 ' &quot; 로 바꿉니다.

    1. $array[memo] = nl2br($array[memo]);

    22행은 문자열 중에서 엔터 키가 입력된 부분을 <br> 문자로 바꾸는 역할을 합니다. 그래야 웹 상에서 제대로 보이니까요.

    이렇게 9행부터 22행까지는, 게시판 프로그램에서 글을 보여주는 부분에서 꼭 필요한 기능들입니다.

    1. // 조회수 카운터 증가
    2. $query = "update $tablename set count = count + 1 where number='$number'";
    3. mysql_query($query);

    25행은 현재의 count 필드의 값에 1을 더하는 쿼리문입니다.

    1. <p><? echo $array[name]; ?></p>

    58행은 설명 안해도 되죠? 이름을 출력합니다. 64, 72, 80, 88, 96행도 마찬가지입니다.

    1. <p align="center"><a href="list.php?page=<? echo $page; ?>">[목록]</a> &nbsp;<a href="write.php">[쓰기]</a> &nbsp;<a href="modify.php?number=<? echo $number; ?>&page=<? echo $page; ?>">[수정]</a> &nbsp;<a href="delete.php?number=<? echo $number; ?>&page=<? echo $page; ?>">[삭제]</a></p>

    마지막으로 100행을 보면,
    [목록]을 클릭했을 때 list.php 페이지로 이동하면서 현재의 페이지 번호도 함께 가져가는 것을 알 수 있습니다.
    [수정],[삭제]를 클릭하면 현재 글 번호와 페이지 번호를 함께 가져갑니다. 수정과 삭제를 위한 modify.php, delete.php 등은 아직 안 만들었으니 이걸 클릭하면 당연히 오류가 나겠죠...

    오랜만에 몇 개의 강좌를 한꺼번에 올리느라 시간 가는 줄 몰랐습니다.
    이제 슬슬 졸리네요.

    이번 시간부터는 글 내용 수정, 삭제에 대해 다루겠습니다.
    먼저 4시간에 걸쳐 아래 4개의 파일 소스부터 공개하겠습니다.

     

    파일명

    기능

    modify.php

    글 수정 폼

    modify_ok.php

    글 수정 DB 처리 부분

    delete.php

    글 삭제 폼

    delete_ok.php

    글 삭제 DB 처리 부분

     

    modify.php는 글 내용 보기에서 [수정]을 선택했을 때 작동하는 글 수정 기능입니다.
    기본적으로 형태는 글 입력 폼과 거의 유사하고,
    PHP 프로그램 부분은 글 내용 보기 기능과 거의 유사합니다.
    이미 앞에서 다 살펴 보았던 것이니만큼 비교적 쉽게 이해가 될 것입니다.

    우선 소스를 주~욱 살펴 보시기 바랍니다.


    1. <?
    2. //DB에 연결하는 부분입니다. 항상 반복되는 부분이니 꼭 암기!!!
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());
    4. mysql_select_db("itmembers");
    5. //변수 설정합니다.
    6. $tablename="bbs"; //테이블 이름
    7. //테이블에서 글을 가져옵니다.
    8. $query = "select * from $tablename where number='$number'"; // 글 번호를 가지고 조회를 합니다.
    9. $result = mysql_query($query) or die (mysql_error());
    10. $array = mysql_fetch_array($result);
    11. //백슬래쉬 제거, 특수문자 변환(HTML용), 개행(<br>)처리 등
    12. $array[name] = stripslashes($array[name]);
    13. $array[subject] = stripslashes($array[subject]);
    14. $array[memo] = stripslashes($array[memo]);
    15. //$array[subject] = htmlspecialchars($array[subject]);
    16. //$array[memo] = htmlspecialchars($array[memo]);
    17. //$array[memo] = nl2br($array[memo]);
    18. ?>
    19. <html>
    20. <head>
    21. <title>PHP 게시판 프로젝트 - 수정</title>
    22. <STYLE TYPE="text/css">
    23. BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote {font-family:굴림;font-size:9pt;color:#555555;}
    24. A:link {color:black;text-decoration:none;}
    25. A:visited {color:black;text-decoration:none;}
    26. A:active {color:black;text-decoration:none;}
    27. A:hover {color:gray;text-decoration:none;}
    28. </STYLE>
    29. <script language="javascript">
    30. function check_submit() {
    31. if (document.myForm.name.value == "") {
    32. alert('이름을 입력하세요');
    33. document.myForm.name.focus();
    34. return;
    35. } else if (document.myForm.password.value == "") {
    36. alert('비밀번호를 입력해야 글을 수정하거나 삭제할 수 있습니다.');
    37. document.myForm.password.focus();
    38. return;
    39. } else if (document.myForm.subject.value == "") {
    40. alert('제목을 입력하세요');
    41. document.myForm.subject.focus();
    42. return;
    43. } else if (document.myForm.memo.value == "") {
    44. alert('내용을 입력하세요');
    45. document.myForm.memo.focus();
    46. return;
    47. } else {
    48. document.myForm.action = "modify_ok.php";
    49. document.myForm.submit();
    50. }
    51. }
    52. </script>
    53. </head>
    54. <body bgcolor=white background=./images/body_bg.gif>
    55. <img src=./images/maintitle.gif>
    56. <br>
    57. <form name='myForm' method='post' >
    58. <input type=hidden name=page value='<? echo $page; ?>'>
    59. <input type=hidden name=number value='<? echo $number; ?>'>
    60. <table border=0 cellspacing=1 cellpadding=0 width=670>
    61. <tr>
    62. <td align=center>
    63. <font color=green><b>글 수정 화면입니다.</b></font>
    64. </td>
    65. </tr>
    66. </table>
    67. <table border=0 bgcolor=#CCCCF><tr><td>
    68. <table border=0 width=670 cellspacing=0 cellpadding=0 bgcolor=#F0F0F0>
    69. <col width=100></col><col width=></col>
    70. <tr>
    71. <td colspan=2>
    72. <table border=0 cellspacing=0 cellpadding=0 width=100%>
    73. <tr>
    74. <td width=100 align=right><b>이름&nbsp;</b></td>
    75. <td><input type=text name=name size=20 maxlength=20 value= '<? echo $array[name]; ?>'></td>
    76. <td width=100 align=right><b>비밀번호&nbsp;</b></td>
    77. <td><input type=password name=password size=20 maxlength=20 value=''></td>
    78. </tr>
    79. </table>
    80. </td>
    81. </tr>
    82. <tr><td bgcolor=white height=1 colspan=2></td></tr>
    83. <tr>
    84. <td align=right><b>전자우편&nbsp;</b></td>
    85. <td> <input type=text name=email size=40 maxlength=200 value='<? echo $array[email]; ?>'> </td>
    86. </tr>
    87. <tr><td bgcolor=white height=1 colspan=2></td></tr>
    88. <tr>
    89. <td align=right><b>홈페이지&nbsp;</b></td>
    90. <td> <input type=text name=homepage size=40 maxlength=200 value='<? echo $array[homepage]; ?>'> </td>
    91. </tr>
    92. <tr><td bgcolor=white height=1 colspan=2></td></tr>
    93. <tr>
    94. <td align=right><b>제목&nbsp;</b></td>
    95. <td> <input type=text name=subject size=87 maxlength=200 value='<? echo $array[subject]; ?>'> </td>
    96. </tr>
    97. <tr><td bgcolor=white height=1 colspan=2></td></tr>
    98. <tr>
    99. <td align=right><b>내용&nbsp;</b></td>
    100. <td valign=top>
    101. <textarea name=memo cols=85 rows=20> <? echo $array[memo]; ?> </textarea>
    102. </td>
    103. </tr>
    104. </table>
    105. <br>
    106. <table border=0 width=670>
    107. <tr><td>
    108. <center>
    109. <a href="javascript:check_submit();"><img src='./images/write.gif' border=0></a> &nbsp;&nbsp;
    110. <a href="list.php?page=<? echo $page ; ?>"><img src=./images/list.gif border=0></a>
    111. </center>
    112. </td></tr>
    113. </table>
    114. </td></tr></table>
    115. </form>
    116. </body>
    117. </html>

    설명은 제31강부터 진행하겠습니다.

     

    파일명

    기능

    modify.php

    글 수정 폼

    modify_ok.php

    글 수정 DB 처리 부분

    delete.php

    글 삭제 폼

    delete_ok.php

    글 삭제 DB 처리 부분

     

    우선 소스를 주~욱 살펴 보시기 바랍니다.


    1. <?
    2. //db 연결 부분입니다.
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error()); //host,id,passwd
    4. mysql_select_db("itmembers"); //db이름
    5. //수정폼(modify.php)에서 전송된 내용을 변수에 담습니다.
    6. $name = addslashes($name);
    7. $password = addslashes($password);
    8. $email = addslashes($email);
    9. $homepage = addslashes($homepage);
    10. $subject = addslashes($subject);
    11. $memo = addslashes($memo);
    12. //디폴트 값이 필요한 변수에는 디폴트 값을 넣습니다.
    13. $tablename="bbs"; //테이블 이름
    14. $writetime = time();
    15. //$ip = getenv("REMOTE_ADDR");
    16. //비밀번호가 맞는지 확인합니다.
    17. $sql = "select number from $tablename where number=$number and password='$password'";
    18. $result = mysql_query($sql) or die (mysql_error());
    19. if(mysql_num_rows($result)) { //반환된 열이 있으면...
    20. //수정한 내용을 UPDATE합니다.
    21. $sql = "update $tablename set
    22. name='$name',email='$email',homepage='$homepage',
    23. subject='$subject',memo='$memo' where number=$number";
    24. mysql_query($sql) or die (mysql_error());
    25. $msg = "수정을 하였습니다.";
    26. echo " <html><head>
    27. <script name=javascript>
    28. if('$msg' != '') {
    29. self.window.alert('$msg');
    30. }
    31. location.href='list.php?page=$page';
    32. </script>
    33. </head>
    34. </html> ";
    35. } else {
    36. $msg = "비밀번호가 틀립니다.";
    37. echo " <html><head>
    38. <script name=javascript>
    39. if('$msg' != '') {
    40. self.window.alert('$msg');
    41. }
    42. history.go(-1);
    43. </script>
    44. </head>
    45. </html> ";
    46. }
    47. ?>

    설명은 제31강부터 진행합니다.
    아래는 delete.php 소스입니다. (비밀번호를 확인하기 위해 입력받는 폼입니다.)

     

    파일명

    기능

    modify.php

    글 수정 폼

    modify_ok.php

    글 수정 DB 처리 부분

    delete.php

    글 삭제 폼

    delete_ok.php

    글 삭제 DB 처리 부분

     

    1. <html>
    2. <head>
    3. <meta http-equiv="content-type" content="text/html; charset=euc-kr">
    4. <title>글 삭제</title>
    5. <STYLE TYPE="text/css">
    6. BODY,TD,SELECT,input,DIV,form,TEXTAREA,center,option,pre,blockquote {font-family:굴림;font-size:9pt;color:#555555;}
    7. A:link {color:black;text-decoration:none;}
    8. A:visited {color:black;text-decoration:none;}
    9. A:active {color:black;text-decoration:none;}
    10. A:hover {color:gray;text-decoration:none;}
    11. </STYLE>
    12. <script language="javascript">
    13. function check_submit() {
    14. if (document.myForm.password.value == "") {
    15. alert('비밀번호를 입력해야 글을 삭제할 수 있습니다.');
    16. document.myForm.password.focus();
    17. return;
    18. } else {
    19. document.myForm.action = "delete_ok.php";
    20. document.myForm.submit();
    21. }
    22. }
    23. </script>
    24. </head>
    25. <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
    26. <form name="myForm" method="post">
    27. <input type="hidden" name="page" value="<? echo $page; ?>">
    28. <input type="hidden" name="number" value="<? echo $number; ?>">
    29. <table align="center" border="1" cellspacing="0" width="200" bordercolordark="white" bordercolorlight="#CCCCCC">
    30. <tr>
    31. <td>
    32. <p align="center">글 삭제 비밀번호</p>
    33. </td>
    34. </tr>
    35. <tr>
    36. <td align="center">
    37. <input type="password" name="password" maxlength="12" size="12">
    38. </td>
    39. </tr>
    40. </table>
    41. <p align="center">[<a href="javascript:check_submit();">삭제</a>] [<a href="javascript:history.go(-1)">취소</a>]</p>
    42. </form>
    43. </body>
    44. </html>


    지금까지 4시간에 걸쳐 글 내용 수정과 삭제 관련 소스를 주~욱 훑어 보았습니다.
    다음 시간부터 약 3~4회에 걸쳐 소스에 대한 설명을 하겠습니다.

    아래는 delete_ok.php 소스입니다.
    비밀번호가 맞으면 삭제하고 그렇지 않으면 이전 화면으로 돌아가는, 비교적 간단한 소스입니다.


    1. <?
    2. //db 연결 부분입니다.
    3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error()); //host,id,passwd
    4. mysql_select_db("itmembers"); //db이름
    5. //변수
    6. $password = addslashes($password);
    7. $tablename="bbs"; //테이블 이름
    8. //비밀번호가 맞는지 확인합니다.
    9. $sql = "select number from $tablename where number=$number and password='$password'";
    10. $result = mysql_query($sql) or die (mysql_error());
    11. $msg = "비밀번호가 틀립니다.";
    12. if(mysql_num_rows($result)) { //반환된 열이 있으면...
    13. //삭제합니다.
    14. $sql = "delete from $tablename where number=$number";
    15. mysql_query($sql) or die (mysql_error());
    16. $msg = "삭제하였습니다.";
    17. }
    18. //메시지를 출력하고 목록 페이지로 이동합니다.
    19. echo " <html><head>
    20. <script name=javascript>
    21. if('$msg' != '') {
    22. self.window.alert('$msg');
    23. }
    24. location.href='list.php?page=$page';
    25. </script>
    26. </head>
    27. </html> ";
    28. ?>

    이 강좌도 ITmembers.net의 다른 강좌와 마찬가지로 '재미로' 한번 웹 프로그래밍의 기초에 대해 알아보자는 취지였습니다.

    이를 위해 PHP와 MySQL을 연동하여 간단한 게시판 기능을 구현해봤습니다.
    그러나 이 강좌에서 다룬 내용만으로는 실제 웹서비스에 적용하기에는 다소 미흡한 면이 있습니다.

    글을 입력하고 수정하고 삭제하는 기능은 있으나 아직 파일 첨부 기능, 답변형 게시판 기능, 관리자 기능 등이 없는 초보적인 형태일 뿐입니다.

    물론 PHP 게시판 프로젝트는 여기서 끝나지 않습니다.
    1차 프로젝트의 목적이 웹 프로그래밍, DB 연동 등에 대한 초보적인 이해에 있었다면, 2차 프로젝트에서는 위에서 언급한 파일 첨부 기능, 답변형 게시판 구현, 검색 기능 등을 구현해 보도록 하겠습니다.

     

    출처 메멘토 (Don't forget) | 메멘토
    원문 http://blog.naver.com/sungback/90004593266

    반응형



    Posted by 궁극의 java개발자
    ,

    날짜 구하기

    Programming/Java 2015. 12. 11. 14:31





    반응형
    [ 날짜 연산법 ]


    가. 이해 및 유틸

    - 시스템 시간에 대한 이해
    - 날짜 계산 종합 유틸리티

    나. 응용팁

    시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
    ------------------------------------------------------------------
    // 밀리초 단위(*1000은 1초), 음수이면 이전 시각
    long time = System.currentTimeMillis ( );
    System.out.println ( time.toString ( ) );
    ------------------------------------------------------------------

    현재 시각을 가져오기.
    ------------------------------------------------------------------
    Date today = new Date ();
    System.out.println ( today );

    결과 : Sat Jul 12 16:03:00 GMT+01:00 2000
    ------------------------------------------------------------------

    경과시간(초) 구하기
    ------------------------------------------------------------------
    long time1 = System.currentTimeMillis ();
    long time2 = System.currentTimeMillis ();
    system.out.println ( ( time2 - time1 ) / 1000.0 );
    ------------------------------------------------------------------

    Date를 Calendar로 맵핑시키기
    ------------------------------------------------------------------
    Date d = new Date ( );
    Calendar c = Calendar.getInstance ( );
    c.setTime ( d );
    ------------------------------------------------------------------

    날짜(년/월/일/시/분/초) 구하기
    ------------------------------------------------------------------
    import java.util.*;
    import java.text.*;

    SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
    Date currentTime = new Date ( );
    String dTime = formatter.format ( currentTime );
    System.out.println ( dTime );
    ------------------------------------------------------------------

    날짜(년/월/일/시/분/초) 구하기2
    ------------------------------------------------------------------
    GregorianCalendar today = new GregorianCalendar ( );

    int year = today.get ( today.YEAR );
    int month = today.get ( today.MONTH ) + 1;
    int yoil = today.get ( today.DAY_OF_MONTH );

    GregorianCalendar gc = new GregorianCalendar ( );

    System.out.println ( gc.get ( Calendar.YEAR ) );
    System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
    System.out.println ( gc.get ( Calendar.DATE ) );
    System.out.println ( gc.get ( DAY_OF_MONTH ) );
    ------------------------------------------------------------------

    날짜(년/월/일/시/분/초) 구하기3
    ------------------------------------------------------------------
    DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
    Calendar cal = Calendar.getInstance(Locale.KOREA);
    nal = df.format(cal.getTime());
    ------------------------------------------------------------------

    - 표준시간대를 지정하고 날짜를 가져오기.
    ------------------------------------------------------------------
    TimeZone jst = TimeZone.getTimeZone ("JST");
    Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
    System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );

    결과 : 2000년 8월 5일 16시 16분 47초
    ------------------------------------------------------------------

    영어로된 날짜를 숫자로 바꾸기
    ------------------------------------------------------------------
    Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
    System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );
    ------------------------------------------------------------------

    "Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
    ------------------------------------------------------------------
    SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
    SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );

    String inString = "Sun, 5 Dec 1999 00:07:21";

    ParsePosition pos = new ParsePosition ( 0 );
    Date frmTime = formatter_one.parse ( inString, pos );
    String outString = formatter_two.format ( frmTime );

    System.out.println ( outString );
    ------------------------------------------------------------------

    숫자 12자리를, 다시 날짜로 변환하기
    ------------------------------------------------------------------
    Date conFromDate = new Date();
    long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
    System.out.println ( ttl ); //예 938291839221

    Date today = new Date ( ttl );
    DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
    String formatted = format.format ( today );
    System.out.println ( formatted );
    ------------------------------------------------------------------

    특정일로부터 n일 만큼 이동한 날짜 구하기
    ------------------------------------------------------------------
    특정일의 시간을 long형으로 읽어온다음..
    날짜*24*60*60*1000 을 계산하여.
    long형에 더해줍니다.
    그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다
    ------------------------------------------------------------------

    특정일에서 일정 기간후의 날짜 구하기2
    ------------------------------------------------------------------
    //iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
    import java.util.*;

    public String getDate ( int iDay )
    {
    Calendar temp=Calendar.getInstance ( );
    StringBuffer sbDate=new StringBuffer ( );

    temp.add ( Calendar.DAY_OF_MONTH, iDay );

    int nYear = temp.get ( Calendar.YEAR );
    int nMonth = temp.get ( Calendar.MONTH ) + 1;
    int nDay = temp.get ( Calendar.DAY_OF_MONTH );

    sbDate.append ( nYear );
    if ( nMonth < 10 )
    sbDate.append ( "0" );
    sbDate.append ( nMonth );
    if ( nDay < 10 )
    sbDate.append ( "0" );
    sbDate.append ( nDay );

    return sbDate.toString ( );
    }
    ------------------------------------------------------------------

    현재날짜에서 2달전의 날짜를 구하기
    ------------------------------------------------------------------
    Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
    cal.add ( cal.MONTH, -2 ); //2개월 전....
    System.out.println ( cal.get ( cal.YEAR ) );
    System.out.println ( cal.get ( cal.MONTH ) + 1 );
    System.out.println ( cal.get ( cal.DATE ) );
    ------------------------------------------------------------------

    달에 마지막 날짜 구하기
    ------------------------------------------------------------------
    for ( int month = 1; month <= 12; month++ )
    {
    GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
    System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
    }
    ------------------------------------------------------------------

    해당하는 달의 마지막 일 구하기
    ------------------------------------------------------------------
    GregorianCalendar today = new GregorianCalendar ( );
    int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
    System.out.println ( maxday );
    ------------------------------------------------------------------

    특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
    ------------------------------------------------------------------
    Calendar cal = Calendar.getInstance ( );
    cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
    SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
    System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
    System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );
    ------------------------------------------------------------------

    해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
    ------------------------------------------------------------------
    Calendar calendar = Calendar.getInstance ( );
    calendar.set ( 1999, 0, 1 );
    int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );
    ------------------------------------------------------------------

    어제 날짜 구하기
    ------------------------------------------------------------------
    오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
    셋팅해주면 쉽게 구할수 있죠..
    setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..
    ------------------------------------------------------------------

    어제 날짜 구하기2
    ------------------------------------------------------------------
    import java.util.*;

    public static Date getYesterday ( Date today )
    {
    if ( today == null )
    throw new IllegalStateException ( "today is null" );
    Date yesterday = new Date ( );
    yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );

    return yesterday;
    }
    ------------------------------------------------------------------

    내일 날짜 구하기
    ------------------------------------------------------------------
    Date today = new Date ( );
    Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
    ------------------------------------------------------------------

    내일 날짜 구하기2
    ------------------------------------------------------------------
    Calendar today = Calendar.getInstance ( );
    today.add ( Calendar.DATE, 1 );
    Date tomorrow = today.getTime ( );
    ------------------------------------------------------------------

    오늘날짜에서 5일 이후 날짜를 구하기
    ------------------------------------------------------------------
    Calendar cCal = Calendar.getInstance();
    c.add(Calendar.DATE, 5);
    ------------------------------------------------------------------

    날짜에 해당하는 요일 구하기
    ------------------------------------------------------------------
    //DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
    //아래 소스는 JSP일부입니다.
    import java.util.*;

    Calendar cal= Calendar.getInstance ( );
    int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
    if ( day_of_week == 1 )
    m_week="일요일";
    else if ( day_of_week == 2 )
    m_week="월요일";
    else if ( day_of_week == 3 )
    m_week="화요일";
    else if ( day_of_week == 4 )
    m_week="수요일";
    else if ( day_of_week == 5 )
    m_week="목요일";
    else if ( day_of_week == 6 )
    m_week="금요일";
    else if ( day_of_week == 7 )
    m_week="토요일";

    오늘은 : 입니다.
    ------------------------------------------------------------------

    콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
    ------------------------------------------------------------------
    //gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
    //요일을 배열로 만들어서 뽑아내면 되겠죠.
    GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
    String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
    String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );
    ------------------------------------------------------------------

    두 날짜의 차이를 일수로 구하기
    ------------------------------------------------------------------
    각각의 날짜를 Date형으로 만들어서 getTime()하면
    long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
    그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.
    ------------------------------------------------------------------

    두 날짜의 차이를 일수로 구하기2
    ------------------------------------------------------------------
    import java.io.*;
    import java.util.*;

    Date today = new Date ( );
    Calendar cal = Calendar.getInstance ( );
    cal.setTime ( today );// 오늘로 설정.

    Calendar cal2 = Calendar.getInstance ( );
    cal2.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.

    int count = 0;
    while ( !cal2.after ( cal ) )
    {
    count++;
    cal2.add ( Calendar.DATE, 1 ); // 다음날로 바뀜

    System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
    }

    System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );
    ------------------------------------------------------------------

    두 날짜의 차이를 일수로 구하기3
    ------------------------------------------------------------------
    import java.io.*;
    import java.util.*;

    public class DateDiff
    {
    public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
    {
    Calendar cal = Calendar.getInstance ( );
    int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;

    if ( nYear1 > nYear2 )
    {
    for ( int i = nYear2; i < nYear1; i++ )
    {
    cal.set ( i, 12, 0 );
    nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
    }
    nTotalDate1 += nDiffOfYear;
    }
    else if ( nYear1 < nYear2 )
    {
    for ( int i = nYear1; i < nYear2; i++ )
    {
    cal.set ( i, 12, 0 );
    nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
    }
    nTotalDate2 += nDiffOfYear;
    }

    cal.set ( nYear1, nMonth1-1, nDate1 );
    nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
    nTotalDate1 += nDiffOfDay;

    cal.set ( nYear2, nMonth2-1, nDate2 );
    nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
    nTotalDate2 += nDiffOfDay;

    return nTotalDate1-nTotalDate2;
    }

    public static void main ( String args[] )
    {
    System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
    }
    }
    ------------------------------------------------------------------

    파일에서 날짜정보를 가져오기
    ------------------------------------------------------------------
    File f = new File ( directory, file );

    Date date = new Date ( f.lastModified ( ) );
    Calendar cal = Calendar.getInstance ( );
    cal.setTime ( date );

    System.out.println("Year : " + cal.get(Calendar.YEAR));
    System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
    System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
    System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
    System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
    System.out.println("Second : " + cal.get(Calendar.SECOND));
    ------------------------------------------------------------------

    날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
    7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
    ------------------------------------------------------------------
    SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
    Calendar c = Calendar.getInstance ( );

    for ( int i = 0; i < 48; i++ )
    {
    c.clear ( );
    c.set ( 2000, 1, 3 - ( i * 7 ) );
    java.util.Date d = c.getTime ( );
    String thedate = sdf.format ( d );
    System.out.println ( thedate );
    }
    ------------------------------------------------------------------

    쓰레드에서 날짜 바꾸면 죽는 문제
    ------------------------------------------------------------------
    Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
    date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
    변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

    문제소스:
    public void run ( )
    {
    while ( true )
    {
    try{
    timer.sleep ( 60000 );
    }
    catch ( InterruptedException ex ) { }

    lblTimeDate.setText ( fGetDateTime ( ) );
    repaint ( );
    }
    }

    public String fGetDateTime ( )
    {
    final int millisPerHour = 60 * 60 * 1000;
    String DATE_FORMAT = "yyyy / MM / dd HH:mm";
    SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
    SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
    sdf.setTimeZone ( timeZone );

    long time = System.currentTimeMillis ( );
    Date date = new Date ( time );
    return sdf.format ( date );
    }

    해답:
    // 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
    public String getDate ( )
    {
    Date now = new Date ( );
    SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
    sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );

    return sdf4.format ( now );
    }
    ------------------------------------------------------------------

    날짜와 시간이 유효한지 검사하려면...?
    ------------------------------------------------------------------
    import java.util.*;
    import java.text.*;

    public class DateCheck
    {
    boolean dateValidity = true;

    DateCheck ( String dt )
    {
    try
    {
    DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
    df.setLenient ( false );
    Date dt2 = df.parse ( dt );
    }
    catch ( ParseException e ) { this.dateValidity = false; }
    catch ( IllegalArgumentException e ) { this.dateValidity = false; }
    }

    public boolean datevalid ( )
    {
    return dateValidity;
    }

    public static void main ( String args [] )
    {
    DateCheck dc = new DateCheck ( "2001-02-28" );
    System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
    }
    }
    ------------------------------------------------------------------

    두 날짜 비교하기(아래보다 정확)
    ------------------------------------------------------------------
    그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

    이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
    현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
    두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

    만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
    결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
    설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다
    ------------------------------------------------------------------

    두 날짜 비교하기2
    ------------------------------------------------------------------
    //Calendar를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여
    //복사한 후에 그 복사본을 가지고 비교한다
    import java.util.*;
    import java.util.Calendar.*;
    import java.text.SimpleDateFormat;

    public class DayComparisonTest
    {
    public static void main(String args[])
    {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");

    Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
    aDate.set(2001, 0, 1);

    Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜

    // 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
    aDate.set( Calendar.HOUR_OF_DAY, 0 );
    aDate.set( Calendar.MINUTE, 0 );
    aDate.set( Calendar.SECOND, 0 );
    aDate.set( Calendar.MILLISECOND, 0 );

    bDate.set( Calendar.HOUR_OF_DAY, 0 );
    bDate.set( Calendar.MINUTE, 0 );
    bDate.set( Calendar.SECOND, 0 );
    bDate.set( Calendar.MILLISECOND, 0 );


    if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
    System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
    else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
    System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
    else // aDate = bDate인 경우
    System.out.println("같은 날이구만");
    }
    }

     

    반응형

    'Programming > Java' 카테고리의 다른 글

    URL 읽어오기  (0) 2015.12.14
    디렉토리내 일정기간 지난 파일 삭제  (0) 2015.12.14
    디렉토리내 특정 파일 리스트 출력  (0) 2015.12.14
    [Java]특정날짜 요일 구하기  (0) 2015.12.14
    MD5방식 암호화  (0) 2015.12.11



    Posted by 궁극의 java개발자
    ,





    반응형

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;

    public class MD5 {

    /**
    * MD5 암호화
    * @param str
    * @return
    */
    public static String md5(String str) {
    StringBuffer sb = new StringBuffer();
    try {
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    md5.update(str.getBytes());
    byte[] md5encrypt = md5.digest();
    for(int i = 0; i < md5encrypt.length; i++) {
    sb.append(Integer.toHexString((int)md5encrypt[i] & 0xFF));
    }
    } catch(NoSuchAlgorithmException e) {
    System.out.println("암호화 에러 ==>> " + e.toString());
    }
    return sb.toString();
    }

    }

     

     

    MD5란??

    MD5는 역으로 해석이 불가능한 '단방향 32비트' 암호화 방식의 함수이다.

    즉, 역함수가 존재하지 않는 'Hash'함수이다.

    예를들어 'AAA'란 값을 MD5로 암호화 시키면, 'e1faffb3e614e6c2fba74296923386b7'값이 나온다.

    해당 값은 역추적이 불가능 하게 되어 있다.

     

    MD5 이용

    비밀번호 등의 암호화가 필요한 정보를 입력할 때 자주 사용한다.

    즉, 비밀번호를 입력한 개인만 알 수 있고 디비에 입력된 값은 관리자 조차도 알 수 없게 된다.

    그리고 특정 정보를 호출할 때 해킹의 위험의 있다면, MD5 암호를 이용해서 해킹으로 방지할 수도 있다.

    반응형

    'Programming > Java' 카테고리의 다른 글

    URL 읽어오기  (0) 2015.12.14
    디렉토리내 일정기간 지난 파일 삭제  (0) 2015.12.14
    디렉토리내 특정 파일 리스트 출력  (0) 2015.12.14
    [Java]특정날짜 요일 구하기  (0) 2015.12.14
    날짜 구하기  (0) 2015.12.11



    Posted by 궁극의 java개발자
    ,