2014.10.21 13:58

4강. MySQL에 저장한 정보를 읽어서 화면에 보여주기

파일을 저장 할 때는 인코딩이 UTF-8인지 확인 한다. ANSI(euc-kr) 인코딩은 앞으로 지원하지 않는다.

 

3강에서는 FORM에서 입력받은 정보를 서버로 전송해 PHP의 MySQL 내장 함수를 이용해 레코드를 저장했다. 이제는 저장 된 레코드를 읽어 화면에 목록 형태로 출력한다.

 

// test.html

 

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>명함관리</title>

<style>
body { text-align:center; }
form { margin:0; padding:0; }

.namecard_box { width:700px; padding:10px; margin:auto; text-align:left; border:1px solid #AEAEAE; } /* 테두리 */
.namecard_box > div { clear:both; }
.namecard_box div div.item { float:left; width:20%; margin:0 auto; } /* 항목 이름*/
.namecard_box div div.val { float:left; width:80%; margin:0 auto; } /* 입력 값 */
.namecard_box .btnbox { clear:both; padding:30px; text-align:center; } /* 버튼 */
</style>
</head>
<body>
 <div class="namecard_box">
 <form name="form_name" method="post" onsubmit="return senddata(this);">
 <div>
  <div class="item">이름</div>
  <div class="val"><input type="text" name="name" size="20"></div>
 </div>
 <div>
  <div class="item">성별</div>
  <div class="val"><input type="radio" name="sex" value="1">남 <input type="radio" name="sex" value="2">여</div>
 </div>
 <div>
  <div class="item">생년월일</div>
  <div class="val"><input type="text" name="birth" size="10" maxlength="8"> 예)19991019</div>
 </div>
 <div>
  <div class="item">소개</div>
  <div class="val"><textarea name="intro" rows="5" cols="50"></textarea></div>
 </div>
 <div class="btnbox"><input type="submit" value="저장"></div>
 </form>
 </div> <!-- endof namecard_box -->

 

<script>
function senddata(f){
 if(f.name.value == "") {
  alert("이름을 입력하지 않았습니다.");
  return false;
 }
 if(!f.sex[0].checked && !f.sex[1].checked) {
  alert("성별을 입력하지 않았습니다.");
  return false;
 }
 if(f.birth.value == "") {
  alert("생년월일을 입력하지 않았습니다.");
  return false;
 }
 if(f.intro.value == "") {
  alert("소개를 입력하지 않았습니다.");
  return false;
 }

 f.action = "save.php";
 f.submit();
}
</script>
</body>
</html> 

test.html 파일은 2강에서 부터 해 왔던 FORM을 작성하는 파일이다. 여기서 간단히 자바스크립트 사용법을 살펴 봤고 FORM에서 입력받은 정보를 서버의 PHP 파일로 전송할 때 submit 이벤트가 어떻게 작동하는지 배웠다.

 

// save.php

 

<?php
echo $_POST[name] . $_POST[sex] . $_POST[birth] . $_POST[intro];

extract($_POST);

echo "<br>";
echo "이름 :" . $name . ", 성별 : " . $sex . ", 생년월일 : " . $birth . ", 소개 : " . $intro;

//-- DB 연결
$mysql_host = '127.0.0.1'; //-- 또는 localhost
$mysql_user = 'temp';
$mysql_password = 'temp1234';
$mysql_db = 'temp';

$conn = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("데이터베이스 연결에 실패하였습니다!"); 
mysql_select_db($mysql_db, $conn); // DB 선택


//-- 테이블 생성
/*
CREATE TABLE `namecard` (
 `record` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 40 ) NOT NULL ,
`sex` VARCHAR( 1 ) NOT NULL ,
`birth` VARCHAR( 8 ) NOT NULL ,
`intro` TEXT NOT NULL ,
PRIMARY KEY ( `record` )
)

테이블은 이미 만들어져 있기 때문에 생략
*/


//-- 저장하기
$sql = "insert into namecard set name='$name', sex='$sex', birth='$birth', intro='$intro'";
mysql_query($sql);


//-- 읽어오기
$sql = "select * from namecard";
$rs = mysql_query($sql);
while($rd = mysql_fetch_array($rs)) {
 echo "<br>" . "이름 :" . $rd[name] . ", 성별 : " . $rd[sex] . ", 생년월일 : " . $rd[birth] . ", 소개 : " . $rd[intro];
}
?>

save.php는 클라이언트에서 입력 받아 서버로 전송 된 정보를 받아 필요한 형태로 가공 하거나 DB에 저장한다. test.html에서 FORM의 method 형태가 POST 였기 때문에 서버에서는  $_POST[]라는 환경 변수에 배열 형태고 값을 넘겨 받는다. extract() 함수는 배열의 키와 값을 변수 형태로 변환 시켜 주는 역할을 한다.

 

$conn = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("데이터베이스 연결에 실패하였습니다!"); 
mysql_select_db($mysql_db, $conn); // DB 선택

MySQL을 이용하기 위해서는 MySQL 서버에 접속 해야하는데 mysql_connect()가 그 역할을 한다. MySQL 서버에 연결이 됐다면 핸들을 반환하지만 실패 했다면 안내문을 출력하고 실행을 종료한다.

MySQL 서버에 연결 했다면 이젠 MySQL에서 내가 사용 할 DB를 선택해야 한다. MySQL에서는 다른 사용자의 계정에는 접근 할 수 없다. 따라서 사용자 계정 정보가 반드시 필요하다. mysql_select()는 사용자 계정으로 접속한 MySQL 계정에서 내가 사용 할 DB를 선택하게 된다.

 

CREATE TABLE `namecard` (
 `record` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 40 ) NOT NULL ,
`sex` VARCHAR( 1 ) NOT NULL ,
`birth` VARCHAR( 8 ) NOT NULL ,
`intro` TEXT NOT NULL ,
PRIMARY KEY ( `record` )
)

create는 mysql의 정의어에 해당한다. 테이블을 생성하는 명령이다. 예문에서는 namecard라는 이름의 테이블을 생성하는데 각 필드마다 데이터 타입과 자료 저장 방식을 정의한다.

 `record` INT NOT NULL AUTO_INCREMENT ,

이 예문은 record라는 필드를 정수형(INT)으로 선언하고 NULL 문자를 허가 하지 않는다. AUTO_INCREMENT는 record 필드의 입력 값이 없다면 이 필드에서 가장 큰 값에 1을 더한 값을 저장한다. 레코드 번호로 자주 사용 된다.

PRIMARY KEY ( `record` )

마지막 이 문장에는 record라는 필드를 기본키로 하겠다는 뜻이다. 기본키는 중복 된 값을 갖지 않는다.

 

저장 된 DB를 읽어 목록 형태로 보여주기

 

<?
/* list.php */

 

//-- DB 연결
$mysql_host = '127.0.0.1'; //-- 또는 localhost
$mysql_user = 'temp';
$mysql_password = 'temp1234';
$mysql_db = 'temp';

$conn = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("데이터베이스 연결에 실패하였습니다!"); 
mysql_select_db($mysql_db, $conn); // DB 선택


$sql = "select * from namecard";
$rs = mysql_query($sql);
?>
<style>
.title { text-align:center; background:#EBEBEB; }
.num { text-align:center; }
</style>

<table width="60%" border=1 cellspacing=0 cellpadding=5>
<tr class="title">
 <td>번호</td><td>이름</td><td>성별</td><td>생년원일</td><td>소개</td>
</tr>
<? while($rd = mysql_fetch_array($rs)) :
 $birth = substr($rd[birth], 0, 4) . "년 " . substr($rd[birth], 4, 2) . "월 " . substr($rd[birth], 6, 2) . "일";
?>
<tr>
 <td class="num"><?=$rd[record]?></td><td><a href="modify.php?record=<?=$rd[recnord]?>"><?=$rd[name]?></a></td><td><?=($rd[sex] == "1")?"남":"여"?></td><td><?=$birth?></td><td><?=$rd[intro]?></td>
</tr>
<? endwhile; ?>
</table> 

 

 

list.php는 레코드를 읽어와 table 형태로 화면에 출력해주는 기능을 한다. DB 연결 부분은 MySQL을 사용 할 때마다 실행 되야 하기 때문에 별도의 PHP로 작성한 후에 include() 함수를 이용해 문서 내에 import 하는 게 편하다.

$sql = "select * from namecard";
$rs = mysql_query($sql);

이 문장은 namecard라는 테이블에서 모든 레코드를 읽어 오겠다는 뜻이다. select 뒤에 *는 레코드의 모든 필드를 읽어 오겠다는 것이다. mysql_query()로 쿼리가 실행 되면 실행 결과를 $rs에 반환 한다. 실행이 정상적으로 이루어 졌다면 $rs는 레코드 검색 결과가 객체 형태로 저장 된다.

 

<? while($rd = mysql_fetch_array($rs)) :
while() {} 문은 for() 문처럼 반복 실행문이지만 괄호()안의 연산 값이 조건이 거짓 일 때까지 반복 수행한다. mysql_fetch_array($rs)는 $rs에 객체 형태로 저장 된 레코드 검색 결과를 배열 형태로 변환 시켜 준다. 만약 배열의 마지막까지 모두 반환 했다면 이 문장에서는 거짓을 반환하기 때문에 while문은 종료 된다.

substr("문자열", 시작 위치, 길이)

문자열의 특정 부분을 잘라 낼 때 사용하는 함수다. 문자를 잘라 낼 위치와 길이를 지정해야 하는데 문자열의 위치는 첫 글자가 0부터 시작한다. substr($rd[birth], 5, 2)는 $rd[birth]라는 배열에 저장 된 문자열의 6번째 글자부터 2개의 문자를 잘라내겠다는 뜻이다.

 

예문1

while() {

    실행 문

}

 

예문2

while() :

   실행문

endwhile;

 

예문1과 예문2에는 조금 차이가 있다. 실행 문을 {} 중괄호와 :, endwhile로 묶었다. 중괄호를 사용 할 때는 실행문 안에 PHP 코드만 사용 할 때 편하고 콜론:과 endwhile로 구역을 묶었을 때는 위의 예문처럼 HTML 태그나 텍스트 위주로 출력이 많을 때 사용하면 편하다. if문, for문에서도 마찬가지인데 반복 실행문이나 조건문의 실행문이 길어 질 때는 닫는 중괄호가 여러 개가 있을 수 있어 보기에 불편할 수 있기 때문에 문장이 길어 질 때는 endwhile, endif, endfor 등으로 구분 하는 것이 좋다.

 

 

위의 예문이 실행 된 결과가 이런 모습이라면 정상적으로 레코드를 불러 온 것이다.

        

Trackback 0 Comment 2
  1. 2014.12.13 01:11 address edit & del reply

    비밀댓글입니다

    • ZIBSIN 2014.12.13 11:06 신고 address edit & del

      감사 합니다. 수정 했습니다.

      FORM에서 다른 FORM으로 자료를 넘겨주는 방법에는 여러가지가 있습니다.
      SUBMIT을 이용해 다른 프로세스에 넘겨 주는 방법과 한 페이지에서 자바스크립트를 이용해 각 요소를 하나씩 복사 할 수 있는데 시간이 될 때 포스팅을 준비 하도록 하겠습니다.