세이박스

'mysql'에 해당되는 글 62건

  1. 안드로이드 앱과 연동하는 웹서버프로그래밍 개발 교육 1일차 모임 후기
  2. [강의] 서버프로그래밍 관리페이지 제작 + JSON 출력 + 안드로이드앱 연동 교육 (부산)
  3. [부산] 서버 연동 앱개발을 위한 관리페이지 제작 및 JSON 출력 만들기 무료 교육 - 재직자대상
  4. MySQL root 비번을 잊어버려서 접속을 못할 경우 패스워드 초기화 방법
  5. [MYSQL] Starting MySQL. ERROR! Manager of pid-file quit without updating file.
  6. Client does not support authentication protocol requested by server; consider upgrading MySQL client
  7. Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)
  8. MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정
  9. [클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)
  10. 비밀번호 변경시 임의 문자와 숫자 조합으로 생성후 회원에게 이메일 전송 (비번 암호화 원리 팁)
  11. 비밀번호 변경시 임의 문자와 숫자 조합으로 생성후 회원에게 이메일 전송 (비번 암호화 원리 팁)
  12. 리눅스 페도라(fedora) 10 버전에서 mysql 5.0.22 버전 설치하기
  13. MySQL 설치시 생기는 오류
  14. 우편번호 최신 DB 2009.2.23
  15. MYSQL STOPPING server from pid file /usr/local/mysql/var/서버명.pid
  16. [mysql] ERROR 1016: Can't open file: '테이블명.MYD'. (errno: 145) 복구
  17. PHP와 MYSQL 데이타 연결과 쿼리 주기
  18. mysql 데몬 종료
  19. ERROR 1016: Can''t open file: ''테이블명.MYD''. (errno: 145) - 복구하기
  20. mysql 로그 지우기
  21. mysql로그 보기
  22. mysql 로그 삭제 (호스트명-bin.001 )
  23. MySQL 로그 파일 관리 - mysql rotate를 이용하여 쿼리 로그 확인
  24. MYSQL 동시접속자 등 높을경우
  25. MYSQL DB에서 램덤으로 값 받기
  26. 2건 이상 중복되는 회수 구하기 쿼리 예
  27. MySQL 튜닝 18 가지
  28. mysql 유용한 팁
  29. mysql 동시접속자 수
  30. ./configure 할때 다음과 같이 에러가 생길땐

안드로이드 앱과 연동하는 웹서버프로그래밍 개발 교육 1일차 모임 후기

모바일앱개발

 

 

 

 

 

부산에서 2016년3월15일 화요일 저녁 7시~10시까지 3시간 동안 부산모바일앱개발센터 교육장에서 1차 모임을 가졌습니다.

 

스마트폰의 모바일 앱 개발은 이제 웹서버프로그래밍을 통한 Data 관리 환경의 필요성을 많은 분들이 필요성을 느끼셔서 본 강의를 요청하셔서 개설하게 되었습니다.

 

총 10분이 참여하셨구요. 끝까지 열공하셔서 좋은 결실 맺기를 바랍니다.

 

관리자 로그인, 회원관리, 게시판 및 자료실, 상품 관리 등의 관리 페이지 개발과 JSON 통신을 위한 DB 출력까지 진행합니다.

 

JSON Data를 앱에서 받아서 출력만하면 끝! ^^

 

출처 : http://www.androidstudy.co.kr/bbs/board.php?bo_table=B53&wr_id=127

 

 

[강의] 서버프로그래밍 관리페이지 제작 + JSON 출력 + 안드로이드앱 연동 교육 (부산)

웹프로그램

안녕하세요! 안드로이드스터디 운영자 이경용 입니다.

요즘 개발하는 대부분은 앱들이 서버와의 통신을 기본으로 개발되고 있습니다.
하지만 대부분 모바일 앱 개발 관련 교육만 있으며, 서버 중심의 관리페이지 개발에 대해서는 잘 없기에 준비했습니다.
"요기요", "배달의민족", "쿠팡"와 같은 앱의 업소 정보는 매번 바뀔때 마다 앱을 어떻게 업데이트 할까요?
업소 정보는 별도의 웹 환경에서 관리페이지를 만들고 DB와 이미지를 관리하며, JSON으로 앱과 자료를 주고 받습니다.
이러한 관리페이지를 만드는 기본 과정을 학습하고 실습을 통해 만들어 보고자 합니다.
관리페이지를 만드는 언어는 html , css, javascript, php, mysql 를 이용해서 만들니다.
해당 언어의 기초 지식이 있으면 좋지만, 전체 구성을 이해하는것 만으로도 큰 도움이 되실 겁니다.

교육목표 :
- PHP, MySQL을 이용해서 관리페이지를 만들고 JSON으로 출력해서 모바일 앱에서 서버의 자료를 받을 수 있는 관리 시스템을 개발하는 교육과정이다. (안드로이드 JSON 파싱 연동)


교육내용 :
1일차 : 관리페이지와 JSON 통신 구축 소개 및 개발환경 구축
2일차 : 제어문, 반복문, 배열, 함수
3일차 : MySQL 데이터베이스, MySQL 명령
4일차 : PHP와 MySQL의 연동
5일차 : 쿠키와 세션, 관리페이지 로그인 기능 구현
6일차 : 게시판 만들기
7일차 : 자료실 만들기
8일차 : JSON 출력 및 안드로이드 앱 연동
* 교육 내용은 수강생 구성에 따라 내용이 다소 변경될 수도 있습니다.


교육안내 :
1.일시 : 2016년 3월 15일 ~ 4월 7일
2.시간 : 매주 화,목 저녁 7시~10시 (3시간) / 총 8일 (24시간)  * 일정은 강사의 사정에 따라 일부 변동될 수도 있습니다.
3.장소 : 해운대 센텀시티 (구체적인 장소는 별도 안내)
4.준비 : 노트북 사양무관 (* 노트북이 없는 경우 문의)
5.비용 : 유료 20만원, 시간당 9천원 정도 입니다. (입금문의 : 010-2694-8424)
6.신청 : 아래 게시글에 코멘트에 비밀글 체크후 연락처, 노트북 유무, 자바실력, 간단소개글 정도 남겨 주시기 바랍니다.
http://www.androidstudy.co.kr/bbs/board.php?bo_table=B11&wr_id=3033
8.접수 : 2016년 3월 14일 까지



* 아래 게시글에 코멘트로 "비밀글" 체크후 이름과 연락처, 서버프로그래밍 및 홈페이지 개발 경험, 참가 이유 등을 남겨 주세요! (접수 확인후 개별 연락 드립니다.)
http://www.androidstudy.co.kr/bbs/board.php?bo_table=B11&wr_id=3033



[부산] 서버 연동 앱개발을 위한 관리페이지 제작 및 JSON 출력 만들기 무료 교육 - 재직자대상

웹프로그램

안녕하세요! 안드로이드스터디 운영자 이경용 입니다.

요즘 개발하는 대부분은 앱들이 서버와의 통신을 기본으로 개발되고 있습니다.
하지만 대부분 모바일 앱 개발 관련 교육만 있으며, 서버 중심의 관리페이지 개발에 대해서는 잘 없기에 준비했습니다.
"요기요"와 같은 앱의 업소 정보는 매번 바뀔때 마다 앱을 어떻게 업데이트 할까요?
업소 정보는 별도의 웹 환경에서 관리페이지를 만들고 DB와 이미지를 관리하며, JSON으로 앱과 자료를 주고 받습니다.
이러한 관리페이지를 만드는 기본 과정을 학습하고 실습을 통해 만들어 보고자 합니다.
관리페이지를 만드는 언어는 html , css, javascript, php, mysql 를 이용해서 만들니다.
해당 언어의 기초 지식이 있으면 좋지만, 전체 구성을 이해하는것 만으로도 큰 도움이 되실 겁니다.
단, 이번 교육은 고용보험 가입이 되어 있는 재직자에 한해서 진행하는 교육입니다.

대상 :
부산지역 고용보험 가입된 재직자

교과목표 :
- PHP, MySQL을 이용해서 관리페이지를 만들고 JSON으로 출력해서 모바일 앱에서 서버의 자료를 받을 수 있는 관리 시스템을 개발하는 교육과정이다.

사전지식 :
- HTML, CSS, JAVASCRIPT, PHP, MySQL 기초 지식


교육일자 :
1주차 - 5/19(화) ~ 5/22(금)
2주차 - 5/26(화) ~ 5/29(금)

교육시간 :
오후 07:00 ~ 10:00 (3시간)


교육장소 :
부산모바일앱개발센터 교육장


교육내용 :
1일차 : 개발환경 설정
2일차 : 관리페이지 로그인 기능 추가
3일차 : 공지사항 기본 기능 만들기
4일차 : 공지사항 첨부기능 추가
5일차 : 공지사항 페이징 추가
6일차 : 공지사항 JSON 출력, 안드로이드 앱 리스트뷰 적용
7일차 : 업소관리 만들기 응용
8일차 : 검색기능 추가

신청방법 :
1. 첨부된 문서를 3개를 다운받아서 작성후 이메일 제출 (제출한 분은 아래 코멘트에 이름과, 연락처를 비밀글로 남겨 주세요)
동명대학교 지역산업인력양성사업단 김미영 담당자앞 
mykim@tu.ac.kr
2. 동명대학교 지역산업인력양성사업단에서 검토후 자격여부 확인후 회신 (이메일 또는 전화)
3. 5/14(목)까지  신청서 및 일반현황제출,협약서 제출 단! 협약서는 반드시 컬러스캔하여 메일전송 또는 원본제출


오시는길 안내

2호선 센텀시티역 2번출구에서 하차후
커피빈과 홈플러스 사이 길 5분도보
센텀벤처타운(부산정보산업진흥원 건물) 3층
부산모바일앱개발센터 교육장
부산모바일앱개발센터 : http://bmac.kr/CenterInfo/CenterInfo05.aspx
네이버 지도 : http://goo.gl/2kY5rC
대중교통 이용안내 :
마을버스 : 해운대구3-1, 해운대구3-2
일반버스 : 115, 181, 100, 31, 200, 5-1
좌석버스 : 307
급행버스 : 1002, 1007
문의 : 이경용 010-2694-8424 / ceo@apptools.co.kr
* 주차 비용 받으니 홈플러스 주차장 이용 또는 대중교통 이용을 바랍니다. ^^

* 교육 관련 문의는 이경용 010-2694-8424 / ceo@apptools.co.kr



신청안내 :
http://www.androidstudy.co.kr/bbs/board.php?bo_table=B11&wr_id=2964


MySQL root 비번을 잊어버려서 접속을 못할 경우 패스워드 초기화 방법

데이타베이스

MySQL 설치하면서 비번을 잘못 입력(오타)하거나 기존 root 개정을 잊어 버린경우 다시 설치 하지 않고 비번만 변경할수 있습니다.
기존 MySQL 프로세스 종료하고 안전모드로 접속한후에 개정 테이블(user)에서 root 패스워드를 변경하는 방법입니다.

# MySQL 프로세스 죽이기
/etc/init.d/mysqld stop
killall mysqld

# MySQL 안전모드 접속후 root 비번 변경
cd /usr/local/mysql/bin
./mysqld_safe --skip-grant &
use mysql;
update user set password=password('비밀번호') where user='root';
FLUSH PRIVILEGES;
exit;

# 접속확인
mysql -uroot -p mysql

비번 입력후 mysql> 접속이 잘되면 성공입니다.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드..

[MYSQL] Starting MySQL. ERROR! Manager of pid-file quit without updating file.

컴활용

MySQL 설치후 /etc/my.cnf 수정후 MySQL을 실행 했는데, Starting MySQL. ERROR! Manager of pid-file quit without updating file. 와 같은 오류가 떠드군요.

# /etc/rc.d/mysqld start
# Starting MySQL. ERROR! Manager of pid-file quit without updating file.

이유는 my.cnf를 잘못 수정한 원인이었습니다.
그래서 /etc/my.cnf를 삭제하고

# /usr/local/mysql/bin/mysql_install_db --user=mysql

실행해서 데이타베이스를 새로 생성하니 잘 되더군요.
아님 my.cnf를 수정하시기 전에 백업을 하신다면 다시 원복해서 실행하면 정상 동작할 겁니다.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드...

Client does not support authentication protocol requested by server; consider upgrading MySQL client

데이타베이스
문자모아 솔루션 설치후 ./emma -a -d 실행 했더니 다음과 같은 MySQL 오류가 나타난다.

Client does not support authentication protocol requested by server; consider upgrading MySQL client

오류 메시지를 보면 대략 client 요청이 잘못된 규칙이니 클라이언트(즉, emma)에서 요청 규칙을 업그레이드(수정)해라 대략 그런 내용입니다.

이유는 문자모아 SMS 솔루션은 MySQL 4.0 환경으로 만들어 졌지만 설치한 MySQL은 5.x 버전이라 개정 접속시 password 오류가 발생 하는 것이었다.

따라서, 별도의 개정을 추가 한뒤 password만 old_password로 지정 해주면 완료!


우선 기본 설정 방법으로 계정을 생성한 후에 MySQL 접속후

# use mysql;
# update user set password = old_password('암호')  where user = 'id' and host = '호스트명';
# FLUSH PRIVILEGES;

 

 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

데이타베이스
Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

Character set '#192' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index' file

PHP + MySQL 연동시 자주 발생하는 오류로써 MySQL에 문자셋 설정 오류 입니다.
오류 메시지 내용만 보면 ?.conf 문자셋 파일이 없다 그런 내용입니다.
해결 방법을 찾아서 이것저것 해보았지만 해결되지 않더군요.

그래서 오류 메시지가 알려준데로 MySQL에서 이용하는 문자셋중 latin1.xml 파일을 ?.conf 파일로 복사 해줬더니 더이상 오류가 나지 않더군요

일단 MySQL 소스 설치를 /usr/local/mysql 에 하셨다면

cd /usr/lcoal/mysql/share/mysql/charsets/
cp latin1.xml ?.conf

이렇게 하니 더이상 오류가 뜨지 않더군요.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정

데이타베이스

Aapache 2.x, PHP 5.x, MySQL 5.x 설치후 서버 이전을 끝내고 사이트 접속해보니 한글이 모두 ㅁㅁㅁ 특수기호들로 깨져 버리더군요.
원인을 알아 보니 mysql 기본 설치시 기본 문자셋이 utf8이 아니라서 생긴 문제 이더군요.
웹소스는 utf8 이며 기존 DB 자료 역시 utf8인데 mysql 기본 문자셋은 다른 문자로 되어 있어서 생긴 문제 였습니다.
다행이도 해결 방법이 mysql 다시 설치 하는 것이 아니라 /etc/my.cnf MySQL 설정 파일만 수정해 주면되었습니다.


자신의 기본 문자셋이 어떻게 되어 있는지 확인 해 보실려면 mysql 접속후 다음과 같이 확인 해 보세요!

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

이와 같이 latin1 등의 문자셋으로 설정 되어 있음을 확인하실 수 있습니다.

설정파일 수정은 /etc/my.cnf 파일을 수정 하시면 되며, 각 [항목] 바로 아래에 문자셋 설정을 추가 해주시면 됩니다.

# vi /etc/my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect='set names utf8'
character-set-server=utf8
default-collation=utf8_unicode_ci
skip-character-set-client-handshake
character-set-filesystem=utf8
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

위와 같이 추가하고 저장후 mysql 데몬을 다시 실행 해 보시면 아래와 같이 문자 기본셋이 변경 되었음을 확인 하실 수 있습니다.

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

사이트 접속해보니 이제 정상으로 한글이 보이는 군요.
등록 및 수정 등 쿼리 전송시 한글 처리는 잘되는지 아직 안해봤음 ^^


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

[클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

데이타베이스

어느날 갑자기 MySQL 테이블 하나를 읽을려고 할때 다음과 같은 메시지가 나타날 경우

SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

테이블이 오류가 난것입니다.
원인은 하나의 테이블에 지속적으로 접속자가 너무 많이 connection이 된 경우 혹은 MySQL 기록중에 DB서버가 강제 종료 혹은 리부팅 되는 경우 깨지는 경우가 종종 발생 합니다.

이처럼 비정상적으로 종료된 테이블인 경우 마지막 처리 과정을 복구해서 정상 동작 하도록 하는 명령어가 있습니다.

먼저 해당 테이블 DB에 접속합니다.

mysql -u아이디 -p db이름
비번 :
repair table tablename; 입력 혹은 그냥 엔터

또는 간단하게 한줄로

mysql -u아이디 -p비번 db이름 repair table 테이블명


  최신영화 보러가기... 


비밀번호 변경시 임의 문자와 숫자 조합으로 생성후 회원에게 이메일 전송 (비번 암호화 원리 팁)

웹프로그램
회원가입후 비밀번호를 잊은 경우 기존 비번이 암호화 처리 되어 있어(개인정보 보호법에 의해 비밀번호 암호화 의무화) 비번을 임의로 생성후 메일로 발송해야 합니다.
문자 조합을 간단하게 해 버릴 경우 해킹 시도시 비번찾기를 이용해서 이메일로 수신된 비번을 보지 않아서 추측해서 알아 낼 수 가 있습니다.
예로 "aa1234bb" 라는 임시 비번으로 생성해서 회원에게 발송하는데, 항상 숫자 부분만 변동해서 보내 준다면 해커는 역으로 0000~9999까지 조합해서 임의로 접속 시도를 해볼수 있게 됩니다.

간혹 보안 적용이 허술한 사이트의 경우 위와 같이 비번을 발송해주는 곳이 더러 있더군요.
개인정보 유출 사고는 위와 같이 개발자의 부주의가 매우 크다고 보면 됩니다.

문자 조합을 복잡하게 하는게 복잡하지도 않습니다.
아래처럼만 처리 해주셔도 랜덤한 값이 되므로 효과 적입니다.

<?
$pw = "0123456789abcdefghijklmnopqrstuvwxyz";
$temp_pw = "";
for($i=0;$i<10;$i++) {
 $temp_pw .= $ipwd[rand(0,35)];
}
echo $temp_pw;
?>

위와 같이 적용시 10자리의 랜덤한 문자 조함 결과가 나옵니다.
더욱 복잡하게 하고 싶으시면 $pw에 문자를 더 추가한 다음 rand(0,35) 값을 더 늘려 주시면 됩니다.
비밀번호 길이 또한 좀더 보안 하고 싶으시면 for() 문에서 10을 더 올려 주시면 더 복잡한 비번이 되는 것입니다.


[추가팁]

간혹 비번을 암호화 하는 방법에 대해 궁금해 하시는 분들을 위한 팁

1. 회원이 입력한 비번을 저장시 간단하게 적용하는방법
- mysql을 이용한다면 insert 경우 저장할 변수에 password() 함수를 이용해서 넣는다.
예) insert member into (passwd) values (password('비번'));

2. 로그인시 입력한 비번이 맞는지 확인
select * from member where id='아이디' and passwd = password('입력한 비번')
값이 있으면 본인, 아니면 로그인 실패처리

3. 비번 찾기시 임의 비번 발송
select * form member where '기타 회원정보로 본인 확인'
- 값이 있으면 위 임의 조합 비번으로 기존 비번 변경
예) update member set password = password('임의 문자 조합 비번') where '본인';
- 변경된 임의 문자 조합 비번 회원의 이메일로 발송

비밀번호 변경시 임의 문자와 숫자 조합으로 생성후 회원에게 이메일 전송 (비번 암호화 원리 팁)

웹프로그램
회원가입후 비밀번호를 잊은 경우 기존 비번이 암호화 처리 되어 있어(개인정보 보호법에 의해 비밀번호 암호화 의무화) 비번을 임의로 생성후 메일로 발송해야 합니다.
문자 조합을 간단하게 해 버릴 경우 해킹 시도시 비번찾기를 이용해서 이메일로 수신된 비번을 보지 않아서 추측해서 알아 낼 수 가 있습니다.
예로 "aa1234bb" 라는 임시 비번으로 생성해서 회원에게 발송하는데, 항상 숫자 부분만 변동해서 보내 준다면 해커는 역으로 0000~9999까지 조합해서 임의로 접속 시도를 해볼수 있게 됩니다.

간혹 보안 적용이 허술한 사이트의 경우 위와 같이 비번을 발송해주는 곳이 더러 있더군요.
개인정보 유출 사고는 위와 같이 개발자의 부주의가 매우 크다고 보면 됩니다.

문자 조합을 복잡하게 하는게 복잡하지도 않습니다.
아래처럼만 처리 해주셔도 랜덤한 값이 되므로 효과 적입니다.

<?
$pw = "0123456789abcdefghijklmnopqrstuvwxyz";
$temp_pw = "";
for($i=0;$i<10;$i++) {
 $temp_pw .= $ipwd[rand(0,35)];
}
echo $temp_pw;
?>

위와 같이 적용시 10자리의 랜덤한 문자 조함 결과가 나옵니다.
더욱 복잡하게 하고 싶으시면 $pw에 문자를 더 추가한 다음 rand(0,35) 값을 더 늘려 주시면 됩니다.
비밀번호 길이 또한 좀더 보안 하고 싶으시면 for() 문에서 10을 더 올려 주시면 더 복잡한 비번이 되는 것입니다.


[추가팁]

간혹 비번을 암호화 하는 방법에 대해 궁금해 하시는 분들을 위한 팁

1. 회원이 입력한 비번을 저장시 간단하게 적용하는방법
- mysql을 이용한다면 insert 경우 저장할 변수에 password() 함수를 이용해서 넣는다.
예) insert member into (passwd) values (password('비번'));

2. 로그인시 입력한 비번이 맞는지 확인
select * from member where id='아이디' and passwd = password('입력한 비번')
값이 있으면 본인, 아니면 로그인 실패처리

3. 비번 찾기시 임의 비번 발송
select * form member where '기타 회원정보로 본인 확인'
- 값이 있으면 위 임의 조합 비번으로 기존 비번 변경
예) update member set password = password('임의 문자 조합 비번') where '본인';
- 변경된 임의 문자 조합 비번 회원의 이메일로 발송

리눅스 페도라(fedora) 10 버전에서 mysql 5.0.22 버전 설치하기

서버,보안

기본적으로 MySQL을 설치 해본 사용자라는 것을 고려해서 간략하게 기록 해봤습니다.
따라서, 디테일한 설정은 아니므로 OS설치를 한 사용자마다 차이가 날 수 있습니다.
특히, 라이브러리가 OS설치시 제대로 설치되지 않아서 발생하는 오류가 간혹 있을수 있으니 오류가 발생할 경우 당황해 하지 마시구 오류메시지를 검색해보세요! (세이박스에서~)


1. APM 설치하기에 앞서 yum을 이용하여 관련 라이브러리들을 설치
yum -y install gcc cpp gcc+c++ flex libjpeg-devel libpng-devel freetype-devel gd-devel glibc


2. MySQL 5.0.22 다운로드 압축 풀기
wget http://ftp.superuser.co.kr/pub/mysql/mysql-5.0.22.tar.gz
tar xvzf mysql-5.0.22.tar.gz
cd mysql-5.0.22

※ 위 링크 주소가 접속이 안될 경우 세이박스 http://www.saybox.co.kr/bbs/board.php?bo_table=board01&wr_id=191 에 접속하셔서 로그인후 직접 다운로드 받으실 수 있습니다.


3. 환경설정(configure) 및 make install
./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --disable-shared --enable-assembler --with-thread-safe-client --with-mysql-user="mysql" --with-readline --without-debug --without-docs --without-bench --with-charset=euckr
make
make install


4. 설정파일 복사
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf


5. 기본 DB 생성
/usr/local/mysql/bin/mysql_install_db


6. MySQL 운영할 사용자 생성 (홈 디렉토리 생성안할경우 -M 옵션 사용)
useradd -M mysql
passwd mysql


7. configure 시에 지정한 data가 저장될 디렉토리를 mysql 권한으로 변경
chown -R mysql:mysql /usr/local/mysql/data


8. MySQL 및 mysqldump를 사용할 수 있게 심볼릭링크를 걸어준다.
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysqldump /usr/bin


9. mysql 개정으로 MySQL 데몬을 백그라운드로 실행
su mysql
/usr/local/mysql/bin/mysqld_safe &



10. mysql root의 비밀번호를 설정 (초기비번없음:그냥엔터)
/usr/local/mysql/bin/mysqladmin -u root -p password "123456"


11. 데몬 확인 및 DB 접속후 확인
bash-3.2$ ps -ef | grep mysqld
mysql    23023     1  0 20:35 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql    23042 23023  0 20:35 pts/0    00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/gooddayrss.pid --skip-locking --port=3306 --socket=/tmp/mysql.sock

/usr/local/mysql/bin/mysql -u root -p mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
quit


12. 어디서나 MySQL 실행 하도록 환경변수에 경로를 지정

PATH=$PATH:/usr/local/mysql/bin




위 글은 세이박스에서 작성 글이므로 퍼가실 때에는 반드시 출처를 남겨 주세요!

MySQL 설치시 생기는 오류

서버,보안

리눅스에서 MySQL을 설치하기 위해선 리눅스를 설치할때 패키지중에 개발자 도구 패키지를 반드시 설치를 해야한다.
하지만 용량을 줄이기 위해서든지 어떤 이유에서 설치를 하지 않은 경우 아래와 같은 오류가 발생하는데, 겁먹을 필요 없시 오류 뜰때 마다 하나씩 하나씩 필요한 파일을 설치 해주면 됩니다.
특히 yum 으로 설치가 편리하므로 yum 으로 설치하는것으로 설명하겠습니다.


오류1 :
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
해결 :
yum groupinstall 'Development Tools' 'Development Libraries'


오류2 :
checking for termcap functions library... configure: error: No curses/termcap library found
해결 :
yum -y install ncurses-devel

오류3 :
make[2]: *** [mysql.o] 오류 1
make[2]: Leaving directory `/usr/local/mysql-4.0.20/client'
make[1]: *** [all-recursive] 오류 1
make[1]: Leaving directory `/usr/local/mysql-4.0.20'
make: *** [all] 오류 2
해결 : 위와 같은 오류는 설치시 오류 발생으로 인해 소스파일이 깨져서 생기는 증상으로 오류를 발견하면 기존 압축 파일을 다시 풀어서 ./cnfigure 부터 다시 하면 됩니다.

오류4:
모두 설치 했다라고 생각하고 실행하는데 mysqld ended 라는 메시지가 뜨면서 mysqld 데몬이 올라 오지 않는다.
데몬이 안올라 왔으니 당연 mysql -u root -p 로 접속할려고 해도
ERROR 2002 : Can't connect to local mysql server through socket `/var/lib/mysql/mysql.sock' (2)
와 같은 오류만 나타난다.
소스로 설치 한경우라 var/mysql 안에 보니 bin/mysql_install_db 이 명령어로 생성 되어야 할 기본 테이블들이 없는것을 확인 할 수 있다.
그래서 에러 로그를 확인 var/서버명.err 열어보니
090814 15:23:39  Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
이와 같은 오류가 있더군요.
이와 같은 오류는 bin/mysql_install_db 처리 하기전에 테이블이 생성되어야할 var/ 디렉토리 권한문제 였습니다.

우편번호 최신 DB 2009.2.23

데이타베이스
우체국 사업 본부 사이트인 koreapost.go.kr 에서 제공하는 우편번호 파일을 엑셀로 받아서 DB에 저장 할 수 있도록 insert 문으로 벼경 하였습니다.

http://www.koreapost.go.kr/woopuns/domestic_post3_3.jsp?sc_displayflag=true


위 URL로 직접 가셔서 사용하고자 하는 용도에 맞게 이용하시면 됩니다.

제가 만든 쿼리는 제 사이트에 맞게 받은것으로 자신의 사이트에 맞는 필드로 변경해서 이용하시기 바랍니다.

우편번호는 2009년 2월 23일자 현재 최신 자료 입니다. 

MYSQL STOPPING server from pid file /usr/local/mysql/var/서버명.pid

데이타베이스

MYSQL 서비스 시작시 다음과 같은 오류 발생 후 서비스가 시작되지 않는 경우
STOPPING server from pid file /usr/local/mysql/var/서버명.pid

DB Data 폴더에 있는 에러 로그를 확인해보세요!
cat /usr/local/mysql/var/서버명.err
(var OR data)

~~~~ 오류 내용 ~~~~~
090406 09:16:21  mysqld started
InnoDB: No valid checkpoint found.
InnoDB: If this error appears when you are creating an InnoDB database,
InnoDB: the problem may be that during an earlier attempt you managed
InnoDB: to create the InnoDB data files, but log file creation failed.
InnoDB: If that is the case, please refer to
InnoDB: http://dev.mysql.com/doc/mysql/en/Error_creating_InnoDB.html
090406  9:16:22 Can't init databases
090406  9:16:22 Aborting
090406  9:16:22  InnoDB: Warning: shutting down a not properly started  InnoDB: or created database!
090406  9:16:22 /usr/local/mysql/libexec/mysqld: Shutdown Complete
090406 09:16:22  mysqld ended

이와 같은 오류 메시지가 나온다면 저의 경우 로그파일을 모두 제거후 복구 되었습니다.
아마도 로그 파일이 꼬였던것 같네요
로그 파일은 삭제 해도 상관없다고들 하더군요..^^
rm 서버명-bin.001 ...
rm 서버명-bin.index
rm 서버명.pid


참고로, 서버 명에 따라 파일명이 다르게 표시됩니다.
동일한 증상이길 바라며 해결 하시길 바랍니다.
그리고, 간혹 /tmp/mysql.sock 파일 문제로 해당 파일을 제거 후 해결 되기도 한다는 군요
참고하세요!

[mysql] ERROR 1016: Can't open file: '테이블명.MYD'. (errno: 145) 복구

데이타베이스

에러 메세지

Error 1016 : Can't open file: '테이블.MYI'. (errno: 145)


복구 방법

명령어 : mysqlcheck -u계정명 -p --auto-repair -B DB명

Enter password : 비밀번호

 
또는 mysql에 접속후 repair 테이블명; 을 해주셔도 됩니다.

mysql> repair table 테이블명;
+---------------------+--------+----------+----------+
| Table               | Op     | Msg_type | Msg_text |
+---------------------+--------+----------+----------+
| 테이블명           | repair | status      | OK          |
+---------------------+--------+----------+----------+
1 row in set (34.24 sec)

PHP와 MYSQL 데이타 연결과 쿼리 주기

웹프로그램
 
PHP를 이용한 MYSQL 데이타 연결과 쿼리 주기
 * MYSQL과 ORACLE 는 별도 접속함수를 이용
 *  PHP ; server side script-x 서버에서 처리후 크라이언트
              결과 전송
 * 에디터, vi 편집기로 작성후  ***.php (ex, bbs.php)
    서버에 업로드후 실행.
* PHP는 HTML과 병행하여 작성할수 있다.
-----------------------------------------------------------------------------------------
<br>한줄 뛰기
<?php   //php시작
 $name="hban" ;
 echo "일반텍스트문 ";
 echo "<font size=3 color=red>HTML 문  $name </font> ";
 echo "<img src=이미지경로>";
 echo "<table>.....";
?> 
************************************************************************
 MySQL함수 (PHP와 MYSQL연결)
 mysql_connect ("host명","유저명","비밀번호")
* Mysql에 연결한다.
 ex) <?php
 $db=mysql_connect("localhost","korea","0000") or
 die ("접속실패");
 echo "MYSQL에 접속되었습니다.";
 mysql_close($db);
//오라클의 경우(Oracle 사용시 8i, 9i 인지 ID/Pass)
OCILOGON ("localhost","korea","0000") 의 형태이다.
 ?>
*mysql_pconnect :  영구히 데이터베이스접속
   --> 접속이 많은 DB에 효율적이다.
<?php
 $db=mysql_pconnect("localhost","korea","0000") or
 die ("접속실패");
if ($db) {
echo "데이터베이스 접속이 되속되고 있습니다. ";
}
?>
******************************************************************
MYSQL 데이터베이스 선택하기
mysql_select_db ("DB명");
ex)mysql_select_db ("korea");
MYSQL 쿼리(질의)문 전달하기
mysql_query ( "질의문");
ex) mysql_query ("select * from zip ");
*******************************************************************
MYSQL 데이터베이스를 생성
  mysql_create_db()
ex) mysql_create_db ("my_db")
MYSQL 데이터베이스 삭제
  mysql_drop_db()
ex) mysql_drop_db ("my_db")
*********************************************************************
MYSQL질의 결과로 부터 열의 개수를 반환
 mysql_num_rows ( )
ex) <?php
 $db=mysql_connect ("localhost","korea","0000");
 $query="select * from zipcode";
 $result =mysql_db_query("zip", $query, $db);
 $num=mysql_num_fields($result);
 echo "총 $num 개의 컴럼이 있습니다.";
 -----------------------------------------------------------------------
 $db=mysql_connect ("localhost","korea","0000");
 mysql_select_db("zip",$db);
$result=mysql_query("select * from zipcode", $db);
$total_num=mysql_num_rows($result);
echo "총 $total_num 이 검색 결과로 되었습니다.";
?>
-------------------------------------------------------------------------
결과를 필드 이름 혹은 숫자색인으로 배열 반환
 mysql_fetch_array( )
 ex) mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
      $result=mysql_query("select sido,gugun, dong from zip where
       ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
$si="$row[sido]";
역삼동이며  
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
<tr><td> $row[sido]</td>
<td>  $row[gugun] </td>
<td> $row[dong] </td>
</tr></table>
 <br>";
}
    echo " $row[0]  $row[1]  $row[2]";
************************************************************************
MYSQL 작업의 결과로 처리된 행(row)의 개수를 얻는다.
mysql_affected_rows ( )
--> insert, update, delete 질의로 처리된행의 갯수
--> where 절이 있어야 된다.
 ex) $db=mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip,$db");
       $result=mysql_query("delete * from zip where ......", $db);
      $total_num=mysql_affected_rows($result);
     echo "총 $total_num 개의 데이터가 삭제되었습니다.";
   ?>
  만약,where 절이 없다면 mysql_num_rows 를 사용
  
}
   mysql_free_result ($result);
  ?>
 
 
 
 
 
--------------------------------------------------------------------------------
 
 
 
 
 
* 문자열 함수 *
 MYSQL DB 에서 쿼리로 자료를 추출하다.=> $변수
 echo "<html><body><font size=2>Hellow</font>";
 echo "<font size=2> $name </font>";
   홍길동   2004-10-7    전자/유아/도서/      경리-회계-인사
 (1) addslashe($변수)  슬래쉬 문자를 인용한다.
      디비 쿼리와 같이 인용된 부분에 백슬러쉬 붙여 반환
       예) ' , " , \ , NULL
      <?php
      $st="select * from member where id='test'";
      echo addslashes($st);  ==> .... id=\'test\'
      ?>
      stripslashes ($변수)
      백슬러쉬가 있는것을 제거하여 반환한다.
      $ss="/'test/'";
      echo stripslashes($ss);
*************************************************
echo 출력한다.
 = 변수를 포함하여 출력할수 있다.
  
 ex)<?php
      echo "<font size=2>Hellow
       World
       $num 와 $bbs 입니다.</font>";   ?>
  ----------------------------------------------------------
 <html>
 <body>
 <form><input  type="hidden" name="cooki"  vale="123 12">
 <font size="2" color="red">Hellow
       World  <?php echo "$num"; ?> 와
      <?php echo "$bbs"; ?> 입니다.</font>
  ----------------------------------------------------------------
 (2) explode  (매우중요)
       문자열을 주어진 문자열을 기준으로 분리한다.
       문자열을 separator 경계로 나누어 반환
      $pizza = "piece1-piece2-piece3";
      $pieces = explode ("-",$pizza);
      echo $pieces[1];
     예) 새로운 화일 class.conf 를 만들자
           여기에 도서분류카데고리를 만든다.
           $book_class="교양/여성/유아/과학/원서/컴퓨터/건축';
          위의 explode 가 작동할 php 문을 편집한다.
     예) 옵션컬럼 $option='빨강-노랑-은색-검정";
                           $size="200cm/350cm/750cm";    
        
    require "class.conf";   
     ==> 변수, 함수, 페이지를 호출할수 있다.   
     global $book_class, $member, $welcome;
     ==> GLOBAL은 전역변수 선언으로 페이지 루틴 모두 적용
     $book_category = explode ("/",$book_class);
   
      echo "<font> 도서분류 : $book_category[0]<br>";
      echo "<font> 도서분류 : $book_category[1]<br>";   
      echo "<font> 도서분류 : $book_category[2]<br>";
      echo "<font> 도서분류 : $book_category[5]<br>";
      echo "<font size=5 color=red>
      $member 님 안녕하세요 $welcom</font>";
  ***********************************************************
    implode ()
    배열의 내용을 하나로 묶는다.
    (explode와 반대 개념, join과 기능 동일)
   ex) $book = array("과학","여성","컴퓨터");
          $class = implode (" ", $book);
         echo $class;
  ***********************************************************
   nl2br
   뉴라인을 HTML 라인 브레이크(BR)로 변환
  <?php             <br>
  $st = "hellow \n Wlecome to\n PHP world";
  echo nl2br($st);
  /*  PHP주석   */  <!--  HTML주석 -->
  echo "<html><body><!-- 회원비밀정보출력 -->";
  ?>
 ****************************************************************
  strlen ($변수) 문자열의 길이를 반환
  $st = "hellow Linux Mysql";
  echo strlen($st);
  문자열의 길이를 알수 있다.
 
  strstr ($변수, '기준자') => 기준자부터 문자열 반환
  ex) $email = 'korea@samsung.com';
      
         $domain = strstr ($email, '@');
         echo "현재 회원님의 도메인은 $domain 입니다.";
 strrev ($변수)  => 문자열을 역순으로 반환
   $url = 'www.oi.co.kr';
   echo stttev($url);
 
 str_repeat  ("반복할문자", 반복수)
  <?php
    echo str_repeat("--", 20);
   ?>
 substr ("값", 수1, 수2 );
 주어진 문자의 일부분을 반환
 echo substr("abcdef", 1)   ==> bcdef
 echo substr("abcdef", 1,3)   ==> bcd
 echo substr("abcdef", -1)   ==> f
 echo substr("abcdef", -2)   ==> ef
 echo substr("abcdef", -3,1)   ==> d
 ..("나의이상형은전지현입니다",  6,3)  => 전지현
***************************************************
   mysql table 상품 테이블을 등록한다.
   상품코드           
   상품명  CHAR   전지현                             소나타3   
   가격  INT            1000                               2000000
   제조사  CHAR    한국                                 현대
   옵션 CHAR         /미팅/친구/애인/부인       오토/수동/CDP
   마일리지 INT      0                                       2000
   설명 TEXT           국내 최고 여인                2004년 최신형
 ****************************************************
  table에 레코드를 기록
 ******************************************************
  sangpum.php
mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
 $result=mysql_query("select sido,gugun, dong from zip ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
  <tr><td> $row[sido]</td>
  <td>  $row[gugun] </td>
  <td> $row[dong] </td>
  </tr></table>
  <br>";
}
  * HTML <select name=option>
    <option value=nn>nnn</option>  형태이다.
    /친구/부인/애인..옵션을 나누어 아래 스크롤로 만든다.
   if($row["option"]) {
       echo "<select name=option>";
       $sizes = expolde("/",$row["option"]);
       $tot = sizeof($sizes);
       for($i=0;$i<$tot;$i++)
       {
        echo "<option value='$sizes[$i]'>$sizes[$i]</option>";
        }
         echo "</select>";
         }
***********************************************************
*** 이메일 보내기 ****************************************** 
$titles="$title";    
$subject="$title";  //제목
$mail_txt="$name님 안녕하세요 $id 입니다.....";
$admin_mail="nnn@nnn.com";  //보내는이메일주소
$mailto = $mail;
$mailheaders = "Return-Path: $admin_mail\r\n";
$mailheaders = "From: $title<$admin_mail>\r\n";
$mailheaders .= "Content-Type: text/html;charset=euc-kr\r\n";
//mail("보내는사람","제목","본문","메일헤더");
 mail("$admin_mail", "$titles",
            "$mail_txt", "$mailheaders");
 echo " 성공적으로 메일이 발송되었습니다. 감사합니다.";
 echo "<img src= rrrr.gif >";
 
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
***************************************************
   mysql table 상품 테이블을 등록한다.
   상품코드           
   상품명  CHAR   전지현                             소나타3   
   가격  INT            1000                               2000000
   제조사  CHAR    한국                                 현대
   옵션 CHAR         /미팅/친구/애인/부인       오토/수동/CDP
   마일리지 INT      0                                       2000
   설명 TEXT           국내 최고 여인                2004년 최신형
 ****************************************************
  table에 레코드를 기록
 ******************************************************
  sangpum.php
mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
 $result=mysql_query("select sido,gugun, dong from zip ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
  <tr><td> $row[sido]</td>
  <td>  $row[gugun] </td>
  <td> $row[dong] </td>
  </tr></table>
  <br>";
}
  * HTML <select name=option>
    <option value=nn>nnn</option>  형태이다.
    /친구/부인/애인..옵션을 나누어 아래 스크롤로 만든다.
   if($row["option"]) {
       echo "<select name=option>";
       $sizes = expolde("/",$row["option"]);
       $tot = sizeof($sizes);
       for($i=0;$i<$tot;$i++)
       {
        echo "<option value='$sizes[$i]'>$sizes[$i]</option>";
        }
         echo "</select>";
         }
***********************************************************
*** 이메일 보내기 mail.php ******************************************    
global $subject, $email,$color,$message;
$subject="$subject";  //제목
$mail_txt="$message";
$admin_mail="email";  //보내는이메일주소
//$mailto = $mail;
$mailheaders = "Return-Path: $admin_mail\r\n";
$mailheaders = "From: $title<$admin_mail>\r\n";
$mailheaders .= "Content-Type: text/html;charset=euc-kr\r\n";
//mail("보내는사람","제목","본문","메일헤더");
 mail("$admin_mail", "$subject",
            "$mail_txt", "$mailheaders");
 echo " 발송된 메일의 확인입니다..";
 echo "제목: $subject <br>이메일 $email <br> $color,$message";
echo "<img src= rrrr.gif >";

***************************************************
<html><body>
<form action=mail.php method=post>
<input type=text name=subject size=30><br>
<input type=text name=email size=30><br>
<input type=text name=color size=30><br>
<textarea  rows=10  cols=30  name=message></textarea>
 <input type=submit name="[[[[ 확   인 ]]]">
 
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
PHP 의 제어 구조
(1) if-else 구문 (가장 많이 쓰이는 구문)
    ex) if (조건) { 조건에 따른 처리; }
          if ( $point > 90 ) { echo " 잘했습니다."; }
   ex) if (조건) { 조건에 다른 처리; }
         elseif (조건) { 조건에 따른 처리; }
         else { 조건에 따른 처리; }
     <?php
     $oracle=85;
     $linux=75;
     $jumsu = ($oracle+$linux)/2;
     if ($jumsu >= 90)  {
        echo "<table>...전지현";
     }
     elseif ($jumsu >=80 && $jumsu <90 )
      {
       echo "<img src=essay.gif>";
      }
     else {  echo "book3.gif";  }   ?>
 **********************************************
  while (조건)  { ~~동안 조건에 따른 처리 }
    ( = while (조건): 조건에 따른처리; endwhile; )
  <?php
  $a=1;
  while ($a <=10) {
  echo "<font size=5 color=red>$a</font><br>";
  $a++;   (1씩 증가하여 반환한다)
  }
 ***************************************************
  do while 구문
  do {  조건에 따른 처리 }
  while (조건);
 ****************************************************
 for (초기값; 끝나는조건; 반복처리)
  { 조건에 따른 처리 }
 echo "<table width=500 border=1>";
 for ($a=1; $a <=10; $a++)
        { echo "
     <tr><td bgcolor=yellow>
     <font size=3 color=red> $a 번 자료 입니다. </font>
     </td></tr>";
  }
 echo "</table>";
**********************************************************
 foreach (배열변수 as 로컬변수) { 처리구문 }
   ex) <?php
    $odd_num = array (1,3,5,7,9);
    foreach ($odd_num as $value) {
    echo "$value 입니다.<br>";
    } ?>
**********************************************************
 break, continue 구문
 break ==> for, while, switch 에서 해당 구문 빠져 나감
 continue ==> for, while 에서 현재 루프의 처음으로 돌아감
 <?php
 for ($a=1; $a<=10; $a++) {
 $value=$a;
 if ($value >30) { echo "$value";  
      break;
 }
***********************************************************
   require (파일명) - 지정파일의 함수,변수사용 (config..)
   include(파일명) - 지정파일의 읽기 실행
************************************************************
 함수(function) :
 특정 기능을 모아서 필요할때마다 불러서 사용
 중복된 기능을 피하고 동일 기능을 여러번 수행시 필요
****함수 설정하는법 ***********
 function  함수명($변수) {
  수행할 구문 
  return;   }
*****함수를 호출하여 이용하는 방법********
 함수명($변수);
*************************************************************
ex) <?php
 functin test($value) {
 echo "$value";
  return; }        test(1234); ?>
 
 function  squre($num) {
 return; }
 echo square(10); 
 function 
*********************************************
함수를 이용하여 구구단을 2단부터 9단까지 출력하는
프로그램을 만들어 보자.
(각 단 하나의 테이블로 출력하게하자)
.
*************************************************
<?php
echo "[구구단 출력 프로그램]<br>";
// 2부터 9까지 함수를 반복 호출
for ($i=2; $i<=9; $i++)
{
 show_gugudan($i);
}
 
// 숫자를 넘겨받아서 구구단을 출력
function show_gugudan($num)
{
echo "<table border=1 width=120>\n";
echo "<tr><th>$num 단</th></tr>\n";
 
for ($i=1; $i<=9; $i++)
{
echo "<tr><td align=center>$num X $i = ";
echo $num * $i;
echo "</td></tr>\n";
}
return;
}
?>
*******************************************************
변수의 사용 범위
전역변수(Global) 프로그램전체에서 사용 가능
  global $변수,$변수;
지역변수(Local) 선언된 지역(함수)에서만 사용 가능
정적 변수(static) 함수가 종료되어도 유지 사용 가능
$변수=숫자;
    -> 숫자등 정수인경우 " " 불필요
$변수="문자열";  
   -> 문자열 또한 변수 입력 $nnn등 문자열 인경우 ' " 로 처리한다.
**********************************************************
<?php
$message="구매를 합니다.";
golbal $message,$nnnn,$kkkk;

function test() {
global $message;
echo "귀하의 전달 사항은 $message 입니다.";
}
test();
?>
***********************************************************
1. FROM 변수
 폼값 ---> 서버 --->  크라이언트
 <HTML>의 형태로 만들어져 서버에 전달된다.
 FORM은 프로그램언어의 처음과 끝이다.==>폼생폼사
<HTML>
<form action="웹경로" method="get 혹은 post">
웹경로 : form value(폼값)을 받는 cgi,php,jsp경로
method
(1) get : 브라우져상단에 폼값 인수가 전달
   ex) action=mail.php
     전달방법 :..mail.php?id=korea&code=333&name=ho
 (2) post : 데이터가 표준입력 방식으로 전달
                  외부에 보이지 않는다.
-----------------------------------------------------------------
DATA를 보내는 방법---> server
한줄로 입력칸이 출력
<input type="text" name="korea" size="10"
  maxlenght="20">
name=korea 서버에 전달시 변수명(name)
size= 입력칸의 크기
maxlenght = 입력칸의 최대입력수제한
----------------------------------------------------------------
<input type=password name=ppp...>
비밀번호 입력으로 입력값이 보이지 않는다.->******
<input type=hidden name=cooki value=04010>
<input type=hidden name=id value=골뱅이>
출력되지 않지만 전달될 폼의 값
-----------------------------------------------------------------
<input type=checkbox name=취미 value=독서  checked>
<input type=checkbox name=취미 value=운전>
=>여러개의중에 다수 선택 가능
<input type=radio name=성별 value=남자>
=>한개만 선택
</form>
******************************************************
<select name=option>
<option value=노랑 checked>노랑색 우산</option>
<option value=빨강>빨강색 중간 우산</option>
<option value=파랑>파랑색 큰 우산</option>
</select>
********************************************************
내용이 긴 문장을 쓰는 입력칸
<textarea name=변수명 rows=행의길이   cols=열의길이
  wrap=virtual or physical or off>
</textarea>
wrap=virtual  화면에 맞게 자동 줄바꿈, 전송시는 입력대로 전송
wrap=physical 화면에 자동 줄바꿈 및 전송시에도 줄바꿈
wrap=off 기본적으로 자동 줄바꿈 하지 않는다.
 
*********************************************************
입력한 내용을 전달하는 버튼을 만들기
*이 버튼 위에 </form>이 있으면 전달 불능
<input type=submit  name=보내기 value="[[[[보내기]]]]">
</form>
**********************************************************
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
php.ini -> register_global=On -> apachectl restart
 (웹상에서 POST,GET 받게함)  

 <?php
   echo "$name";
모든 전송 변수를 반는것을 선언
      extract($_GET); extract($_POST);
      echo "$name<br>";
      echo "$id"
    
전송된 변수를 받을수 있도록 설정(개별)
       echo "$_GET[name]";
       echo "$_POST[name]";
******************************************************************
MYSQL에 데이타 입력하기
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$query= "insert into goods(id,name,number)
             values(''id,'$name','$number")";
mysql_query($query);
****************************************************
데이타 출력하기
member.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$result=mysql_query("select id,name, address from zip ");
$gesu=mysql_num_rows($result);
echo "총 검색된 회원수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "
<form action=mem_modify.php method=get>
<table width=600 border=1  bgcolor=#fofofo>
<input type=hidden name=act value=modify>
  <tr><td>아이디: <input type=text name=id value='$row[id]'></td>
  <td> <input type=text name=id value='row[name]'> </td>
  <td> $row[address] </td>
********************************************************
   checkbox  나 select 박스의 처리는
if ($habby == 도박) {  $check1="checked"; $check2=""; }
elseif ($habby == 독서 ) {$check1=""; $check2="checked";}
echo "<input type=checkbox name=도박 $check1>
           <input type=checkbox name=독서  $check2>";}
수정된 정보는 업데이트 쿼리를 이용한다.
mysql_query("update member  set  id='newid',address='주소' 
             where  name='홍길동';
************************************************************
<input type=submit name=kkk value="확실히보냅니다.">
  </tr></table>
  <br>";   }
*************************************************************
*******************************************************************
폼값을 넘기는 버튼에 대해
-- 확인버튼
(이미지버튼)
<input type=image src=aaa.gif></form>
(기본 버튼)
<input type=submit  value="[[[ 확인 ]]]" name=aaa >
-- 뒤로 가는 버튼
 <a href=JavaScript-x:clickOn=history.go(-1)><img src=back.gif></a>
--웹 링크 설정
 <a href=경로>버튼</a>
--메타 리다이렉션 자동 이동하기
<meta http-equiv='Refresh' content='0; URL=index.php'>
 
 
 
-----------------------------------------------------------------------------------
 
 
 
 
 
php.ini -> register_global=On -> apachectl restart
 (웹상에서 POST,GET 받게함)  

 <?php
   echo "$name";
모든 전송 변수를 반는것을 선언
      extract($_GET); extract($_POST);
      echo "$name<br>";
      echo "$id"
    
전송된 변수를 받을수 있도록 설정(개별)
       echo "$_GET[name]";
       echo "$_POST[name]";
******************************************************************
MYSQL에 데이타 입력하기
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$query= "insert into goods(id,name,number)
             values(''id,'$name','$number")";
mysql_query($query);
****************************************************
데이타 출력하기
member.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$result=mysql_query("select id,name, address from zip ");
$gesu=mysql_num_rows($result);
echo "총 검색된 회원수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "
<form action=mem_modify.php method=get>
<table width=600 border=1  bgcolor=#fofofo>
<input type=hidden name=act value=modify>
  <tr><td>아이디: <input type=text name=id value='$row[id]'></td>
  <td> <input type=text name=id value='row[name]'> </td>
  <td> $row[address] </td>
********************************************************
   checkbox  나 select 박스의 처리는
if ($habby == 도박) {  $check1="checked"; $check2=""; }
elseif ($habby == 독서 ) {$check1=""; $check2="checked";}
echo "<input type=checkbox name=도박 $check1>
           <input type=checkbox name=독서  $check2>";}
수정된 정보는 업데이트 쿼리를 이용한다.
mysql_query("update member  set  id='newid',address='주소' 
             where  name='홍길동';
************************************************************
<input type=submit name=kkk value="확실히보냅니다.">
  </tr></table>
  <br>";   }
*************************************************************
*******************************************************************
폼값을 넘기는 버튼에 대해
-- 확인버튼
(이미지버튼)
<input type=image src=aaa.gif></form>
(기본 버튼)
<input type=submit  value="[[[ 확인 ]]]" name=aaa >
-- 뒤로 가는 버튼
 <a href=JavaScript-x:clickOn=history.go(-1)><img src=back.gif></a>
--웹 링크 설정
 <a href=경로>버튼</a>
--메타 리다이렉션 자동 이동하기
<meta http-equiv='Refresh' content='0; URL=index.php'>
**************************************************
  04.10.12
  PHP 파일 조작 함수 및 FILE UPLOAD 처리
  (FORM 을 이용한 mysql 연동 처리)
  PHP를 이용한 방명록 만들기
(1)파일 함수
   fopen("경로명","속성")
   : 파일이나 URL를 연다.
   r :읽기전용 r+ :읽기쓰기 
   w: 쓰기전용(없으면새파일생성)
   W+ : 읽기쓰기가능(없으면새파일생성)
   a : 쓰기전용 (파일포인터맨끝,없으면 만듬), a+
-----------------------------------------
  <?php
  fopen("http://www.naver.com/","r");
  fopen("/home/text.txt", "w+");
  ?>
------------------------------------------
 <?php
  $file=fopen("http://www.yahoo.co.kr/","r");
  if (!$file) {
   echo "존재하지 않는 파일이거나 경로입니다.";
   exit;
  }
  while (!feof($file))
  {  $line = fgets($file,1024);
     echo $line;
   
   }
 fclose($file)  ?>
 
 fclose ($열린파일) :열려있는 파일 포인터를 닫는다.
 fgets (파일명,길이) :파일로 부터 하나의 줄 읽어옴
   ex) $buffer=fgets($file,4096);
        echo $buffer;
       --> $file의 파일에서 4096바이트씩 출력
 fgetc() : 파일로 부터 하나의 문자를 읽어 온다.
 ex) $fp = fopen("user.txt","r");
      while ($chr = fgetc($fp))
      {   echo $chr;  }
      fclose($fp);   
 ------------------------------------------
  fputs(파일명,길이); 파일포인터에 문자열 저장
  file () 파일 전체를 읽어서 배열로 반환
ex)
<?php
$fcontent=file('http://www.naver.com/');
    //배열로 웹 페이지를 가져오고 저장
while (list($line_num,$line)=each($fcontents))
   //each는 각각배열을 가져오고 list는배열변수로 할당
{
 echo "줄수: $line_num"
        .htmlspecialchars($line). "</br>"; }
?>  //특수문자를HTML로전환htmlspecialchars()
********************************************
 file_exists 파일이 있는지 확인
 if (file_exists("img1001.jpg"))
 { echo "<font size=3>화일이 존재합니다. 크기는</font>"
    .filesize("img1001.jpg");
    }
-------------------------------------------
 filesize () 파일의 사이즈를 구한다.
  $size=filesize($img);
   if ($size > 10000 ) { echo "용량초과화일";}
********************************************
  chmod ("php.htm", 0755);
  화일의 권한을 변경한다.
   <?php chmod("php.htm",0755); ?>
  copy(화일명,경로) :  파일을 복사한다.
  <?php copy("php.htm","/home/img/");
    echo "파일복사가 성공적으로 완료되었습니다."; ?>
  unlink(파일명); 파일을 삭제한다.
  <?php
   $file="php.htm";
   if (file_exists($file)) {
   if (unlink($file))
    {  echo "$file 이 삭제되었습니다."; }
   else { echo "파일 삭제하지 못했습니다."; }
   }
   else { echo "$file 이 존재하지 않습니다."; }
   ?>  
  exec(chmod 707 ./picture) ;
-------------------------------------------
  mkdir 경로를 만든다.
  mkdir("/tmp/dir", 0700)
  rmdir 경로를 삭제한다.
  rename(oldname, newname)
         파일 이름을 변경한다.
*******************************************
 기타함수
 mail 함수
 ex) mail("info@naver.com", "제목입니다.",
      "본문내용입니다.", "$header");
     
     *MAIL헤더는 상단에 정의하여 준다.
  $header .="X-mailer:l/n";
  $header .="content-type:text/html...";
-----------------------------------------
  sleep 지정한 시간만큼 실행을 지연
  <?php
   echo "5초후 실행됩니다.";
   flush();  //버퍼를 비운다
   sleep(5);
   echo "모든 처리가 완료되어습니다";
   ?>
  system() 명령어 실행및 출력
   <?php echo system('ls');
     exec('chmod 707 php.htm'); ?>
   * 보안상 문제가 유발될수 있다.
*****************************************
  * 문자열 암호화하기 (%와 16진수 코드,공백은 +)
    (웹에서 노출을 피하려는 문자에 이용
     ex) GET 방식 혹은 정보등)
 
   urlencode($문자변수) : 문자열이 알파벳이아닌
     문자를 인코딩(encoding)한다.
   <?php
   $myurl = "id=korea&name=홍길동";
   echo urlencode($myurl);
   echo urldecode($myurl);
   $origin='urldecode($myurl)';
    echo "<font size=5>현재 번역된 값은 $origin 입니다.";
   ?> 
  
  urldecode($문자변수) : 인코딩값을 원래문자로 변환
*************************************************************
   parse_url :
   URL를 파싱해서 각 항목을 연상 배열로 반환
   sheme, host, port,user,pass,path,query
   <?php
   $url=
parse_url(
'http://dnshop.net/gg/Category?CID=D5191');
//위의 줄은 한줄로 입력한다.
  echo "scheme : $url[scheme]<br>";
  echo "host : $url[host]<br>";
  echo "path : $url[path]<br>";
  echo "query : $url[query]<br>";
?>
***************************************************************
 
 
---------------------------------------------------------------------------------
 
 
 
 
 
*gb_write.php  ->쓴글의 변수를 받아서 DB연동및 처리
<?php
extract($_GET); extract($_POST);
//함수정의
function popup_msg($msg) {
 echo("<script-x language=\"javascript-x\">
                    <!--
                            alert('$msg');
                               history.back();
                                  //-->
                          </script-x>");
}  //함수정의끝
if (!$gb_name) { echo popup_msg('이름를 기입하세요'); }
if (!$gb_email) { echo popup_msg('e-mail 기입하세요'); }
//////////////////////////////////데이터베이스접속함수
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
mysql_query("insert into guestbook
(gb_date,gb_ip,gb_name,gb_email,gb_location,bg_url, gb_note)
value( sysdate(),'$REMOTE_ADDR','$gb_name','$bg_location',
         '$gb_url','$gb_note')";
/////////////////////////////////////////////////////////
//// 등록후 결과 알려주기
echo "<table width=500><tr><td>
        <font size=5>등록이 완료되었습니다. 당신의 IP는 $REMOTE_ADDR</font>
        </td></tr>
         <tr><td><a href=gb_list.php>
        <font size=5>[목록 리스트] 돌아가기</font></a>
        </td></tr>
       </table>";
echo "<meta http-equiv='Refresh' content='0; URL=gb_list.php'>";
     ?>
*********************************************************************************
gb_list.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("guestbook");
$result=mysql_query("select * from guestbook");
$gesu=mysql_num_rows($result);
echo "총 검색된 방문록는 $gesu 입니다.<br>";
while ($row=mysql_fetch_array($result))
  {
echo "<table width=600 border=1 bgcolor=yellow>
<tr><td>이름</td><td> $row[gb_name] 이메일; $row[gb_email] </td></tr>
<tr><td>날짜</td><td> $row[gb_date] $row[gb_ip] </td></tr>
<tr><td>주소</td><td> $row[gb_location] </td></tr>
<tr><td>홈페이지</td><td> $row[gb_url]
<a href=delete.php?idx=gb_index> [삭제] </a> </td></tr>
<tr><td>한마디</td><td> $row[gb_note] </td></tr>
</table>  ";
}
echo "<a href=gb_write_form.php>[글쓰기]</a> | [삭제] | [목록] ";
?>
**************************************************************************
delete.php
global $idx;
echo "<center><table width=600 bgcolor=fofofo>
      <tr><td align=center>
      <form action=delete_process.php method=post>
      <input type=hidden name=idx value=$idx>
      관리자 ID  <input type=text name=admin_id><br>
      비밀번호  <input type=password name=admin_pass>
     </td></tr></table></center>";
****************************************************************************
delete_process.php
global $idx, $admin_id, $admin_pass;
//관리자비밀번호설정
$admin="korea';
$passwd="0000";
//비밀번호 및 아이디 비교하기
if ( $admin_id == $admin && $admin_pass == $passwd )
{ 쿼리문으로 삭제 실행 ;
echo "<meta http-equiv='Refresh' content='0; URL=gb_list.php'>";
}
else { echo "<font size=4 color=red> 관리자만 삭제할수 있습니다.!!
      </font>";
echo "<a href=JavaScript-x:clickOn=history.go(-1)>뒤로 가기</a> <br>
        <meta http-equiv='Refresh' content='2; URL=gb_list.php'>";
}
 
 
--------------------------------------------------------------------------------
 
 
 
 
 
2004.10.13
이론) PHP 시간함수, 비교연산자 알기
실습) PHP를 이용한 설문조사
******************************************************************
touch date.php
date(형식);  => 주어진 포멧의 날자 표시
 Y : 년도 1999  y  : 2자리년도 99
 A : AM or PM  a : am or pm
 d : 2자리 숫자 날짜 (01-31)
 g : 12시간(1-12) G :24 시간(0-23)
 i : 분 (00-59) 
 m : 월 (01-12)
 s 초 : 2자리 (00-59)
 T : 시스템의 타임존
 w : 요일숫자 (0 -sun~6-sat)
$yoil=date(w);
if ($yoil=0) { $yo=일;}
  회원님 입찰은  년  월  일 (요일) 시  분 초 입니다.
 오늘은  **8월 8일 8일 (금요일)
ex) echo date();
     echo date("Y : m : d");
     $date=date();
*********************************************************
getdate() 날짜/시간 정보를 연상배열 반환
<?php
$today=getdate();
second : 초  minutes : 분
hours : 시     mday :날짜
wday :요일   mon 월(숫자)
year : 년   weekday :요일(문자)
-----------------------------------------
$month=$today['mon'];
$mday=$today['mday'];
$year=$today['year'];
echo "회원님 가입일은 $month $mday $year 입니다";
-------------------------------------------
time () : UNIX의 기준시간부터 지금까지 시간을
            초단위로 반환(Jan 1 1970 00:00:00)
ex) $time=time();
      echo "현재시간 $time";
*****************************************************************
 환경변수
 : PHP는 실행시 미리 정의된 변수를 제공한다.
  버젼에 따라 다르지만 기본적인 변수가 있다.
  (apache와 PHP 환경변수)
  <?php
  phpinfo();
  ?>
  HTTP_USER_AGENT :사용자의 브라우져 정보
   ex) echo "$HTTP_USER_AGENT";
  REMOTE_ADDR : 사용자 IP
  SERVER_ADDR : 서버의 주소
  SERVER_PORT : 웹서버에 접속하는 포트번호
  SCRIPT-x_FILENAME : 현재 실행된 스크립 절대 경로
  SERVER_SOFTWARE : 서버에 설치된 웹 서버명과 모듈
********************************************************************
 예) 회원님은 현재 _________에 시간에 접속하였고
     사용하신 브라우져는 ________이고
    ______________IP에서 접속하였고, 우리 서버의 __포트
    로 접속하였습니다. 본사 서버는 ________입니다.
 
 
 
-----------------------------------------------------------------------------------
 
 
 
 
 
<?php
extract($_GET); extract($_POST);
//userfile 넘어오면서 파일명은 _name를 붙여 생성한다.
echo "$userfile_name";
copy ("$userfile","/upload/$userfile_name");
?>
---------------------------------------------------------------------------  
$file_name = substr( strrchr($userfile_name,"."),1);
$filea_name = substr( strrchr($userfilea_name,"."),1);
if ($file_name!="gif" && $file_name!="jpg" &&
   $file_name != "asf")
  { error('자기사진 확장자는 gif, jpg, asf 이어야함');}
  if ($filea_name!="gif" && $filea_name!="jpg")
 { error('앨범그림의 확장자는 gif 또는 jpg 이어야함');}
$img_file = "$id"."."."$file_name";
$simg_file = "s-"."$id"."."."$filea_name";
copy($userfile, "/upload/$img_file");
       unlink($userfile);
copy($userfilea, "/upload/$simg_file");
       unlink($userfilea);
논리연산자
----------------------------------------------------
a and b   a와 b가 모두 참
a or b   a 와 b 중 하나가 참인경우
! a   a 가 참이 아니면
a && b   a 와 b 가 모두 참
a || b  a 와 b중 하나가 참일때
ex) if ($a && $b)  {  실행 }
     => a 와 b 의 값이 모두 있다면...
      if ($a > 10 && $b < 20 )
      if ($a || $b ) {실행}
     => a 와 b 의 값이 하나라도 있다면...
      if (!$a) { }
     => a의 값이 없다면...
--------------------------------------------------
비교연산자
a == b    a 와 b 가 같다면
a != b    a와 b가 같지 않다면
a < b , a > b , a <= b, a >=b
--------------------------------------------------
if ( $ a == $price ) { 실행 }
 ==> a 의 값이 price 와 같다면
if ( $a != $price ) {실행}
 ==> a 의 값이 price 와 같지 않다면
--------------------------------------------------
<?php
$sonnim=20000;
if ( $sonnim == $bonus )
 { echo "<font size=3 color=red>손님은 보너스해당자입니다.
    </font>"; }
else { echo "아직 보너스에 해당되지 않습니다."; }
?>
<?php
echo "<table width=500 border=1>";
for ( $a=1; $a <=20; $a++ )  {
  skin1.php   skin2.php
gb_list.php
 
if ($hit >100 ) { $icon="hot.gif";
 if ( $a%2 == 0 ) { $color="fofofo";  $icon="crown.gif";}
 else { $color="white";  $icon="gift.gif"; }
echo "<tr><td  gbcolor=$color><img src=/img/$icon>  </td></tr>";
 }
echo "</table>";
?>
********************************************************
$a=12;
$b=6.7;
$tot=$a + $b;
$tot=$a - $b;
$tot=$a * $b;
$tot=$a / $b;
$tot=$a % $b;
echo "$tot";
************************************************************
ARRAY (배열)
$data = array ( "사원"=>"홍길동",
"대리"=>"박진영", "과장"=>"춘삼이",
"대표"=>"코코넛" );
while ( list($jikgub,$name) = each($date) )
{
 echo $jikgub ."님은" .$name ."입니다.<br>";
}
?>
------------------------------------------------------------------
SWITCH 구문
$price=200;
switch ($price) {
 case (100) :
echo "옥션에서 입찰은 불가능합니다. ";
 break;
 case (200) :
echo "입찰 가능한 금액입니다.";
 break;
 case (300) :
echo "금액이 높은 입찰은 매우 환영 반갑습니다.";
 break;
default;  echo "옥션에 참여하고 있습니다.";
}
____________________________________
require "error.php";
if (!$name) { error("name");  exit;}
if (!$name) { error("id");  exit;}
if (!$name) { error("password");  exit;}
PHP출력및 디비 연동 프로그램 페이지
____________________________________
<?php
function popup_msg($msg) {
   echo("<script-x language=\"javascript-x\">
   <!--
   alert('$msg');
   history.back();
   //-->
   </script-x>");
}
********************************************************
function error($errcode) {
   switch ($errcode) {
      case ("name") :
         popup_msg("이름을 입력하세요.");
         break;
      case ("id") :
         popup_msg("아이디를 입력하세요.");
         break;
      case ("password") :
         popup_msg("비번을 입력하세요");
         break;
  default ;
}
 
---------------------------------------------------------------------------------
 
 
 
 
[[[[[ 에러출력페이지 만들기 ]]]]]
____________________________________
require "error.php";
if (!$name) { error("name");  exit;}
if (!$id) { error("id");  exit;}
if (!$password) { error("password");  exit;}
*위의 $변수들은 정규 패턴을 검사하면 좋다.
PHP출력및 디비 연동 프로그램 페이지
____________________________________
error.php 의 핵심 스크립
<?php
function popup_msg($msg) {
   echo("<script-x language=\"javascript-x\">
   <!--+
   alert('$msg');
   history.back();
   //-->
   </script-x>");
}
********************************************************
function error($errcode) {
   switch ($errcode) {
      case ("name") :
         popup_msg("이름을 입력하세요.");
         break;
      case ("id") :
         popup_msg("아이디를 입력하세요.");
         break;
      case ("password") :
         popup_msg("비번을 입력하세요");
         break;
  default ;
}
<?php
//공용 라이브러리에서 설정한다. (ex, lib.php)
$dburl = "localhost";  //db URL
$dbuser = "korea";  //DB 사용자 ID
$dbpasswd = "0000";  //비밀번호
$dbname = "korea";  //DB이름
$dbconn = mysql_connect("$dburl","$dbuser","$dbpasswd");
  mysql_select_db("$dbname",$dbconn);
---------------------------------------------------------------
   book.php
ex) require "lib.php";
      global $dbconn;
       $dbresult = mysql_query
               ("select * from member where id='$id' ",$dbconn);
        $row=mysql_fetch_array($dbresult);
        각 변수로 받아옴 ex) $row[name];
       echo "$row[name]";
       $dbresult = mysql_query
               ("select * from order where oid='$oid' ",$dbconn);
        $row2=mysql_fetch_array($dbresult);
        echo "$row2[name];
------------------------------------------------------------------
전송된 폼 값을 받아 화일을 작성하는 핵심PHP 코드
lib.php를 만드는 admin_processing.php
----------------------------------------------------------
<?
global $ntitle,$url,$dbname;
//기존화일을 연다
$fp = fopen("/lib/lib.php","w");
fwrite($fp," <?php
\$title = \"$ntitle\"; //사이트 이름
.....
");
fclose($fp);
<name type="text" name="title" value="<?php echo "$title"; ?> ">
 
 $url="http://211.254.138.191/gb/gb_write_form.php";
           $title="????????????";
           $id="root";
           $passwd="rlagmlwns";
           $listwidth="600";
           $bgcolor="green";
           $listbg="gray";
           $imgwidth="400";
           $dbname="guestbook_hj";
           $dbuser="root";
           $usedb="guestbook_hj";

 echo "
<script-x language = javascript-x>
        function imgopen(){
        winstate =
window.open('large_view.php?image=$row[id]','image','width=600,height=500,resizable=yes,scrollbars=yes');
        }
</script-x>";
 <a href=javascript-x:imgopen()><img src=ala.gif border=0></a>

<\>
 

mysql 데몬 종료

데이타베이스
# pkill -9 mysql
# mysqladmin -uroot -p shutdown
# /usr/local/mysql/share/mysql/mysql.server stop (start || restart)
# killall mysqld

mysql  프로세서 죽이기 다양하지만 어떤게 좋은건지는 잘 모르겠다. 하지만 확실하게 프로세서를 죽이는건 역시  killall 이 빠르게 프로세스를 내려준다. ^^;

ERROR 1016: Can''t open file: ''테이블명.MYD''. (errno: 145) - 복구하기

데이타베이스
[MySQL 테이블 오류]
ERROR 1016: Can't open file: '테이블이름.MYI'. (errno: 145)
 
(복구하기)
# 테이블명.MYI 파일이 있는곳에서 실행해야한다.(ex : 테이블명 - test)
# DB명 : testtest
# Table명 : test
ex)
1. 에러난 파일 : 테이블명.MYI
2. 아래 명령어 실행위치는 /usr/local/mysql/data/testtest(오류난 테이블 DB명)
3. 명령어 실행
[root@localhost root]# /usr/local/mysql/bin/myisamchk -r 테이블명.*
myisamchk: error: '테이블명.frm' is not a MyISAM-table
---------
myisamchk: error: '테이블명.MYD' is not a MyISAM-table
---------
- recovering (with sort) MyISAM-table '테이블명.MYI'
Data records: 7
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5
- Fixing index 6

mysql 로그 지우기

데이타베이스

mysql datadir 로 지정되어있는 폴더를 정확히 확인하신 후 아래와 같이 하시기 바랍니다.

 datadir 이 /usr/local/mysql/var 일 경우 예입니다.

 /usr/local/mysql/share/mysql.server stop

 /usr/local/mysql/var/ 디렉토리에 bin-log 파일을 삭제하시면 되는데 형식은
 아래와 같습니다.

 -bin 패턴이 불어있는 파일을 rm 으로 삭제하시기 바랍니다.
 
 rm -f *-bin*

 /usr/local/mysql/share/mysql.server start

위에 있는 글중에서

/usr/local/mysql/share/mysql.server stop
부분과
/usr/local/mysql/share/mysql.server start
부분에 있는 명령어들은 설정에 따라 틀릴 것이다.
무조건 따라 하다간 서버가 남아 나질 않을 것이니 자신의 서버에 맞게 명령어를 내리자
그리고
rm -f *-bin*
부분에서 *-bin*은 문제가 있는명령어이다
보통 도메인-bin.00001같이 되어 있는것을 저렇게 지울수도 있지만
현재 사용중인 도메인-bin.index 파일도 삭제 될수 있기 때문에
들어가서 하나하나 삭제 하는것이 낳을 것이다.
 
잠깐!! 문제가 발생 하였다.
현재 *-bin* 파일의 index 파일의 안을 vi 롭 보면 지워야할 파일이름이 있을 것이다.
이와 같은 경우 index 파일의 안의 이름을 지워줘야 정상적으로 mysql이 작동 될것이다.

mysql로그 보기

데이타베이스

usr/local/mysql/bin/mysqlbinlog -uroot -pxxxx -r host명-bin.001 > test.txt

mysql 로그 삭제 (호스트명-bin.001 )

데이타베이스
*-bin.* 은 mysql 의 replication 기능을 사용하기 위한 binary file 입니다.

즉 replication 기능을 사용하지 않으시다면 삭제해도 상관없습니다.

만약 이 로그들을 생성시키지 않고 싶으시다면 /etc/my.cnf 에 보시면

-----------------------------------------------------------------
# Start logging
log-bin
server-id      = 1
-----------------------------------------------------------------

라는 설정이 있을 겁니다. 이 2줄을 모두 주석 처리 해 주시고 mysql 을 재시작 하시면 됩니다.

3.23 에서 새로 생긴 기능이죠.


MySQL Replication :
http://www.oops.org/?t=lecture&sb=mysql&n=1

MySQL 로그 파일 관리 - mysql rotate를 이용하여 쿼리 로그 확인

데이타베이스
=======================================================
   MySQL 로그 파일 관리
=======================================================

Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.
1. 에러로그
2. 일반적인 로그
3. UPDATE 로그
첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입
니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를
실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로
저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생
성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.
이 로그 파일은 Mysql 실행시 --log 옵션을 주어 활성화 시키면 된다.
# /usr/local/mysql/bin/safe_mysqld --log &
업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성
화 되지 않고 Mysql 실행시 --log-update 옵션으로 가능하다.
# /usr/local/mysql/bin/safe_mysql --log-update &
업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시
실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다
뒤의 번호가 1씩 증가 한다. 혹은 --log-update=mysql.log 와 같이 로그파일명을
정해줄수도 있다.  Update 로그는 update 쿼리만 저장하거 같지만 ..
delete , create 등의 쿼리도 모두 저장한다.
mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에
문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.
로그 파일을 관리하는 방법으로는 두가지가 있다.
먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과
간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.
/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..
--log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.
# vi /usr/local/mysql/share/mysql/mysql-log-rotate
-------------------------------------------------------------------------
----
# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
/usr/local/mysql/var/mysqld.log {
        # create 600 mysql mysql
        notifempty
    daily
        rotate 3
        missingok
        compress
    postrotate
    # just if mysqld is really running
    if test -n "`ps acx|grep mysqld`"; then
            /usr/local/mysql/bin/mysqladmin flush-logs
    fi
    endscript-x
}
-------------------------------------------------------------------------
--
위의 파일을 /etc/logrotate.d 디렉토리에 복사만 하면 알아서 로테이트 하게 된다.
단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈디렉토리에
.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한
다.
vi /root/.my.cnf
--------------------------------------
[mysqladmin]
password = xxxxxxxxx
user = root
--------------------------------------
정상적인 로그 교체의 확인은 다음과 같이 하면 된다.
# logrotate -f /etc/logrotate.d/mysql-log-rotate

이밖에 --log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로
번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.
이는 각자 머리를 잘 짜면 될거 같다.
#!/bin/sh
find /usr/local/mysql/var -name "*.[0-9]*" -type f -mtime +3 -exec rm -f {} \;
/usr/local/mysql/bin/mysqladmin flush-logs
위와 같은 만들면 된다. 이는 "3일 지난 파일은 지워라" 로 cron 에 등록한뒤 적절한
시간마다 실행해주면 된다.

MYSQL 동시접속자 등 높을경우

데이타베이스
/usr/local/mysql/bin/mysqld_safe -O max_connections=3000 -O table_cache=512 -O wait_timeout=300 &

MYSQL DB에서 램덤으로 값 받기

데이타베이스
SELECT * FROM 테이블명 ORDER BY rand() LIMIT 1
 
위 쿼리는 램덤으로 1건 받아 옵니다

2건 이상 중복되는 회수 구하기 쿼리 예

데이타베이스
SELECT * FROM 테이블명 group by 컬럼명 having count(컬럼명) > 1

MySQL 튜닝 18 가지

데이타베이스

HEAP 테이블이 가장 빠르다

일반적으로 가장 많이 쓰이는 테이블 타입은 MyISAM 타입 입니다.
MyISAM 타입은 무자게 빠르며, 대용량에도 강합니다. 그러나 트랜잭션은 지원되지 않습니다.
이노디비(InnoDB) 는 트랜잭션이 지원 됩니다. 쇼핑몰에서는 반드시 사용해야 합니다 ^^

HEAP 테이블 타입은 가장 빠르며, 단점은 메모리에 있기 때문에, MySQL에 중지 될 경우 모두 날아 갑니다.

검색을 하고 재검색을 다시 하는 경우, 임시 검색 테이블을 만들어 놓는 것도 좋은 방법입니다.
mysql>CREATE TABLE email_addresses TYPE=HEAP (
->email char(55) NOT NULL,
->name char(30) NOT NULL,
->PRIMARY KEY(email) );


int,smallint,tinyint 데이터형
int 는 굉장히 큰수 입니다. 4바이트를 차지 하구요.
tinyint 는 몇백 까지만 됩니다. 1바이트 구요.

쓸데 없이 int 를 사용하지 마세용 !!
4바이트와 1바이트는 4배 차이 입니다.조그만것 1개 1개가 모여 서버 부하를 일으 킵니다.!!

데이터 량이 얼마만큼 들어가는지 체크 하고 데이터형을 선택 하세요 ^^
만약 쓸데없는 데이터 형이다 싶으면 alter table 로 데이터 형을 바꾸세요 !


인덱스의 사용
인덱스는 반드시 필요한 곳에만 넣으세요 !
인덱스를 줄 경우 하드 용량을 더 차지 하기 때문에 속도를 떨어 뜨릴 수 있습니다.

모든 칼럼에 인덱스를 주는 것은 절대 추천 하지 않습니다.
1개의 테이블에 주키외에 2-3 개 이상의 인덱스는 주지 마세요!

주키는 당근 인덱스 입니다. ^^

CREATE TABLE albums (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(80)NOT NULL,

INDEX title_idx (title)
);

☞Alter Table 로 인덱스 추가
ALTER TABLE albums ADD INDEX title_idx (title)

결합 인덱스의 경우 너무 많은 인덱스를 사용할 경우 CPU 오버헤드나 하드 오버헤드를 불러 일으 킵니다.
적당히 사용하세요 ^^


인덱스는 %$search% 가 먹지 않습니다.
그런디 게시판 제목(Subject) 에 인덱스 걸어 놓고 , 검색을 %$search% 이렇게 하면 될까요?
인덱스 거나 안거나 똑같습니다. !!


기타
BLOB과 TEXT 칼럼은 테이블을 분리 하는 것이 좋다. 다른 칼럼의 내용 보다 크기 때문이다 !

OPTIMIZE TABLE 명령을 자주 사용해라 !
Not null 로 지정 하는 것이 빠르다.
varchar 보다 char 이 훨빠르다.

mysql 유용한 팁

데이타베이스
202. myisamchk(isamchk)

MySql에 존재하는 실제 테이블의 데이터가 잘못되었을 경우 복구하는 유틸

테이블 하나당 3가지 파일형식 생성

*.MYD : 테이블 데이터 파일

*.MYI : 테이블 인덱스 파일

*.frm : 테이블 스키마 파일



*.ISM : isamchk로 복구(MySql 3.23이전)

*.MYI : myisamchk로 복구(MySql 3.23이후-대부분)



위치 : /usr/local/mysql/bin/isamchk

/myisamchk

[주의] MySql종료후에 사용

myisamchk점검모드와 복구보드

-점검모드 : 에러발견시 보고, 수정작업은 하지 않음(-c, --check, 無)

-복구모드 : 테이블파일을 직접 수행하여 에러부분 수정(-r, -o)



op> -s : 테이블 점검시 이상 발견시에만 메시지 출력

-v : 상세하게 메시지 출력

-i : 에러사항을 종합적으로 점검하여 결과를 상세하게

-ev : 점검할 때에 가장 정확한 결과를 보여줌(--extend-check)

-rv : 보통의 복구

-o : 시간은 더 소요되지만 -r로 복구하지 못하는 것도 복구 할 수 있다.

-e : 복구대상 데이터파일로부터 가능한 모든 레코드들을 복구, 복구율은 가장 높지만 가징 불안정한 방법

복구시에는 -re 혹은 -oe를 사용

수동 복구

1. 테이블 구조파일(*.frm)으로 인해 복구가 불가능할때

백업파일이 없다면,

-create table문으로 테이블 구조를 다시 만든다.

-만들기 전에 .MYI와 .MYD를 백업

-다시 myisamchk로 복구

2.테이블 인덱스 파일(*.MYI)로 인해 복구가 불가능 할때.

백업파일이 없다면,

-원본 .MYD와 .frm은 백업

-delete from으로 해당 테이블 의 모든 레코드를 삭제.

-백업해둔 .MYD와 frm파일을 원래 위치로 복사

-다시 mysamchk로 복구



203. mysql

MySql DB실행과 실행 확인

-/usr/local/mysql/bin/mysql_safe & : 백그라운드 작업으로 실행.



MySQL DB접속

-mysql -u 계정 -p '(password)' 접속할DB명



에러 메시지 : can't connect to local MySQL server through socket 'tmp/mysql.sock' (2)

-원인: 1.MYSQL이 종료되어서

2. mysql.sock의 위치가 다르기 때문

-해결 : 1. MySQL을 실행 한 뒤 접속

2. -S옵션으로 mysql.sock의 위치를 지정(예 : -S /var/lib/mysql/mysql.sock)



포트지정하여 접속

-기본포트 3306

-포트 지정 -P 2222 : 2222번포트로 접속

cf> 3306대신 다른 포트로 서비스 : /usr/local/mysql/bin/mysql_safe -P3306 &



원격서버 MySQL접속

-h 원격서버IP주소

cf> 다른 서버에서 MYSQL로 접속이 가능하게 하려면...

-db테이블과 user테이블의 host필드값을 '%'나 접속 허용 IP주소를 설정하면 원격서버의 접속을 허용한다.



리눅스 쉘상태에서 특정파일에 저장된 SQL문 실행

-SQL문이 담긴 파일 생성

-./mysql -u root -p mysql < ./SQL문이 담긴 파일명



PATH설정

-심볼릭링크사용 : ln -s /원본파일경로/파일명 만들링크이름

-계정생성시 절대경로를 PATH에 추가 : .bash_profile에서 PATH=$PATH1:/usr/local/mysql/bin

export USERNAME BASH_ENV PATH1 PATH 추가



204. mysqladmin

MYSQL관리유틸

형식> mysqladmin -u root -p 명령어

작업목록 : 명령어는 mysqladmin -u root -p 뒤에 붙는다

MySql의 root 패스워드 변경 : mysqladmin -u root -p password 변경할패스워드

-설치 직후의 root 패스워드 변경 : mysqladmin -u root password 설정할패스워드

일반계정 사용자 패스워드 변경 :mysqladmin -u 계정명 -p password 변경할패스워드

-혹은 set password for 계정명=password('변경할 패스워드) : root로 접속했을 경우

DB생성 : create DB명

DB 삭제 : drop DB명

현재 상황 살피기 : status

-자세히 살피기 : extened-status

접속 client리스트 확인 : processlist

캐쉬 데이터 동기화 : reload

종료 : shutdown

실행 환경변수 확인 : variables

접속한 사용자 접속 끊기 : processlist에서 확인후 kill UID

버젼 및 실행 정보 확인 : version

MYSQL이 죽었는지 살았는지 확인 : ping



205. mysql_safe

MYSQL DB를 실행하는 명령어

형식> mysql_safe [op] &

포트번호 지정 시작

-P포트번호



grant table권한없이 실행

-MYSQL실행시에 table grant권한을 생략하고 실행. 모든 사용자들이 패스워드 없이 바로 접속

- --skip-grant-table &



root패스워드 잊어버렸을시에 복구

1. MYSQL종료

2. --skip-grant-table로 권한없이 실행

3. 패스워드 없이 root로 접속

4. update문으로 root패스워드 변경

-update user set password=password('변경할PW') where user='root';

5. flush privileges로 변경된 내용 동기화

6. MYSQL종료

7. MYSQL실행

8. root로 접속하여 확인



여러 옵션으로 MYSQL실행 : -O로 연결

max_connection= (최대 연결 가능한 프로세스 수)

table_cache= (사용할 테이블캐쉬크기)

wait_timeout= (타임아웃 시킬 최대 연결 대기 지속 시간)



too many connection에러 발생시

max_connection= (최대 연결 가능한 프로세스 수)

table_cache= (사용할 테이블캐쉬크기)

wait_timeout= (타임아웃 시킬 최대 연결 대기 지속 시간)

이 세가지 값을 적절한 값을 넣고 MYSQL시작



보안을 위한 MYSQL관리 전용계정으로 시작

-관리 전용 계정을 생성한 뒤에 chown으로 /usr/local/mysql/의 모든 파일의 owner를 mysql로 변경

-chown -R mysql:mysql /usr/local/mysql/

-여기서 계정은 리눅스 시스템 계정



에러로그파일 관리

/usr/local/mysql/data/호스트명.err로 저장



쿼리로그 남기기

-쿼리로그 사용시에는 한순간에 disk full이 될 수 있음

-op> --log=쿼리로그파일명(혹은 경로명/파일명) &

- /usr/local/mysql/data/지정된파일명



바이너리로그파일 관리

-변경된 데이터의 내역을 기록

-속도와 보안을 위해 텍스트가 아닌 바이너리로 저장

-op> --log-bin=바이너리로그파일명(혹은 경로명/파일명) &

- /usr/local/mysql/data/지정된파일명



SLOW로그 파일 관리

-long_query_time의 설정시간 이상의 쿼리 시간을 가지는 특정 SQL쿼리문에 대한 로그를 기록

-op> --log-slow-queries=슬로우쿼리파일명(혹은 경로명/파일명) &



206. mysqldump

MYSQL백업방법

1. /usr/local/mysql/전체를 매일 백업

2. mysqldump로 MYSQL스키마와 데이터만을 백업



형식

mysqldump [op] DB[TABLES.....] > 파일명

--database [op] DB1 [DB2 DB3...] > 파일명

--all-databases [op] >파일명



백업형식 : mysqldump -u 계정 -p 백업대상DB > 저장할 파일명

복구할DB < 저장한 파일명



기존테이블 삭제후 백업된 파일로 복구하기위한 백업방법

-백업된 파일로 복구를 할 때 기존의 테이블을 완전히 삭제하고 테이블을 다시 만들어서 데이터를 입력하는 방법으로 복구하기 위해

-복구할때 백업후와 복구시점 사이의 데이터는 사라지므로 주의

-op> --add-drop-table 백업할 DB



백업시에 에러무시 : -f

원격호스트의 DB백업 : -h 호스트IP -P 포트

CREATE DATABASE문을 생략하고 백업(--databases, --all-databases로 백업할때) : -n , --no-create-db

CREATE TABLE문 생략하고 백업 : -t, --no-create-info

테이블 스키마만 백업 : -d, --no-data

조건주기 : --where="조건문"



207. mysqlimport

특정텍스트 파일의 전체내용을 특정 DB의 특정 테이블로 입력

형식> mysqlinport -u root -p DB명 입력받을텍스트파일명



208. mysqlshow

특정DB의 스키마를 확인

mysqlshow [op] [DB[table[column]]]

-DB명이 없을 경우 존재하는 모든 데이터베이스를 나열

-테이블 테이블을

-컬럼 컬럼을

mysql 동시접속자 수

데이타베이스
인터넷 사용자들이 많아지면서 인기있는 웹 사이트에서는

Max connections 에러가 발생되는 것을 볼 수있을겁니다.

우선, MySQL은 동시에 연결될 수 있는 클라이언트의 수가

100입니다.

이런 에러가 발생한다면 먼저 접속되어있는 클라이언트의 수를
확인하셔야겠죠. 확인방법은 아래와 같습니다.
$ mysqladmin -u root -p패스워드 variables | grep max_connection

| max_connections | 100

이제는, 클라이언트의 동시 접속자를 늘리는 명령입니다.
먼저 mysqld - 이 데몬을 kill 하셔야 겠죠...
$ safe_mysqld -O max_connections=200 &
참고로, 리눅스나 솔라리스 계열에서는 클라이언트의 동시 접속자수가 500 ~ 1,000 까지 가능하다고 합니다.

이렇게 하신 후 다시 확인합니다.
$ mysqladmin -u root -p패스워드 variables | grep max_connection

그럼 제한되어 있지만 원하시는 만큼의 동시접속자 수를

늘리시게 된겁니다.

./configure 할때 다음과 같이 에러가 생길땐

데이타베이스
에러 메세지~!!

checking whether build environment is sane... configure: error: newly created file is older than distributed files!




요건~!!! mysql 개발일이랑 지금 시간이랑 논리적인 오류가 있을때 생겨남

해결은... 서버 타임을 확인해보자 ㅋㅋ

/usr/bin/rdate -s time.bora.net