Forum und email

데이터베이스와 관련된 문제

이 섹션은 PHP와 데이터베이스의 연동에 관련되어 자주 묻는 질문들을 다룹니다. 네, PHP는 오늘날 거의 모든 데이터베이스와 연동이 가능합니다.

  1. PHP로 Microsoft SQL 서버로 접근이 가능하다고 들었습니다. 어떻게요?
  2. MS 액세스 데이터베이스(Microsoft Access database)에 접속할수있습니까?
  3. PHP 5 부터는 더이상 MySQL 클라이언트 라이브러리를 함께 제공하지 않는다고 하는데, 이말은 무슨 의미인가요? PHP로 계속 MySQL을 사용할수 있나요? MySQL을 사용하려고 하면 "function undefined"라는 에러 메시지를 보여줍니다. 뭣때문인지요?
  4. I upgraded to PHP 4, and now mysql keeps telling me "Warning: MySQL: Unable to save result set in ...". What's up? PHP 4로 업그레이드했습니다. 그런데 mysql이 다음과같은 메시지를 보여줍니다. "Warning: MySQL: Unable to save result set in ...". 뭐죠?
  5. 공유 MySQL 지원(shared MySQL support)을 설치한후에, 아파치가 libphp4.so를 로드할때마다 코어 덤프가 일어납니다. 이것을 고칠수 있나요?
  6. 왜 다음과 같은 에러가 발생합니까: "Warning: 0 is not a MySQL result index in <file> on line <x>" 또는 "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?
  7. PHP로 Microsoft SQL 서버로 접근이 가능하다고 들었습니다. 어떻게요?

    윈도우 머신상에서, 인클루드 ODBC 지원(included ODBC support)과 ODBC 드라이버(correct ODBC driver)를 사용할수 있습니다.

    유닉스 머신에서, 사이베이스-CT(Sybase-CT)드라이버를 사용할수있습니다. 왜냐하면 둘은 프로토콜이 호환되기 때문입니다. 사이베이스는 » 리눅스 시스템에 필요한 무료버전 을 만들었습니다. 다른 유닉스 운영체제에서는 적합 라이브러리(correct library) 로 사이베이스와 연동해야 합니다. 또한 다음 FAQ를 보세요.

    MS 액세스 데이터베이스(Microsoft Access database)에 접속할수있습니까?

    네, 윈도우 9x/Me나 NT/2000 상에서 운영하고 있다면 그리고 그 운영체제에서 ODBC를 사용할수 있고 MS 액세스 데이터베이스를 위한 ODBC 드라이버를 사용할수 있다면 필요한 모든 툴은 이미 보유한 것입니다.

    유닉스에서 PHP를 사용하고 있고 윈도우 박스의 MS 액세스와 연동하기를 원한다면 유닉스 ODBC 드라이버가 필요합니다. » OpenLink Software에 이를 수행할수 있는 유닉스 기반(Unix-based) ODBC 드라이버가 있습니다. 그곳에는 시험판(evalution)을 다운로드 할수 있는 안내용 프로그램(pilot program)이 있고, 그리고 675달러이상하는 상업용 버전도 있습니다.

    다른 방법은 윈도우 ODBC 드라이버까지 포함되있고 데이터도 저장할수 있는 SQL 서버를 사용하는것입니다. 그 데이터는 MS 액세스에서 접근할수 있고(ODBC로), PHP로(내장 드라이버)로 접근할수 있습니다. 또는 액세스와 PHP 모두에게 가용한 파일 형식을 이용하는것입니다. 즉 일반 파일(flat files)이나 dBase 형식으로요. 이에 관련된 글을 OpenLink software의 Tim Hayes가 쓴글을 참고하세요:

          Using another database as an intermediary is not a good idea, when you can
          use ODBC from PHP straight to your database - i.e. with OpenLink's drivers. If
          you do need to use an intermediary file format, OpenLink have now released
          Virtuoso (a virtual database engine) for NT, Linux and other unix platforms.
          Please visit our 
    » website
     for a free download.
          

    다른 방법은 MySQL을 사용하고, 윈도우상에서 MyODBC드라이버를 사용하여 데이터베이스를 일치(synchronizing)시키는 것입니다. Steve Lawrence의 글을 참고하세요:

    • MySQL의 지시에 따라 사용중인 플래폼에 MySQL을 설치합니다. » www.mysql.com(미러에서 받을수있슴!)에서 받을수 있습니다. 데이터베이스를 설치할때 외에는 특별한 설정이 필요치않습니다. 계정을 설정하고, host 필드에는 %로 놓거나 MySQL을 접속하고자하는 윈도우 컴퓨터의 호스트명을 넣습니다. 서버명, 계정, 비밀번호를 넣습니다.
    • MySQL사이트에서 윈도우드라이버용 MyODBC를 다운받습니다. 최종버전은 dbc-2_50_19-win95.zip입니다(NT도 사용할수 있을뿐만아니라 소스도 있습니다) 윈도우 머신에 그것을 설치합니다. 이 프로그램에 포함되어있는 유틸로 동작을 테스트할수있습니다.
    • ODBC 관리자 유저나 시스템 dsn을 만듭니다. 제어판에 위치합니다. dsn 이름을 만들고 스텝1에서 설정한 MySQL데이터베이스에 대한 호스트명, 유저명, 패스워드, 포트등을 넣습니다.
    • 전체 설치(full install)로 액세스를 설치합니다. 이렇게 하면 적절한 추가항목(add-ins)도 같이 설치가 됩니다. 최소한 ODBC 지원과 링크드 테이블 매니저(linked table manager)가 필요합니다.
    • 이제부터 중요한 부분입니다! 새 액세스 데이터베이스를 만듭니다. 그 테이블에서 오른쪽 클릭하고 링크 테이블(Link Tables)를 선택하거나, 파일 메뉴 옵션에서 Get External Data를 선택한후에 링크 테이블(Link Tables)을 선택하세요. 파일 브라우저 박스가 나올때 files of type: ODBC 를 선택하세요. 시스템 dsn과 스텝 3에서 만든 dsn의 이름을 선택하세요. 연결된 테이블을 선택하고, OK를 클릭하세요 이젠 테이블을 열수 있고 MySQL서버에 데이터를 넣거나/지우거나/수정 할수 있습니다. 질의(query)를 수행할수도 있고 MySQL에 테이블을 임포트(import)/익스포트(export)할수 있습니다. 폼이나 레포트도 만들수있고 기타등등...

    팁과 트릭:

    • 액세스에서 테이블을 만들수 있고 MySQL로 그 테이블을 익스포트(export)할수 있고, 거기에 링크를 걸수 있습니다. 이렇게 하면 테이블을 빨리 만들어냅니다.
    • 액세스에서 테이블을 만들때, 액세스에서 테이블에 쓸수있는 권한을 부여하기 위해 정의한 프라이머리 키(primary key)가 있어야 합니다. 액세스에 링크를 걸기전에 MySQL에 프라이머리 키를 만들었는지 확인합니다.
    • MySQL에서 테이블을 변경한다면, 액세스로 다시 링크를 걸어야 합니다. tools>add-ins>linked table manager로 가서 ODBC DSN을 보고, 거기에서 다시 링크할 테이블을 선택합니다. 거기서 dsn의 원본을 옮길수 있습니다. OK하기 전에 새 위치(new location) 항상 확인 체크박스를 클릭하면 됩니다.

    PHP 5 부터는 더이상 MySQL 클라이언트 라이브러리를 함께 제공하지 않는다고 하는데, 이말은 무슨 의미인가요? PHP로 계속 MySQL을 사용할수 있나요? MySQL을 사용하려고 하면 "function undefined"라는 에러 메시지를 보여줍니다. 뭣때문인지요?

    네, PHP에서는 앞으로도 계속 MySQL지원이 될것입니다. PHP 5의 단 하나의 변화가 클라이언트 라이브러리 자체를 함께 제공하지 않는다는 것입니다. 그 이유는 특별한 순서없이 아래글에서 설명하도록 하겠습니다:

    1. 요근래의 대부분의 시스템은 이미 클라이언트 라이브러리가 설치되어있습니다.

    2. 위에서 언급한대로, 라이브러리를 여러가지 버전을 갖게 되면 혼란스러워질수 있습니다. 예를 들면 어떤 버전은 mod_auth_mysql을 링크하고 다른 버전에는 PHP를 링크하고나서 아파치안에서 두개 버전을 모두 활성화시키면, 큰 충돌이 발생하게 됩니다. 또한, 함께 제공된 라이브러리가 설치된 서버버전과 항상 잘 작동하지도 않습니다. 이런 경우를 잘 보여주는 예가 mysql.socket 유닉스 도메인 소켓 파일이 있는 곳을 찾을수 없을때입니다.

    3. 유지관리가 약간 더디게 되고 최신판 버전에 점점더 뒤떨어지게 될것입니다.

    4. 앞으로의 라이브러리 버전은 GPL을 따르고 따라서 우리가 BSD/아파치 스타일의 라이센스 프로젝트인 GPL의 라이브러리를 함께 제공할수 없기 때문에 업그레이드 경로를 갖을수 없습니다. PHP 5에서 이런 깨끗한 중단이 최고의 선택으로 보입니다.

    이와 같은 사실은 실제로 많은 사람들에게 영향이 있지는 않을것입니다. 유닉스 유저, 최소한 그들이 무엇을 하는지 아는 유저,는 PHP를 빌드할때 단순히 --with-mysql=/usr 을 추가시킴으로써 시스템의 libmysqlclient에 대한 PHP 를 빌드하려 할것이기 때문입니다. 윈도우 유저는 php.ini안에 php_mysql.dll 확장을 활성화시킬수 있습니다. 또한 dll 디렉토리에 함께 제공된 다른 모든 DLL을 사용하듯이, 적절한 %SYSTEMROOT% 디렉토리안에 libmySQL.dll파일을 카피할수 있습니다.

    I upgraded to PHP 4, and now mysql keeps telling me "Warning: MySQL: Unable to save result set in ...". What's up? PHP 4로 업그레이드했습니다. 그런데 mysql이 다음과같은 메시지를 보여줍니다. "Warning: MySQL: Unable to save result set in ...". 뭐죠?

    대부분 PHP 4는 MySQL에대한 경로를 지정하지 않으면 '--with-mysql' 옵션으로 컴파일됩니다. 이것은 PHP가 내장(built-in) MySQL 클라이언트 라이브러리(MySQL client library)를 사용한다는 것입니다. 시스템이 응용프로그램을 실행할때 아파치 모듈로서의 PHP3나 auth-mysql과 같이 다른 버전의 MySQL클라이언트를 사용하면, 다른 버전의 클라이언트 사이에는 충돌이 발생합니다.

    PHP 4를 다시 컴파일하세요. 그리고 플래그값으로 MySQL경로를 넣으세요. '--with-mysql=/your/path/to/mysql' 보통 이렇게 하면 해결됩니다.

    공유 MySQL 지원(shared MySQL support)을 설치한후에, 아파치가 libphp4.so를 로드할때마다 코어 덤프가 일어납니다. 이것을 고칠수 있나요?

    MySQL libs가 pthreads로 링크되어있다면 이런 현상이 발생합니다. ldd로 점검해보세요. 그렇다면 MySQL 타볼(tarball)를 가져와서 소스로 컴파일하거나 소스 RPM에서 재컴파일해서 spec 파일에서 thread 클라이언트 코드로 변경하는 곳을 제거하세요. 이 방법 모두 이런 현상을 고칠수 있습니다. 그리고나서 새로운 MySQL libs와 함께 PHP를 재컴파일하세요.

    왜 다음과 같은 에러가 발생합니까: "Warning: 0 is not a MySQL result index in <file> on line <x>" 또는 "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?

    0으로 되어있는 결과 식별자(result identifier)를 사용하려 하고 있습니다. 0이라는것은 어떤 이유로 질의가 실패했다는것을 말합니다. 질의를 보내고 돌아온 결과 식별자를 사용하기 전에 에러를 점검할 필요가 있습니다. 다음과 비슷한 방법이면 됩니다.

    $result = mysql_query("SELECT * FROM tables_priv");
    if (!$result) {
        echo mysql_error();
        exit;
    }
    or
    $result = mysql_query("SELECT * FROM tables_priv")
        or die("Bad query: ".mysql_error());