'데이터베이스'에 해당되는 글 2건

  1. 2007/06/19 PHP와 MSSQL 연동 (1)
  2. 2007/06/10 미궁게임 PHP 버전 (2)

휴,, 정말 오랜만에 포스팅하는군요.

인천대학교 실습 때문에 MSSQL 서버를 쓰게 되었습니다. 분명 PHP와 연동할 방법이 있을 것 같아서 조사해 본 자료입니다.

먼저, MSSQL의 연동 방법은 MySQL과 같습니다. 함수 이름만 mysql_[...] 에서 mssql_[...]로 바뀐 것 뿐입니다. 하지만 사용 전에 세팅이 필요합니다.

먼저, PHP.ini 파일을 수정해야 합니다. APM Setup 사용자들은 APM 관리자에서 [환경 설정] -> [PHP 환경성절] -> [PHP 확장모듈 설정] 으로 들어가서 'php_mssql.dll'에 체크를 해 주시면 됩니다. APM Setup을 사용하시지 않으시는 분들은 직접 PHP.ini 파일을 열어서 주석으로 처리되어 있는 'extension=php_mssql.dll' 부분의 주석을 해제해주시거나 없는 경우 직접 입력해 주셔야 합니다. 그러면 일단 MSSQL을 사용하실 수 있습니다.

위 함수들이 주로 사용하게 되는 함수들입니다. MySql과 사용법은 같습니다. 자세한 사항은 링크된 Documentation을 참고하시기 바랍니다.

MSSQL에서 가장 까다로운 점은, MySQL과는 달리 여러 사용자를 설정할 수 있다는 것입니다. (MySQL에 다중 사용자 기능이 있는지는 모르겠지만, 저는 사용해 본 적이 없으므로...) 뭐 익숙해진 이 시점에서는 장점이라고 보아야겠지만, 처음 할 때는 매우 헷갈리더군요.

MSSQL은 로그인사용자의 개념을 구분합니다. 전체 DB에 로그온하는 것'로그인'으로 설정된 유저이며, '사용자'각각의 데이터베이스에 접근하는 자격입니다. 또한 사용자는 로그인에 종속적입니다.

무슨 말인고 하니, board라는 데이터베이스가 있다고 합시다. 이 데이터베이스에 접근하기 위해서는 먼저 DB 전체에 로그인을 해야 합니다. 하지만 로그인을 했다 해도 그것만 가지고는 board에 접근할 수 없습니다. 이 로그인이 board에 접근할 수 있는 권한을 주어야 하는데 이것이 '사용자'입니다. '로그인' 자격으로 로그인을 한 후 '사용자'의 자격으로 DB에 접근하는 것입니다. 하나의 로그인은 여러 개의 사용자를 가질 수 있으며, 하나의 사용자는 한 개의 로그인에서만 유효합니다.

최대한 쉽게 풀어보려고 했는데 점점 꼬이네요..;; 어쨌든 그렇습니다.

MSSQL은 기본적으로 sa라는 로그인을 제공합니다. 또한 각 데이터베이스에는 sa의 로그인을 사용하는 dbo라는 사용자가 설정됩니다. 때문에 모든 DB에 접근하기 위해서는 sa로만 로그인하면 됩니다. 하지만 이는 보안상 불리할 수 있기 때문에 용도에 따라 로그인을 몇 개 더 만든 후 사용하는 것이 좋습니다.

기본적으로 MySQL과 MSSQL의 쿼리문은 같습니다. 다만, MySQL의 LIMIT 문을 MSSQL에서는 TOP으로 써야 합니다. 다음은 비교 소스입니다.

MySQL (Language : sql)
  1. SELECT * FROM tbl_name LIMIT 10;
  2. SELECT * FROM tbl_name LIMIT 0,30;
  3. SELECT * FROM tbl_name LIMIT 30,10;
 
MSSQL (Language : sql)
  1. SELECT TOP 10 * FROM tbl_name;
  2. SELECT TOP 30 * FROM tbl_name;
  3. SELECT TOP 10 * FROM tbl_name WHERE INDEX NOT IN ( SELECT TOP 30 INDEX FROM tbl_name );

보시는 바와 같이 중간에 있는 데이터를 뽑아올 때에는 NOT IN 문을 써야 합니다. 좀 귀찮은 건 사실입니다.

아직 많이 써 보진 않았지만 관리하기에는 MSSQL이 더 편할 것 같아 추후 개발시에는 MSSQL을 이용하려고 합니다.



2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
우리 반 H모씨 曰,
 "미궁게임 문제 줄테니까 웹페이지좀 만들어줘."

뭐 그냥 일반적인 미궁 게임처럼 페이지 이름을 답으로 해서 넘어가는 형식으로 하면 되지만, PHP 공부도 할 겸 해서 DB에 문제와 답을 저장하고 하나의 페이지에서 다 할 수 있는 일명 '미궁게임 PHP Version'을 만들어보았습니다.

사용자 삽입 이미지

문제 페이지입니다.


사용자 삽입 이미지

사용자 삽입 이미지

만세~


모든 작업은 index.php 하나에서 이루어집니다. 현재 풀고 있는 문제는 세션을 이용하여 처리할 수 있도록하였습니다. 세션을 이용하여 자료를 저장하는 방법을 아키군에게 물어보니, 세션 변수에 스테이지 자체를 저장하라고 하더군요. 하지만 그래도 변수인데 솜씨 좋은 놈이 조작할까 왠지 모를 걱정이 되어 세션과 DB를 연동하여 자료를 저장했습니다. 일단 제가 저장할 것은 stage이기 때문에 데이터베이스에 session용 테이블을 하나 만들고, 여기에 session_id, expire, stage와 같은 3개의 필드를 만들어주었습니다.

session_id는 그야말로 해당 세션의 고유 아이디를 저장하고 있고, expire는 해당 세션의 만료 시간, stage는 실제로 저장될 풀고 있는 문제 번호를 저장하는 필드입니다. id는 30자리의 1부터 9까지로 이루어진 문자열을 임의로 생성하여 할당했으며, 만료 시간은 기본 1시간으로 설정하였습니다.

일단 사용자가 최초로 사이트에 접속하면 세션이 있는지를 검사하고 없다면 새로운 id를 할당한 후 이를 세션 변수에 저장하고, 생성된 id를 DB에 저장합니다. 물론 DB의 stage필드의 값으로는 초기값인 1을 넣어주어야겠지요. 만약 사용자가 문제를 맞혔다면 세션 변수에 저장되어 있는 id를 이용하여 DB에서 id와 일치하는 레코드를 찾고, 해당하는 stage값을 읽어와 1 증가시킨 후에 업데이트합니다.

또한 페이지가 열릴 때마다 세션 테이블에서 만료 시간이 지난 레코드를 모두 찾아 삭제해줍니다. 이렇게 하면 최근 1시간 이내에 생성된 세션만 남아있게 됩니다.

사실 이외에도 몇 가지 부수적인 것들이 많이 있습니다. 아직 함수화를 하는 데 익숙치가 않아서 소스코드가 매우 난잡한 게 최대 단점이랄까요. 뭐 그래도 보안상 신경을 쓴다고 써서 만든 것이니(솔직히 보안 할 문제도 아니지만) 쉽게 뚫리지는 않겠지요.

버전 업좀 하고 문제좀 만들어서 올린 후에 공개하겠습니다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry