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

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

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에 이를 수행할수 있는 유닉스 기반 ODBC 드라이버가 있습니다.

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

PHP에서 직접 ODBC를 사용하여 데이터베이스에 접근 할 수 있을 경우 - 즉, OpenLink의 드라이버를 사용할 경우 중간 단계로 다른 데이터베이스를 사용하는 것은 좋은 생각이 아닙니다. 중간 파일 형식을 사용해야 한다면, OpenLink에서 Virtuoso(가상 데이터베이스 엔진)를 NT, 리눅스, 기타 유닉스 플랫폼에 릴리즈했습니다. » 웹 사이트에서 무료로 내려받을 수 있습니다.

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

  • MySQL의 지시에 따라 사용중인 플랫폼에 MySQL을 설치합니다. » www.mysql.com에서 받을수 있습니다. 데이터베이스를 설치할때 외에는 특별한 설정이 필요치않습니다. 계정을 설정하고, host 필드에는 %로 놓거나 MySQL을 접속하고자하는 윈도우 컴퓨터의 호스트명을 넣습니다. 서버명, 계정, 비밀번호를 넣습니다.
  • MySQL사이트에서 윈도우드라이버용 MyODBC를 다운받습니다. 윈도우 머신에 그것을 설치합니다. 이 프로그램에 포함되어있는 유틸로 동작을 테스트할수있습니다.
  • ODBC 관리자 유저나 시스템 dsn을 만듭니다. 제어판에 위치합니다. dsn 이름을 만들고 스텝1에서 설정한 MySQL데이터베이스에 대한 호스트명, 유저명, 패스워드, 포트등을 넣습니다.
  • 전체 설치로 액세스를 설치해서, 필요한 애드인을 얻습니다... 최소한 ODBC 지원과 연결 테이블 관리자가 필요합니다.
  • 이제부터 중요한 부분입니다! 새 액세스 데이터베이스를 만듭니다. 그 테이블에서 오른쪽 클릭하고 링크 테이블(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) 항상 확인 체크박스를 클릭하면 됩니다.

Why is the MySQL extension (ext/mysql) that I've been using for over 10 years discouraged from use? Is it deprecated? What do I use instead? How can I migrate?

There are three MySQL extensions, as described under the Choosing a MySQL API section. The old API should not be used, and one day it will be deprecated and eventually removed from PHP. It is a popular extension so this will be a slow process, but you are strongly encouraged to write all new code with either mysqli or PDO_MySQL.

Migration scripts are not available at this time, although the mysqli API contains both a procedural and OOP API, with the procedural version being similar to ext/mysql.

It is not possible to mix the extensions. So, for example, passing a mysqli connection to PDO_MySQL or ext/mysql will not work.

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

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

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

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

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

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

이와 같은 사실은 실제로 많은 사람들에게 영향이 있지는 않을것입니다. 유닉스 사용자, 최소한 그들이 무엇을 하는지 아는 사용자는 PHP를 빌드할 때 항상 --with-mysql=/usr 옵션을 추가하여 시스템의 libmysqlclient 라이브러리로 PHP를 빌드했습니다. 윈도우 사용자는 php.ini에서 php_mysql.dll 확장을 활성화할 수 있습니다. 자세한 설치 안내는 MySQL 레퍼런스를 참고하십시오. 또한, libmysql.dll이 시스템 PATH에 들어있는지 확인하십시오. 이를 하는 방법은 윈도우 시스템 PATH 설정하기 FAQ를 읽어보십시오. libmysql.dll(과 많은 PHP 관련 파일들)은 PHP 폴더에 존재하므로, PHP 폴더를 시스템 PATH에 추가할 수 있습니다.

공유 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이라는것은 어떤 이유로 질의가 실패했다는것을 말합니다. 질의를 보내고 돌아온 결과 식별자를 사용하기 전에 에러를 점검할 필요가 있습니다. 다음과 비슷한 방법이면 됩니다.

<?php

$result 
mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
    echo 
mysql_error();
    exit;
}
?>
또는
<?php

$result 
mysql_query("SELECT * FROM tables_priv")
    or die(
"Bad query: " mysql_error());
?>

add a note add a note

User Contributed Notes 2 notes

up
11
knb at gfz-potsdam dot de
19 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
-3
doug at unlikelysource dot com
7 years ago
To enable SQL Server access from ubuntu 16.04:

* Run these commands:
```
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > mssql-release.list
sudo mv mssql-release.list /etc/apt/sources.list.d
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql unixodbc-dev
sudo apt-get install php7.1-dev
sudo apt-get install autoconf
sudo pecl install pdo_sqlsrv-4.1.6.1
```

*  Confirm ODBC driver installation:
```
odbcinst -q -d -n "ODBC Driver 13 for SQL Server"
```

* Update the php.ini file: run` php --ini` to find the path to your php.ini file
* Add this line to /path/to/php.ini
```
extension=pdo_sqlsrv.so
```
* Run `php -i` to confirm SQLSRV support was added
* NOTE: extensions (on my computer) were installed here:
`/usr/local/lib/php/extensions/no-debug-non-zts-20160303/`

* Test user access directly on the Windows server running MSSQL:
```
sqlcmd -S ip_address -U username -P password -d database -q "select * from table_name"
```
* On the Windows server: open port 1433 in your firewall

* Install the FreeTds utils to test the connection:
```
sudo apt-get install freetds-bin
tsql -H mssql.host.ip.address -U username -P password -D database -p 1433
```

* Formulate the correct DSN (Data Source Name):
    See: http://php.net/manual/en/ref.pdo-sqlsrv.connection.php

* Sample PHP Code:
```
<?php
// Database params
$tcp  = '192.168.3.126';
$port = 1433;
$user = "test";
$password = "Password123";
$database = "test";

// Open connection
try {
   
// Database connect -- use one of the two statements below
   
$dsn 'sqlsrv:Server=tcp:' . $tcp . ',' . $port . ';Database=' . $database;
   
$dbh = new PDO( $dsn, $user, $password, array());
   
// SQL prepare
   
$sql = "SELECT * FROM prospects";
   
$sth = $dbh->prepare($sql);
   
// Execute
   
$sth->execute();
   
// Fetch results
   
$row = $sth->fetch(PDO::FETCH_ASSOC);
    if (
$row) {
       
$output = '<pre>';
       
$output .= implode("\t", array_keys($row)) . PHP_EOL;
       
$output .= implode("\t", $row) . PHP_EOL;
        while (
$row = $sth->fetch(PDO::FETCH_NUM)) {
           
$output .= implode("\t", $row) . PHP_EOL;
        }
    }
} catch (
PDOException $e) {
   
$output .= $e->getMessage();
}
$output .= '</pre>';
echo
$output;
```
To Top