2015년 1월 3일 토요일

php 간단 일기장 - php 에서 데이터베이스와 연결 끊기

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 - php 에서 데이터베이스와 연결 끊기

데이터베이스에 명령을 내리고 나서 결과까지 가지고 오고 나면 데이터베이스와 볼 일은 끝났다. 볼 일이 끝나면 명시적으로 연결을 끊어줘서 이제 볼 일이 끝났다는 것을 알려주게 된다.

<?php
mysql_close();
 ?>
 

php 간단 일기장 -php 에서 데이터베이스의 결과값 가져오기

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 -php 에서 데이터베이스의 결과값 가져오기

<?php
$query = 'select * from diary';
$result = mysql_query($query);
$total = mysql_affected_rows();

for ($i=0;$i<$total;$i++)
{
    mysql_data_seek($result,$i);
    $r = mysql_fetch_array($result);
}
?>



데이터베이스에 '쿼리' 로 명령을 내리고 나면 , 데이터베이스는 명령을 실행한 결과를 돌려준다.
결과는 $result 변수 안에 들어가게 된다.
이때 실행한 결과인 $result 변수는 Resource 타입이다.

주의해야 할 점은, 데이터베이스는 기본적으로 집합을 다룬다는 것이다.
즉 diary 테이블에서 모든 내용을 가져와 라고 명령했을 때, 특정한 조건이 없으므로 데이터베이스는 diary 테이블에 있는 모든 페이지의 정보를 돌려준다.
따라서 결과는 여러 페이지가 될 수 있다.

$result 값 예시.

    diary_id      contents                 write_date
       1              [첫번째 데이터]     2014.03.26
       2              [두번째 데이터]     2014.03.27


$total = mysql_affected_rows();
는 이렇게 데이터베이스가 돌려준 페이지가 몇 장인지 알려주는 함수이다.
아래 예시에 따르면 $total 은 2가 된다.


for ($i=0;$i<$total;$i++)
데이터베이스가 돌려준 결과의 갯수만큼 반복한다.


mysql_data_seek($result,$i);
$result 에는 데이터베이스에서 실행한 결과가 Resource 타입으로 들어간다. 이 Resource 안에는 여러개의 데이터가 있을 수 있으며, mysql_data_seek 명령어는 여러개의 데이터 중 하나의 데이터를 선택하라는 명령어이다.
반복문 안에 명령어가 있기 때문에 $i 는 페이지의 장 수만큼 변한다.

    첫번째 반복에서는 결과값 중 첫번째 결과값을 선택하게 된다.
    두번째 반복에서는 결과값 중 두번째 결과값을 선택하게 된다.


$r = mysql_fetch_array($result);
mysql_fetch_array 는 선택한 결과값을 배열로 변환하라는 함수다.


첫번째 반복일 때 $r의 값.
diary_id : 1
contents : 첫번째 데이터
write_date : 2014.03.26
1 : 1
2 : 첫번째 데이터
3 : 2014.03.26


두번째 반복일 때
diary_id : 2
contents : 두번째 데이터
write_date : 2014.03.27
1 : 2
2 : 두번째 데이터
3 : 2014.03.27


$r 의 값은 연관배열이다. 주목해야 할 점은 연관배열의 키가 '숫자', 그리고 '컬럼 이름' 이라는 것이다.
첫번째 데이터의 경우 $r의 값은
키 = 키 = 값
diary_id = 1 = 1
contents = 2 = 첫번째 데이터
write_date = 3 = 2014.03.26

형태를 띈다.

php 간단 일기장 - php 에서 데이터베이스에 명령 내리기

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


 php 간단 일기장 - php 에서 데이터베이스에 명령 내리기

데이터베이스와 연결 후에는 데이터베이스에 명령을 내려야 한다.
이러한 데이터베이스의 '명령'을 쿼리(Query) 라고 하며, 우리말로 하면 '질의한다' 라는 의미이다.


<?php
$query = 'select * from diary';
$result = mysql_query($query);
?>

select * from diary
는 diary 테이블 에서 (from) 모든것(*) 을 가져와(select) 라는 의미이다.
이 문자열은 데이터베이스가 알아들을 수 있는 '쿼리' 이다.
아직 명령을 내린 것은 아니며, 이러한 명령을 내릴 것이다.. 라고 $query라는 변수에 정의한 것이다.


 $result = mysql_query($query);

실제로 php 에서 데이터베이스로 명령을 내린다는 것이다.

    $query 의 값 "diary 테이블에서 모든것을 가져와" 라고
    mysql 에게 명령해 (mysql_query)
    그리고 명령의 결과를 $result 변수에 담아.

라는 뜻이다.

php 간단 일기장 - php 와 데이터베이스 연결

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 - php 와 데이터베이스 연결



여기서는 php4 버전 기준으로 설명한다.
php4 는 mysql_connect 를,
php5 는 mysqli_connect 사용함.

웹서버와 데이터베이스 서버는 각각 서로 다른 프로그램이기 때문에, 서로 통신할 수 있는 방법이 필요하다.

따라서 php가 실행되는 웹서버에서는 데이터베이스 서버에 질의를 할 때

    데이터베이스와 연결을 하고
    데이터베이스에 명령을 내리고
    결과를 받는다.

이때 데이터베이스에 연결하기 위해서는

    어떤 데이터베이스 서버에 : host
    데이터베이스에 질의를 할 수 있는 권한 확인을 위한 나의 이름 : user
    데이터베이스에 질의를 할 수 있는 내비밀번호 : passwd
    어떤 데이터베이스 종류에 : db

라는 정보가 필요하다.


코드
<?php
$db_host = "localhost"; 
$db_user = "php111";
$db_passwd = "php111"; 
$db_name = "phpdiary"; 

$conn = mysql_connect($db_host,$db_user,$db_passwd) or die ("데이터베이스 연결에 실패하였습니다!");

mysql_select_db($db_name, $conn); 

mysql_query("set names utf8");

?>
 
코드설명 
localhost 는 웹서버가 있는 컴퓨터를 뜻한다. 따라서 localhost 라고 지정하면 웹서버와 데이터베이스 서버가 같은 컴퓨터라는 의미이다.

$conn = mysql_connect($db_host,$db_user,$db_passwd)
을 풀어쓰면
mysql에 연결해. (mysql_connect) 데이터베이스 서버는 웹서버와 같은 곳에 있어. (localhost)
내 이름은 php111 이야 비밀번호는 php111 이야.
가 된다.


or die ("데이터베이스 연결에 실패하였습니다!");
는 데이터베이스 접속에 실패했을 경우, 데이터베이스에서 값을 가져와서 보여주거나 하는 것을 할 수가 없기 때문에 그대로 접속을 종료한다는 의미이다.


일단 데이터베이스 시스템과 연결이 되고 나면 어떤 데이터베이스와 연결할 지 데이터베이스 시스템에 알려줄 필요가 있다.
이 역할을 하는 것이 mysql_select_db 이다.



mysql_query("set names utf8");

php 와 데이터베이스를 연결할 때 어떤 character set 을 사용할 것인지 나타낸다.
Database 를 만들때, 소스파일 txt 인코딩, html 의 인코딩을 모두 utf-8 로 지정했으므로 utf-8 로 설정하면 된다.
주의할 점은 utf-8 이 아니라 하이픈이 빠진 utf8 이라는 것이다.

2015년 1월 2일 금요일

php 간단 일기장 - 데이터베이스 생성하기

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 - 데이터베이스 생성하기


phpmyadmin -> 데이터베이스 -> 새 데이터베이스 만들기 ->
이름 : phpdiary
Collation : utf8_general_ci

데이터베이스의 테이블들은 하나의 '데이터베이스' 에 속하게 된다.
여기서 '데이터베이스' 란 테이블들의 모음이라고 생각하면 쉽다.

php 간단 일기장 - DB 테이블 설계하기

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 - DB 테이블 설계하기


컬럼 추출
일기장은 내용과 글 쓴 날짜가 필요하다.
여기서 명사를 추출해보면
[일기장]
[내용]
[글 쓴 날짜]

가 된다.
이때 [일기장] 한 페이지에 하나의 [내용] 과 하나의 [글쓴 날짜] 가 있다.
[일기장] 은 여러 페이지가 있을 수 있다.
따라서 [일기장] 은 [내용] 과 [글쓴 날짜] 가 여러개 있는 형태이다.

풀어써 보면
일기장 : [내용, 글쓴 날짜], [내용, 글쓴 날짜] , ....
이렇게 내용, 글쓴 날짜 등 데이터의 집합을 가지고 있는 것은 하나의 테이블이 된다.


primary key
실제로 들어갈 데이터 외에, 일기장에는 [페이지] 가 필요하다.
보통 책에 있는 페이지를 연상하면 쉽다.
이때 페이지가 하는 역할은 각각의 [내용, 글쓴 날짜] 를 구분해 준다.
즉, 어제 쓴 일기와 오늘 쓴 일기를 구별하기 위해서는 [페이지] 라는 것이 있어야 한다.
이렇게 각각의 데이터 한 행을 다른 데이터와 구분해주는 [페이지] 같은 역할을 데이터베이스에서는 primary key 혹은 ID 라고 한다.


최종 설계
따라서 일기장의 테이블 구조는
일기장 : [페이지, 내용, 글쓴 날짜], [페이지, 내용, 글쓴 날짜] , ....

처럼 된다.

php 간단 일기장 - DB 테이블 실제 생성

이 문서는 지속적으로 갱신되는 내용을 다룹니다.
최신 버전의 문서는 언제든지 http://crealnet.blogspot.kr에서 얻을 수 있습니다.
문서가 업데이트 될 때마다 이메일로 받아보고 싶으시다면 http://crealnet.blogspot.kr/p/pdf.html 를 사용해 주세요.
기타 추가적으로 필요하신 사항은 http://crealnet.blogspot.kr/p/blog-page.html에서 연락주시면 됩니다.
읽어주셔서 감사합니다!


php 간단 일기장 - DB 테이블 실제 생성

컬럼명 짓기
[일기장] : [페이지], [내용], [글 쓴 날짜] 를 영어로 바꿔보면
diary, page, contents, write date 가 된다.

이때 Page는 각 [내용, 글 쓴 날짜] 를 구분해주는 ID 이므로,
diary_id 라고 이름붙인다.

contents 는 그냥 그대로 contents 라고 이름붙이면 된다.

Write Date도 그냥 사용하고 싶지만 데이터베이스의 컬럼은 띄어쓰기를 허용하지 않는다.
따라서 띄어쓰기 대신 _ 를 붙여서 write_date 라고 이름붙인다.


컬럼 타입
diary_id 는 유일한 숫자여야 한다.
또한 사용자가 직접 관리할 필요가 없이 하나의 contents 와 write_date 가 추가될 때마다 페이지 장 수가 늘어나면 된다.

contents 는 사용자가 글자를 입력하는 부분이므로 글자 형이다.
다만 우리는 간단한 일기장을 만들 것이기 때문에 500글자까지만 입력할 수 있다고 가정하자.

write_date 는 말 그대로 '날짜' 를 나타내기 때문에 '날짜' 형이다.


null
null 은 '값이 없다' 라는 의미이다. 따라서 allow null 이라고 하면 '값이 없을 수 있다' 라는 의미가 된다.

diary 테이블에서는 diary_id, contents, write_date 는 셋 다 필수적으로 있어야 한다.
따라서 not null 이 된다.



기본값

일반적으로 RDBMS 는 값이 입력될 때 아무것도 입력되지 않으면 '기본으로 설정해둔 값을 넣어라' 라고 설정할 수 있다.

diary_id 의 경우 유일한 값이며 자동으로 늘어난다.
RDBMS 는 이렇게 다른 행과 구별하는 id 의 경우 많이 사용하기 때문에 특별한 기능을 넣었다.
그것이 auto increasement 이다.

일기장의 특정 페이지를 찾기 위해서는 '색인'을 만들어놓고 찾아보면 쉽다.
즉 목차를 미리 만들어서 이 내용이 여기 있구나.. 라고 미리 마킹해 두는 것이다.
이렇게 미리 색인을 만들어서 찾아보기 쉽게 만든 것을 인덱스라고 한다.
 Primary key 라는 것은 인덱스의 종류로써, contents 와 write_date 를 지정하는 대표 값을 뜻한다.

write_date 의 경우 굳이 사용자가 입력할 필요 없이 실제로 저장된 시간이 입력되면 된다.

따라서 사용자가 직접 입력해야 하는 부분은 contents 뿐이다.


실제 컬럼 (필드) 생성
phpmyadmin -> 왼쪽 phpdiary 클릭 -> 구조 -> 새로운 테이블 ->
이름 : diary
Number of Fields : 3






실제 컬럼 (필드) 정의 입력
필드 1 - 이름 : diary_id
필드1 - 종류 : int
필드1 - 인덱스 : primary
필드1 - AUTO_INCREMENT : 체크

필드2 - 이름 : contents
필드2 - 종류 : varchar
필드2 - 길이 : 500

필드3 - 이름 : write_date
필드3 - 종류 : TIMESTAMP
필드3 - 기본값 : CURRENT_TIMESTAMP

저장 버튼 클릭

실제로 데이터베이스에서는 날짜를 지정하는 타입이 TIMESTAMP 외에도 date, datetime 등 여러가지가 있다.
다만 mysql 에서는 '자동으로 현재시간'을 지정하기 위해서는 TIMESTAMP 형이어야 한다는 제약이 있다.
따라서 write_date 는 TIMESTAMP 형으로 지정한다.


DML

CREATE TABLE `phpdiary`.`diary` (
`diary_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`contents` VARCHAR( 500 ) NOT NULL ,
`write_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM ;

이런 메세지가 나온다. 이것은 GUI 로 실행한 것을 텍스트로 실행했을 경우 이런 명령어로 실행하면 된다는 의미이다.