[출처]http://blog.paran.com/ozones/12935907
PHP용 ADOdb 라이브러리
V4.04 13 Nov 2003 (c) 2000-2003 John Lim (jlim#natsoft.com)
변역: Jae-Geun Kim/DoA (artech@qaos.com)
이 소프트웨어는 BSD 형식과 LGPL 형식의 두가지 라이센스를 사용한다. 이 것은 이 소프트웨어를 컴파일해서 상업적인 제품에 사용할 수 있다는 것을 의미한다.
소개
특징
ADOdb를 사용하는 사이트
수정 및 버그 보고
설치
최소 설치
코드 초기화와 접속 예
고속 ADOdb
안전하게 ADOdb 변경하기
ADONewConnection NewADOConnection
PHP5 특징
foreach 루프 예외처리
지원되는 DB
길잡이
예 1: Select
예 2: 고급 Select
예 3: Insert
예 4: 디버깅 rs2html 예
예 5: MySQL과 메뉴
예 6: 여러 DB에 동시 접속하기
예 7: Update, Insert SQL 생성하기
예 8: 이전, 이후 페이지로 이동하기
예 9: CSV 또는 탭분리 형식으로 내보내기
예 10: 사용자 필터
예 11: 지능적 트랜잭션
사용자 오류 처리와 PEAR_Error 사용하기
데이타 소스명(DSN)
캐슁
피펏 테이블
변수: $ADODB_COUNTRECS $ADODB_ANSI_PADDING_OFF $ADODB_CACHE_DIR $ADODB_FETCH_MODE $ADODB_LANG
상수: ADODB_ASSOC_CASE
ADOConnection
연결: Connect PConnect NConnect
SQL 실행: Execute CacheExecute SelectLimit CacheSelectLimit Param Prepare PrepareSP Parameter
GetOne CacheGetOne GetRow CacheGetRow GetAll CacheGetAll GetCol CacheGetCol GetAssoc CacheGetAssoc Replace
ExecuteCursor (oci8 만)
SQL 문장 생성: GetUpdateSQL GetInsertSQL Concat IfNull substr random qstr Param OffsetDate SQLDate DBDate DBTimeStamp
브롭(Blobs): UpdateBlob UpdateClob UpdateBlobFile BlobEncode BlobDecode
페이지 이동: PageExecute CachePageExecute
지우기: CacheFlush Close
트랙잭션: StartTrans CompleteTrans FailTrans HasFailedTrans BeginTrans CommitTrans RollbackTrans
데이타 가져오기: SetFetchMode
문자열 처리: concat qstr quote substr
날짜: DBDate DBTimeStamp UnixDate UnixTimeStamp OffsetDate SQLDate
행관리: Affected_Rows Insert_ID RowLock GenID CreateSequence DropSequence
오류 처리: ErrorMsg ErrorNo MetaError MetaErrorMsg
데이타 사전(메타데이타): MetaDatabases MetaTables MetaColumns MetaColumnNames MetaPrimaryKeys MetaForeignKeys ServerInfo
통계 및 쿼리 재생성: LogSQL fnExecute and fnCacheExecute
Deprecated: Bind BlankRecordSet
ADORecordSet
한 필드 리턴: Fields
한 행 리턴:FetchRow FetchInto FetchObject FetchNextObject FetchObj FetchNextObj GetRowAssoc
모든 행 리턴:GetArray GetRows GetAssoc
이동:Move MoveNext MoveFirst MoveLast AbsolutePosition CurrentRow AtFirstPage AtLastPage AbsolutePage
메뉴 생성:GetMenu GetMenu2
날짜:UserDate UserTimeStamp UnixDate UnixTimeStamp
레코드셋 정보:RecordCount PO_RecordSet NextRecordSet
필드 정보:FieldCount FetchField MetaType
삭제: Close
rs2html 예
ADOdb와 ADO의 차이
DB 드라이버 길잡이
변경사항
소개
PHP는 표준화된 DB 접근함수를 가지고있지않다. ADOdb는 서로 다른 DB API 사이트 차이를 숨길 수 있는 DB 크래스(차이점은 캡슐화된다), 따라서 데이타베이스를 쉽게 바꿀 수 있는 DB 크래스에대한 필요성때문에 만들어졌다. ADOdb는 PHP 4.0.5 이상의 버전을 필요로 한다(배열을 처리할 수 있는 str_replace를 사용하기때문이다).
MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL, FrontBase, SQLite, Interbase(Firebird와 Borland 변종), Foxpro, Access, ADO, DB2, SAP DB와 ODBC를 지원한다. 또한 ODBC를 통해 Progress와 CacheLite에 성공적으로 접속했다는 보고를 받았다. 우리는 보다 많은 사람들이 여러 데이타베이스를 지원하는 드라이버 개발에 기여하기바란다.
PHP4는 세션 변수를 지원한다. 호환성과 확장성을 위해 세션 정보를 ADOdb를 사용해서 저장할 수 있다. 보다 자세한 정보는 adodb-session.php를 보기바란다.
다른 DB와 호환되는 SQL 쓰기위한 팁은 http://php.weblogs.com/portable_sql(또한 이 배포본의 tips_portable_sql.htm를 사용할 수 있다)을 보기바란다.
ADOdb의 특징
- 윈도우즈 프로그래머가 사용하기 쉬움: MS의 ADO와 유사하기때문에 윈도우즈 프로그래머가 사용히기 쉽다.
- 다중 DB에 빠르게 삽입, 갱신: 단지 Select 문장에만 집중된 다른 PHP DB 크래스와 달리 ADOdb는 다중 DB에 빠르게 삽입, 갱신할 수 있는 코드를 제공한다. 서로 다른 DB의 날짜 처리, 문자열 결합, 문자열 인용에대한 메쏘드를 제공한다.
- 메타 시스템: 메타 시스템이 내장되었으므로 서로 다른 DB의 CHAR, TEXT, STRING과 같은 데이타 형을 알아낼 수 있다.
- 다른 DB로의 변환이 용이: 모든 DB 종속 코드는 Stub 함수내에 저장되기때문에 다른 DB로 변환하기 쉽다. 아울러 이 크래스의 핵심 로직을 포트할 필요는 없다.
- 데이타 사전: 데이타 사전 크래스로 다른 DB와 호환 가능한 테이블과 인섹스를 생성할 수 있다.
- 성능 감시 및 튜닝: 성능 감시 크래스로 DB 성능 감시와 SQL 튜닝을 수행 할 수 있다.
- 세션 관리: 세션 관리 크래스로 DB 백된 세션을 관리할 수 있으며 세션 만료 경고를 지원한다.
ADOdb를 사용하는 사이트
다음은 ADOdb를 사용해서 구축된 사이트이다(보다 많은 사이트는 http://php.weblogs.com/adodb-cool-applications를 방문하기 바란다):- PhpLens
- PHAkt: PHP Extension for DreamWeaver Ultradev
- Analysis Console for Intrusion Databases (ACID):
- PostNuke
- EasyPublish CMS
- NOLA
수정 및 버그 보고
수정 및 버그 보고는 jlim#natsoft.com.my로 전자우편을 보내거나 ADOdb 포럼(http://phplens.com/lens/lensforum/topics.php?id=4)에 올리기 바란다.
설치 길잡이
PHP 4.0.4 이상의 버전을 사용하는지 확실히하기 바란다. 웹서버가 접근할 수 있는 디렉토리에 모든 파일을 압축해제한다.
정상적인 설치여부를 검사하기위해 길잡이의 예를 변경한다. 접속 설정이 올바른지 확실히 한다. 다음 예에 보여진 것처럼 $db->debug = true를 설정함으로서 디버그할 수 있다:
<?php include('adodb/adodb.inc.php'); $db = ADONewConnection($dbdriver); # 예 'mysql' 또는 'postgres' $db->debug = true; $db->Connect($server, $user, $password, $database); $rs = $db->Execute('select * from some_small_table'); print "<pre>"; print_r($rs->GetRows()); print "</pre>";?>
최소 설치
ADOdb를 필요한 파일만 설치하려는 개발자의 경우 다음 파일만 설치하면된다:
- adodb.inc.php
- adodb-lib.inc.php
- adodb-time.inc.php
- adodb-csvlib.inc.php (캐쉬된 레코드셋(CacheExecute())을 사용하려면)
- adodb-error.inc.php(MetaError()를 사용하려면)
- drivers/adodb-$database.inc.php
- license.txt (법적인 이유)
코드 초기화 예
ADOdb를 기동할 때 적어도 두개의 파일이 먼저 읽혀져야 한다. 첫번째는 adodb/adodb.inc.php로서 모든 DB 크래스에의해 사용되는 함수가 포함되어 있다. 특정 DB에대해 정의된 코드는 adodb/driver/adodb-????.inc.php 파일에 포함되어 있다.
예를들어, mysql 데이타베에스에 접속하려면 다음과 같은 코드를 사용한다:
include('/path/to/set/here/adodb.inc.php');$conn = &ADONewConnection('mysql');
DB 접속이 필요한 경우 항상 ADONewConnection($driver) 함수를 사용해서 접속 개체를 생성한다. NewADOConnection($driver)는 별명이다.
이 시점에서 DB에 접속되는 것은 아니다. 접속하기전에 영구 접속을 할 것인지 일시 접속을 할 것인지 결정해야한다. 영구 접속의 잇점은 DB 접속이 끊어지지않으므로 빠르다는 것이다(심지어 Close()를 호출해도). 일시 접속은 훨씬 적은 시스템 자원을 자치하므로 DB 서버나 웹 서버에 과부하가 걸릴 위험성을 줄일 수 있다.
영구 접속의 경우, $conn->PConnect()를 사용하며, 일시 접속의 경우 $conn->Connect()를 사용한다. 몇몇 DB 드라이버는 NConnect()를 지원한다. NConnect()는 강제로 새로운 접속을 생성한다.
접속시 주의사항: 두개의 접속을 생성하면서 동일한 사용자 ID와 PW를 사용하면 PHP는 접속을 공유하게된다. 이 경우 새로 생성된 접속이 다른 DB에 접속하는 것이라면 문제를 발생할 수 있다. 이 문제를 해결하는 방법은 서로 다른 데이타베이스에 연결하는 경우 항상 다른 사용자 ID를 사용하거나 NConnect()를 사용하는 것이다.
DB 접속 예
MySQL과 자주 사용되는 DB 드라이버
MySQL 접속은 아주 직관적이다. 모든 매개변수는 mysql_connect와 동일하다:
$conn = &ADONewConnection('mysql'); $conn->PConnect('localhost','userid','password','database');
대부분의 다른 DB 드라이버도 비슷한 규칙을 사용한다:
Connect($server, $user, $password, $database)
예외는 다음에 열거되었다.
PostgreSQL
PostgreSQL에서 허용되는 연결:
a. 표준 접속 문자열:
$conn = &ADONewConnection('postgres7'); $conn->PConnect('host=localhost port=5432 dbname=mary');
b. 전통적인 4개의 매개변수 사용:
$conn->PConnect('localhost','userid','password','database');
Interbase/Firebird
$host 매개변수에 데이타베이스를 정의한다:$conn = &ADONewConnection('ibase'); $conn->PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');
Oracle
Oracle의 경우 여러가지 방법으로 연결할 수 있다.
a. PHP와 Oracle이 동일한 컴퓨터에 설치된 경우, 기본 SID 사용.
$conn->Connect(false, 'scott', 'tiger');
b. TNS 명이 정의된 경우, 예. 'myTNS'
$conn->PConnect(false, 'scott', 'tiger', 'myTNS');
또는
$conn->PConnect('myTNS', 'scott', 'tiger');
c. 호스트 주소와 SID
$conn->Connect('192.168.0.1', 'scott', 'tiger', 'SID');
d. 호스트 주소와 서비스 명
$conn->Connect('192.168.0.1', 'scott', 'tiger', 'servicename');
ODBC로 DSN없이 연결하기(Access와 mssql 예)
ODBC는 ODBC 제어판으로 DSN을 생성하거나 DSN이 없이 연결할 수 있다.ODBC로 DSN이 없이 연결하려면 PHP 4.3 이상을 필요로 한다.
Microsoft Access:
$db =& ADONewConnection('access'); $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\northwind.mdb;Uid=Admin;Pwd=;"; $db->Connect($dsn);Microsoft SQL Server:
$db =& ADONewConnection('odbc_mssql'); $dsn = "Driver={SQL Server};Server=localhost;Database=northwind;"; $db->Connect($dsn,'userid','password');ADO로 DSN이 없이 연결하기
만약 PHP 4.3.0 이하의 버전을 사용하면서 DSN이 없이 연결하려면 Microsoft의 ADO(Microsoft의 COM API)가 있어야한다. ADOdb 라이브러리와 Microsoft의 ADO를 사용한 예:
<?php include('adodb.inc.php'); ADOLoadCode("ado_mssql"); $db = &ADONewConnection("ado_mssql"); print "<h1>DSN이 없는 DB 연결: $db->databaseType...</h1>"; $myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};" . "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;" ; $db->Connect($myDSN); $rs = $db->Execute("select * from table"); $arr = $rs->GetArray(); print_r($arr);?>
고속 ADOdb
ADOdb는 대형 크래스 이지만 다른 모든 PHP 크래스에배해 성능상 일관된 우위를 보여왔다. 이 것은 Onion과 같은 계층화 패션(핵심 레이여에서 가장 빠른 함수)으로 설계되었기 때문이다. 최적의 성능을 위해 다음 함수를 고수하기바란다.:
핵심 레이여 |
Connect, PConnect, NConnect |
필드에 접근하는 가장 빠른 방법은 배열, $recordset->fields를 직접 접근하는 것이다. 또한 데이타베이스에 연결하기전에 전역 변수, $ADODB_FETCH_MODE = ADODB_FETCH_NUM와 $ADODB_COUNTRECS = false를 설정할 수 있다.
데이타베이스가 바인딩을 지원한다면 바인딩을 사용하기 바란다. 바인딩은 쿼리를 다시 사용할 때 성능이 개선된다. 병목 현상을 판정하기위해 ADOdb의 성능 튜닝 시스템을 사용하기 바란다.
마지막으로 APC, Turck MMCache, Zend Accelerator나 ionCube와같은 PHP 가속기가 설치되어 있는지 확실히하기 바란다.
안전하게 ADOdb 변경하기
필요한 경우 ADOdb를 변경할 수 있다. 다행히 ADOdb를 하위 크래스로 만들고 $ADODB_NEWCONNECTION 변수를 사용함으로서 역호환성을 유지할 수 있다. $ADODB_NEWCONNECTION으로 ADONewConnection()의 동작을 제어할 수 있다. ADONewConnection()은 이 변수를 검사하고 이 변수가 정의된 경우 이 변수에서 지시하는 함수를 호출한다.
다음 예는 접속 개체를 생성하는 새로운 함수, hack_mysql과 hack_postgres7를 만드는 예이다. 레코드셋 개체 이름을 부여하는 규칙은 $rsPrefix를 사용해서 제어할 수 있다. 이 예에서는 'hack_rs_'를 사용하고 있으며, 이로인해 ADOdb는 레코드셋 개체로서 hack_rs_mysql와 hack_rs_postgres7를 사용할 수 있다. 만약 기본 ADOdb 드라이버를 원한다면 거짓을 리턴하면 된다.
class hack_mysql extends adodb_mysql {var $rsPrefix = 'hack_rs_'; /* 자신만의 기능 */}class hack_rs_mysql extends ADORecordSet_mysql { /* 자신만의 기능 */}class hack_postgres7 extends adodb_postgres7 {var $rsPrefix = 'hack_rs_'; /* 자신만의 기능 */}class hack_rs_postgres7 extends ADORecordSet_postgres7 { /* 자신만의 기능 */}$ADODB_NEWCONNECTION = 'hack_factory';function& hack_factory($driver){ if ($driver !== 'mysql' && $driver !== 'postgres7') return false; $driver = 'hack_'.$driver; $obj = new $driver(); return $obj;}include_once('adodb.inc.php');
부모 크래스의 생성자를 반드시 호출해야 한다. ADOdb 4.02 이상은 사용하고 있는 PHP 버전이 무었인지 분명하게 결정할 수 있다. 만약 PHP5가 검출되면 다음 특징을 사용할 수 있다: PHP5 특징
지원되는 DB
이름 | 검사 | DB | RecordCount() 지원 | 전제조건 | 운영체계 |
access | B | Microsoft Access/Jet. ODBC DSN을 생성. | Y/N | ODBC | Windows 만 |
ado | B | 일반 ADO(특정 DB로 튜닝되지 않은 ADO). DSN 없이 연결 가능. 최적의 성능이 필요한 경우 OLEDB를 사용. 이 것은 모든 ADO 드라이버의 기본 크래스임. 연결전 $db->codePage를 설정할 수 있음. | ?는 DB에 의존 | ADO 또는 OLEDB | Windows 만 |
ado_access | B | ADO를 사용한 Microsoft Access/Jet. DSN 없이 연결 가능. 최적의 성능이 필요한 경우 OLEDB를 사용. | Y/N | ADO 또는 OLEDB | Windows 만 |
ado_mssql | B | ADO를 사용한 Microsoft SQL Server. DSN 없이 연결 가능. 최적의 성능이 필요한 경우 OLEDB를 사용. | Y/N | ADO 또는 OLEDB | Windows 만 |
db2 | A | DB2. 신뢰성있는 동작은 ODBC 드라이버를 사용해야 함. | Y/N | DB2 CLI/ODBC 인터페이스 | Unix와 Windows. Unix 설치 힌트. |
vfp | A | Microsoft Visual FoxPro. ODBC DSN을 생성해야 함. | Y/N | ODBC | Windows 만 |
fbsql | C | FrontBase. | Y | ? | Unix와 Windows |
ibase | B | Interbase 6 또는 그 이하. 몇몇 사용자의 보고에 따르면 $db->PConnect('localhost:c:/ibase/employee.gdb', "sysdba", "masterkey")를 사용해서 연결해야 함. 현재 Affected_Rows를 지원하지 않음. 연결 전에 $db->dialect, $db->buffers와 $db->charSet 설정할 수 있음. | Y/N | Interbase 클라이언트 | Unix와 Windows |
firebird | C | Interbase의 Firebird 버전. | Y/N | Interbase 클라이언트 | Unix와 Windows |
borland_ibase | C | Interbase 6.5 이상의 Borland 버전. 포크하는 방법이 다름. | Y/N | Interbase 클라이언트 | Unix와 Windows |
informix72 | C | SELECT FIRST를 지원하지 않는 Informix 7.3이전 버전의 Informix. | Y/N | Informix 클라이언트 | Unix와 Windows |
informix | C | 일반 informix 드라이버. | Y/N | Informix 클라이언트 | Unix와 Windows |
mssql | A | Microsoft SQL Server 7 이상. Microsoft SQL Server 2000 또한 잘 동작함. 주의: 이 드라이버는 날짜 변환에 문제가 있음. 예: PHP mssql 확장 모듈은 datetime에서 시간을 리턴하지 않음. | Y/N | Mssql 클라이언트 | Unix와 Windows. |
mssqlpo | A | 호환성있는 msssql 드라이버. 위의 mssql 드라이버와 동일하지만 '||'(연결 연산자)가 '+'로 바뀜. ||를 사용하는 다른 SQL 변종으로부터 스크립트를 포팅하는데 유용. | Y/N | Mssql 클라이언트 | Unix와 Windows. |
mysql | A | 트랙잭션을 지원하지 않는 MySQL. 연결하기 전에 $db->clientFlags 를 설정할 수 있음. | Y/N | MySQL 클라이언트 | Unix와 Windows |
mysqlt 또는 maxsql | A | 트랜잭션을 지원하는 MySQL. 최적의 성능을 위해 연결 연산자로 ||를 사용할 것을 권고. 이 것은 MySQL를 mysqld --ansi나 mysqld --sql-mode=PIPES_AS_CONCAT로 기동함으로서 사용할 수 있음 | Y/N | MySQL 클라이언트 | Unix와 Windows |
oci8 | A | Oracle 8/9. oracle보다 기능적으로 훨씬 우수함(예. Affected_Rows). Connect/PConnect전에 putenv('ORACLE_HOME=...')를 설정할 수 있음. 2가지 연결 방법 제공 - 서버 IP/서비스 이름: 2.31 이상 버전은 Oracle REF 커서 변수를 직접 지원함(ExecuteCursor를 보기 바람). | Y/N | Oracle 클라이언트 | Unix와 Windows |
oci805 | C | Oracle 8.0.5에대해 제한적인 Oracle 기능 지원. SelectLimit는 oci8나 oci8po에서처럼 효과적이지 못함. | Y/N | Oracle 클라이언트 | Unix와 Windows |
oci8po | A | 호환성 있는 Oracle 8/9드라이버. 이 드라이버는 oci8 드라이버와 거의 동일하지만 (a) Prepare()의 바인드 변수에 :bindvar 대신 ?를 사용하며, (b) 필드명에 소문자를 사용하는 것이 다름. 다른 데이타 베이스로 포팅하는 것이 중요한 경우 이 드라이버를 사용하는 것이 좋음. 그렇지않은 경우 보다 나은 성을 위해 oci8 드라이버를 사용하는 것이 바람직함. | Y/N | Oracle 클라이언트 | Unix와 Windows |
odbc | A | 일반 ODBC(특정 DB로 튜닝되지않은 ODBC). 접속을 위해 PConnect('DSN','user','pwd')를 사용. 이 드라이버는 모든 ODBC 드라이버의 기본 드라이버임.. | ?는 DB에따라 다름 | ODBC | Unix와 Windows. Unix 힌트. |
odbc_mssql | C | ODBC로 MSSQL에 연결할 때 사용 | Y/N | ODBC | Unix와 Windows. |
odbc_oracle | C | ODBC로 Oracle에 연결할 때 사용 | Y/N | ODBC | Unix와 Windows. |
oracle | C | 구형 Oracle 7 클라이언트 API로 구현. 보다 나은 성능을 위해 가능한 oci8 드라이버를 사용하기 바람. | Y/N | Oracle 클라이언트 | Unix와 Windows |
postgres | A | 일반 PostgreSQL 드라이버. 현재 postgres7 드라이버와 동일. | Y | PostgreSQL 클라이언트 | Unix와 Windows. |
postgres64 | A | 내부적으로 LIMIT를 지원하지않는 PostgreSQL 6.4 이하에서 사용. | Y | PostgreSQL 클라이언트 | Unix와 Windows. |
postgres7 | A | LIMIT와 버전 7 기능을 지원하는 PostgreSQL에서 사용. | Y | PostgreSQL 클라이언트 | Unix와 Windows. |
sapdb | C | SAP DB. 신뢰성있는 동작은 ODBC 드라이버를 사용해야 함. | Y/N | SAP ODBC 클라이언트 | ? |
sqlanywhere | C | Sybase SQL Anywhere. 신뢰성있는 동작은 ODBC 드라이버를 사용해야 함. | Y/N | SQL Anywhere ODBC 클라이언트 | ? |
sqlite | B | SQLite. PHP5에서만 테스트함. | Y | - | Unix와 Windows. |
sybase | C | Sybase. | Y/N | Sybase 클라이언트 | Unix와 Windows. |
"검사" 컬럼은 코드의 검사 상태와 사용 상태를 나타낸다.
A = 많은 사람에의해 여러번 검nf되었으며 많은 사람들이 사용하고 있음
B = 일부 사람들에의해 검사되었고 사용중이지만 몇몇 특징이 구현되지 않았을 수 있음
C = 사용자가 제공한 코드나 실험적인 드라이버. ADOdb 최신 버전의 모든 특징을 완전히 지원하지 못할 수 있음.
"RecordCount() 지원" 컬럼은 SELECT 문이 실행될 때 RecordCount()가 행수를 리턴하는지 -1을 리턴하는지를 의미한다. 만약 컬럼이 Y/N라면 RecordCount()는 전역변수 $ADODB_COUNTRECS가 참으로 설정(기본값)될 때 에뮬레이트된다. 대형 레코드셋의 경우 RecordCount() 에뮬레이션을 사용하지 않는 것이 좋다. 왜냐하면 대형 레코드셋을 캐쉬하기위해 많은 량의 메모리가 필요하기때문에다. 또한 에뮬레이션을 사용하는 경우 40-50%의 성능이 감소한다. PostgreSQL과 MySQL을 제외한 데부분의 DB에서 이 기능은 에뮬레이션으로 구현된다.
길잡이
예 1: Select 문
작업: Access Northwind DSN에 연결하고 각행의 첫 2개의 컬럼을 출력.
이 예에서 데이타베이스에대한 연결을 표현하는 ADOConnection 개체를 생성한다. 접속은 PConnect(영구 접속)로 초기화된다. 데이타베이스에 질의하기위해 ADOConnection.Execute() 함수를 호출한다. 이 함수는 fields[] 배열로 현재행에대한 커서를 지시하고 있는 ADORecordSet 개체를 리턴한다. 행에서 행으로 이동하기위해 MoveNext()를 사용한다.
NB: 이 예에서 사용되지않은 유용한 함수는 SelectLimit로 이 함수는 출력될 행의 수를 제한할 수 있다.
<?include('adodb.inc.php'); # ADOdb 공통 코드 읽음$conn = &ADONewConnection('access'); # 접속 생성$conn->PConnect('northwind'); # MS-Access, northwind DSN에 연결$recordSet = &$conn->Execute('select * from products');if (!$recordSet) print $conn->ErrorMsg();elsewhile (!$recordSet->EOF) { print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>'; $recordSet->MoveNext();}$recordSet->Close(); # 옵션$conn->Close(); # 옵션?>
리턴된 $recordSet은 $recordSet->fields 배열에 현재행을 저장하고 있다. 이 배열은 영에서 시작하며 컬럼 번호에의해 참조된다. 다음 행으로 이동하기위해 MoveNext() 함수를 사용한다. EOF 속성은 파일끝(End of File)에 도달하면 참으로 설정된다. Execute()에서 오류가 발생하면 레코드셋 대신 거짓이 리턴된다.
$recordSet->fields[]
배열은 PHP 데이타베이스 확장 모듈에의해 생성된다. 몇몇 데이타베이스 확장 모듈은 단지 숫자에의해서만 참조할 수 있고 필드 이름에의해서는 참조할 수 없는 배열을 리턴한다. 강제로 필드 이름에의해 참조(연관배열)하기위해 SetFetchMode 함수를 사용할 수 있다. 각각의 레코드셋은 Execute()나 SelectLimit()에의해 생성될때의 페치 모드에따라 저장, 사용된다.
$db->SetFetchMode(ADODB_FETCH_NUM); $rs1 = $db->Execute('select * from table'); $db->SetFetchMode(ADODB_FETCH_ASSOC); $rs2 = $db->Execute('select * from table'); print_r($rs1->fields); # array([0]=>'v0',[1] =>'v1')를 출력 print_r($rs2->fields); # array(['col1']=>'v0',['col2'] =>'v1')를 출력
Select 문에의해 생성된 행 수를 얻기위해 $recordSet->RecordCount()를 사용할 수 있다. 주의: 리턴된 행의 수를 결정할 수 없는 경우 -1이 리턴된다.
예 2: 필드 개체로 검색 하기
테이블을 검색하고 첫 두 컬럼을 출력한다. 만약 두번째 컬럼이 날짜 또는 타임스탬프라면 US 날짜 형식으로 변환된다.
<?include('adodb.inc.php'); # ADOdb 공통 코드 읽기$conn = &ADONewConnection('access'); # 접속 생성$conn->PConnect('northwind'); # MS-Access, northwind dsn에 연결$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');if (!$recordSet) print $conn->ErrorMsg();elsewhile (!$recordSet->EOF) { $fld = $recordSet->FetchField(1); $type = $recordSet->MetaType($fld->type); if ( $type == 'D' || $type == 'T') print $recordSet->fields[0].' '. $recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>'; else print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>'; $recordSet->MoveNext();}$recordSet->Close(); # 옵션$conn->Close(); # 옵션?>
이 예에서 두번째 컬럼의 필드형을 FetchField()를 사용해서 검사한다. 이 함수는 적어도 3개 필드를 갖는 개체를 리턴한다.
- name: 컬럼명
- type: DB 고유의 필드형
- max_length: 필드 최대 길이. MySQL과같은 몇몇 DB는 필드의 최대 길이를 올바르게 리턴하지 않는다. 이 경우 max_length는 -1로 설정된다.
그리고 DB 고유의 필드형을 일반형으로 변환하기위해 MetaType()를 사용한다. 현재 다음과 같은 일반형이 정의되어있다:
- C: 문자 필드. a <input type="text">를 사용하는 경우.
- X: 텍스트, <textarea>와같은 텍스트 필드를 사용하는 경우
- B: BLOB(Binary Large Objects). 일반적으로 이미지.
- D: 날짜 필드
- T: 타임스탬프 필드
- L: 논리 필드(부울 또는 비트 필드)
- I: 정수 필드
- N: 숫자 필드. 자동 증가, 숫자, 부동 소숫점, 실수와 정수를 포함
- R: 시리얼 필드. 시리얼, 자동 증가 정수. 이 필드는 특정 DB에서만 동작한다.
metatype이 날짜나 타임스탬프라면 UserDate()를 사용해서 PHP, SQL 형식의 날짜를 사용자가 정의한 형식으로 변환한다. MetaType()은 SQL로 Insert나 Update를 하기전 데이타를 검증할 때 사용할 수 있다.
예 3: 삽입
날짜와 문자열을 포함하는 행을 Orders 테이블에 삽입한다. 이때 삽입하는 문자열에 John's와같이 작은 따옴표가 포함된 경우 DB에 삽입할 수 있도록 인용한다.
<?include('adodb.inc.php'); # ADOdb 공통 코드 읽기$conn = &ADONewConnection('access'); # 접속 생성$conn->PConnect('northwind'); # MS-Access, northwind DSN에 연결$shipto = $conn->qstr("John's Old Shoppe");$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";if ($conn->Execute($sql) === false) { print 'error inserting: '.$conn->ErrorMsg().'<BR>';}?>
이 예에서 ADOdb의 보강된 날짜 및 인용 처리 능력을 알 수 있다. Unix 타임스탬프(일반적으로 Long Integer인)는 DBDate()를 사용해서 Access에 적당한 형식으로 변환되고, 올바른 Escape 문자가 John's Old Shoppe를 인용하는데 사용된다. 즉, PHP의 기본값인 John's Old Shoppe가 아니라 qstr()를 사용해서 John''s Old Shoppe로 인용된다.
Execute 문의 오류 처리에 주의하기 바란다. 만약 오류가 발생하면 Execute() 는 거짓을 리턴한다. 마지막 오류에대한 오류 메시지는 ErrorMsg()로 출력된다. 주의: 오류 메시지를 저장하기위해 php_track_errors를 사용할 수 있어야 한다.
예 4: 디버깅
<?include('adodb.inc.php'); # ADOdb의 공통 코드 읽기$conn = &ADONewConnection('access'); # 접속 생성$conn->PConnect('northwind'); # MS-Access, northwind DSN에 연결$shipto = $conn->qstr("John's Old Shoppe");$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";$conn->debug = true;if ($conn->Execute($sql) === false) print 'error inserting';?>
위의 예에서는 debug = true로 설정함으로서 디버깅 모드로 설정했다. 디버깅 모드를 설정하면 SQL 문을 실행하기전에 SQL 문장이 출력되며, 임의의 오류 메시지 역시 함께 출력된다. 디버깅 모드를 사용할 때에는 ErrorMsg() 함수를 호출할 필요가없다. 레코드셋을 출력하기위해서는 rs2html() 의 예를 보기 바란다.
또한 사용자 오류 처리를 보기바란다.
예 5: MySQL과 메뉴
MySQL agora 데이타베이스에 연결하고 SQL 문을 실행한 결과로부터 <select> 메뉴를 생성한다. 화면에 출력되는 <option> 값은 첫번째 컬럼이 사용되며 서버로 전송되는 값은 두번째 컬럼이 사용된다.
<?include('adodb.inc.php'); # ADOdb 공통 코드 읽기$conn = &ADONewConnection('mysql'); # 접속 생성$conn->PConnect('localhost','userid','','agora');# MySQL, agora 데이타 베이스에 연결$sql = 'select CustomerName, CustomerID from customers';$rs = $conn->Execute($sql);print $rs->GetMenu('GetCust','Mary Rosli');?>
이 예는 GetCust(Select 태그의 이름)라는 메뉴를 정의하고, 기본값으로 'Mary Rosli'를 지정한 예이다. GetMenu()를 참고하기바란다. ADOdb는 레코드셋을 배열로서 리턴하는 함수, GetArray()를 가지고 있다. 또한 첫번째 컬럼을 키로하는 연관배열를 리턴하는 GetAssoc()도 있다.
예 6: 동시에 2개 DB에 접속하기
<?include('adodb.inc.php'); # ADOdb 공통 코드$conn1 = &ADONewConnection('mysql'); # mysql 접속 생성$conn2 = &ADONewConnection('oracle'); # oracle 접속 생성$conn1->PConnect($server, $userid, $password, $database);$conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);$conn1->Execute('insert ...');$conn2->Execute('update ...');?>
예 7: Update와 Insert SQL문 생성
ADOdb 1.31 이상은 두개의 새로운 레코드셋 함수, GetUpdateSQL( )과 GetInsertSQL( )을 지원한다. 이 함수를 사용하면 "SELECT * FROM table query WHERE..."를 실행하고 $rs->fields 사본을 생성, 필드를 변경하고 자동적으로 테이블을 삽입, 갱신할 수 있는 SQL 문을 생성할 수 있다.다음 예는 (ID, FirstName, LastName, Created) 필드를 갖는 테이블에 접근할 때 이 함수를 어떻게 사용할 수 있는지를 보이고 있다.
이 함수를 호출하기전 테이블에대해 SELECT 문을 수행함으로서 레코드셋을 초기화할 필요가 있다. 다음 코드는 Jonathan Younger(jyounger#unilab.com)의 생각이다.
<?#==============================================# 간단한 GetUpdateSQL()과 GetInsertSQL() 코드#==============================================include('adodb.inc.php');include('tohtml.inc.php');#==========================# INSERT 테스트$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; # 빈 레코드를 검색$conn = &ADONewConnection("mysql"); # 접속 생성$conn->debug=1;$conn->PConnect("localhost", "admin", "", "test"); # MySQL, testdb에 연결$rs = $conn->Execute($sql); # 질의를 수행하고 빈 레코드셋을 가져옴$record = array(); # 레코드 데이타를 저장할 배열을 초기화# 삽입할 레코드의 필드와 값을 설정# 주의: 필드명은 대소문자를 구분함$record["firstname"] = "Bob";$record["lastNamE"] = "Smith";$record["creaTed"] = time();# 빈 레코드셋과 삽입할 데이타를 포함하는 배열을 GetInsertSQL 함수에 전달# 이 함수는 데이타를 처리하고 완전히 형식화된 INSERT SQL 문을 리턴함$insertSQL = $conn->GetInsertSQL($rs, $record);$conn->Execute($insertSQL); # 데이타 베이스에 삽입#==========================# UPDATE 테스트$sql = "SELECT * FROM ADOXYZ WHERE id = 1"; # 갱신할 레코드를 검색$rs = $conn->Execute($sql); # 질의를 수행하고 업데이트할 레코드를 가져옴$record = array(); # 레코드의 데이타를 저장할 배열을 초기화# 갱신할 레코드의 필드와 값을 설정# 주의: 필드명은 대소문자를 구분함$record["firstname"] = "Caroline";$record["LasTnAme"] = "Smith"; # Caroline의 성을 Miranda에서 Smith로 갱신# 하나의 레코드셋과 갱신할 데이타를 포함하는 배열을 GetUpdateSQL 함수에 전달# 이 함수는 데이타를 처리하고 완전히 형식화된 UPDATE SQL 문을 리턴함# 올바른 WHERE 문 역시 포함됨# 테이타가 갱신되지않는 경우 어떠한 레코드셋도 리턴되지않음$updateSQL = $conn->GetUpdateSQL($rs, $record);$conn->Execute($updateSQL); # DB의 레코드를 갱신$conn->Close();?>
예 8: 페이지 이동 구현
다음은 아주 간단한 레코드셋 페이지 이동기를 만든다. 따라서 레코드셋을 페이지 단위로 이동시킬 수 있다.
include_once('../adodb.inc.php');include_once('../adodb-pager.inc.php');session_start();$db = NewADOConnection('mysql');$db->Connect('localhost','root','','xphplens');$sql = "select * from adoxyz ";$pager = new ADODB_Pager($db,$sql);$pager->Render($rows_per_page=5);
이 함수는 다음 표처럼 기본 레코드 페이저를 생성한다:
|< << >> >| | ||||||||||||||||||||||||
| ||||||||||||||||||||||||
Page 8/10 |
한번에 출력할 행의 수는 Render($rows) 메소드에의해 변경할 수 있다. 만약 Render()에 인자를 전달하지 않는 경우 ADODB_Pager는 기본값인 페이지당 10 행으로 설정된다.
필드명은 SQL을 변경함으로 바꿀 수 있다(대부분의 DB에서 지원):
$sql = 'select id as "ID", firstname as "First Name", lastname as "Last Name", created as "Date Created"
from adoxyz';
위의 코드는 이 배포본에 포함된 adodb/tests/testpaging.php와 adodb/adodb-pager.inc.php에서 찾을 수 있다. ADODB_Pager는 프로그래머에의해 변경될 수 있다. 따라서 텍스트 링크는 이미지로 변경할 수 있으며, 배경색 역시 원하는 색상으로 변경할 수 있다.
$pager->htmlSpecialChars = false를 설정함으로서 HTML도 출력할 수 있다.
여기서 사용된 몇몇 코드는 Iván Oliva과 Cornel G 덕택이다.
예 9: CSV와 Tab 구분 형식으로 내보내기
ADOdb는 CSV(Comma-Separated-Value)와 탭 구분 형식으로 출력할 수 있는 보조 함수를 제공한다.:
include_once('/path/to/adodb/toexport.inc.php');include_once('/path/to/adodb/adodb.inc.php');$db = &NewADOConnection('mysql');$db->Connect($server, $userid, $password, $database);$rs = $db->Execute('select fname as "First Name", surname as "Surname" from table');print "<pre>";print rs2csv($rs); # CSV 형식의 문자열 리턴print '<hr>';
$rs->MoveFirst(); # 주의: 몇몇 DB는 MoveFirst를 지원하지 않음print rs2tab($rs,false); # 탭 구분 형식의 문자열 리턴 # false로 설정하면 첫행의 필드명을 출력하지 않음print '<hr>';$rs->MoveFirst();rs2tabout($rs); # 표준 출력으로 직접 출력함(rs2csvout 함수도 있음)print "</pre>";$rs->MoveFirst();$fp = fopen($path, "w");if ($fp) { rs2csvfile($rs, $fp); # 파일로 저장(rs2tabfile 함수도 있음) fclose($fp);}
캐리지 리턴과 개행은 공백으로 변환된다. 필드명은 첫행에 출력된다. 필드 구분자를 포함한 문자열을 큰따옴표로 인용된다. 큰 따옴표는 큰따옴표로 다시 인용된다. 이러한 기능때문에 엑셀로 가져오기/내보내기를 안전하게 할 수 있다.
위의 모든 함수에서 마지막 매개변수, $addtitles는 옵션이다. $addtitles는 기본적으로 참으로 설정된다. 거짓으로 설정되면 첫행에 필드명을 출력하지않는다.
예 10: 레코드셋 필터
때때로 레코드셋을 사용하기전에 레코드셋의 모든 행을 미리 처리할 필요가 있다. 예를들어 레코드셋의 모든 문자열에대해 ucwords를 실행할 수 있다.
include_once('adodb/rsfilter.inc.php');include_once('adodb/adodb.inc.php');// 레코드셋의 모든 항목에대해 ucwords()를 호출function do_ucwords(&$arr,$rs){ foreach($arr as $k => $v) { $arr[$k] = ucwords($v); }}$db = NewADOConnection('mysql');$db->PConnect('server','user','pwd','db');$rs = $db->Execute('select ... from table');$rs = RSFilter($rs,'do_ucwords');
RSFilter 함수는 매개변수로 레코드셋과 필터 함수의 이름을 취한다. 이 함수는 레코드셋을 필터함수로 처리한 후, 첫행으로 이동된 레코드셋을 리턴한다. 필터 함수는 매개변수로 현재 행을 지시하는 배열과 레코드셋 개체를 취한다. 호환성을 위해 원래의 레코드셋 개체를 사용하지않는 것이 좋다.
예 11: 지능적 트랜잭션
ADOdb의 예전 버전에서 사용한 트랜잭션은 다음과 같다.$conn->BeginTrans();$ok = $conn->Execute($sql);if ($ok) $ok = $conn->Execute($sql2);if (!$ok) $conn->RollbackTrans();else $conn->CommitTrans();이 것은 대형 프로젝트의 경우 아주 복잡하다. 왜냐하면 오류 상태를 계속 추적해야 하기때문이다. 지능적 트랜잭션은 훨씬 간단하다. StartTrans()를 호출함으로서 트랜잭션을 시작한다:
$conn->StartTrans();$conn->Execute($sql);$conn->Execute($Sql2);$conn->CompleteTrans();CompleteTrans()은 SQL 오류의 발생 여부를 검출하고 오류 발생 여부에따라 적당히 롤백/커밋한다. 오류가 발생하지않아도 강제로 롤백하려면 FailTrans()를 사용한다. 주의: 롤백은 FailTrans()에서가 아니라 CompleteTrans()에서 수행된다.
$conn->StartTrans();$conn->Execute($sql);if (!CheckRecords()) $conn->FailTrans();$conn->Execute($Sql2);$conn->CompleteTrans();
HasFailedTrans()를 사용해서 트랙잭션의 실패여부를 검사할 수 있다. HasFailedTrans()은 FailTrans()가 호출된 경우나 SQL 실행에 오류가 있는 경우 참을 리턴한다.
마지막으로 StartTrans/CompleteTrans는 중첩될 수 있지만 최외곽 블럭만 실행된다. 반대로 BeginTrans/CommitTrans/RollbackTrans는 중첩될 수 없다.
$conn->StartTrans();$conn->Execute($sql); $conn->StartTrans(); # 무시 if (!CheckRecords()) $conn->FailTrans(); $conn->CompleteTrans(); # 무시$conn->Execute($Sql2);$conn->CompleteTrans();
주의: Savepoints는 현재 지원되지 않는다.
사용자 오류처리와 PEAR_Error
다버깅 방법으로 예전부터 제공되던 $con->debug = true와는 달리 ADOdb 1.5 이상은 또 다른 두개의 ADOdb의 사용자 오류 처리기를 제공한다.ADOdb는 필요시 변경할 수 있는 두개의 사용자 오류 처리기를 제공한다. 첫번째 오류 처리기는 adodb-errorhandler.inc.php에 존재한다. 이 오류처리기는 출력될 오류 메시지 유형을 제어하기위해 표준 PHP 함수, error_reporting를 사용하며, PHP의 기본 오류 처리기를 호출하는 trigger_error를 사용한다.
위의 파일을 Include하면 다음과 같은 상황에서 trigger_error($errorstring,E_USER_ERROR)가 호출된다.
(a) Connect() 또는 PConnect() 실패할 때
(b) Execute() 나 SelectLimit()와 같이 SQL 문을 실행하는 함수가 오류를 발생할 때.
(c) GenID()가 무한 루프를 돌때.
$errorstring은 ADOdb에의해 생성되며, 아래에 생성된 error.log 데이타와 비슷한 정보를 포함하고 있다. adodb-errorhandler.inc.php 파일은 ADOConnection 개체를 생성하기 전에 Include 문을 이용해서 포함시켜야 한다.
만약 error_reporting(0)를 정의하면 어떠한 오류도 오류 처리기로 전달되지않는다. error_reporting(E_ALL)을 설정하면 모든 오류가 오류 처리기로 전달된다. 오류의 출력을 제어하기위해 ini_set("display_errors", "0" 또는 "1")를 사용할 필요가 있다.
<?phperror_reporting(E_ALL); # 트리거된 모든 오류를 오류 처리기에 전달include('adodb-errorhandler.inc.php');include('adodb.inc.php');include('tohtml.inc.php');$c = NewADOConnection('mysql');$c->PConnect('localhost','root','','northwind');$rs=$c->Execute('select * from productsz'); #productsz 테이블 이름이 잘못됨if ($rs) $rs2html($rs);?>
오류 메시지를 파일에 기록, 추적하길 원한다면 ADODB_ERROR_LOG_TYPE과 ADODB_ERROR_LOG_DEST 상수를 정의함으로서 오류 메시지를 기록, 추적할 수 있다. ADODB_ERROR_LOG_TYPE은 오류 메시지 기록 유형(PHP 매뉴얼의 error_log를 보기 바란다)을 나타낸다. 다음 예에서는 3으로 설정했으며, 이 것은 ADODB_ERROR_LOG_DEST 상수에의해 정의된 파일로 기록하는 것을 의미한다.
<?phperror_reporting(E_ALL); # 모든 오류를 보고ini_set("display_errors", "0"); # 오류를 화면에 출력하지 않음define('ADODB_ERROR_LOG_TYPE',3);define('ADODB_ERROR_LOG_DEST','C:/errors.log');include('adodb-errorhandler.inc.php');include('adodb.inc.php');include('tohtml.inc.php');$c = NewADOConnection('mysql');$c->PConnect('localhost','root','','northwind');$rs=$c->Execute('select * from productsz'); ## productsz 테이블 이름이 잘못됨if ($rs) $rs2html($rs);?>다음 메시지가 error.log 파일에 기록될 것이다.
(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in EXECUTE("select * from productsz")두번째 오류 처리기는 adodb-errorpear.inc.php 파일에 존재한다. 이 것은 오류를 발생한 개체로부터 유도된 PEAR_Error를 생성한다. 생성된 마지막 PEAR_Error 개체는 ADODB_Pear_Error()를 사용해서 복원할 수 있다.
<?phpinclude('adodb-errorpear.inc.php');include('adodb.inc.php');include('tohtml.inc.php');$c = NewADOConnection('mysql');$c->PConnect('localhost','root','','northwind');$rs=$c->Execute('select * from productsz'); #productsz 테이블 이름이 잘못됨;if ($rs) $rs2html($rs);else { $e = ADODB_Pear_Error(); echo '<p>',$e->message,'</p>';}?>
adodb-errorpear.inc.php 파일을 Include 하기전에 상수 ADODB_PEAR_ERROR_CLASS를 정의함으로서 크래스로부터 발생한 PEAR_Error를 추적할 수 있다. 쉽게 디버깅하기 위해 PHP 스크립트의 시작 부분에 기본 오류 처리기를 PEAR_ERROR_DIE로 설정할 수 있다. PEAR_ERROR_DIE를 사용함으로서 오류 메시지를 출력하고, 스크립트의 실행을 중지할 수 있다:
include('PEAR.php');PEAR::setErrorHandling('PEAR_ERROR_DIE');
오류가 발생할 때 PEAR_Error 개체가 명시적으로 리턴되지않는다는 것에 주의하기 바란다. 대신에 거짓이 리턴되며, 마지막 오류를 얻기위해서는 ADODB_Pear_Error()를 호출하거나 PEAR_ERROR_DIE 기법을 사용해야 한다.
오류 메시지
오류 메시지는 정적 메소드, ADOConnnection::outp($msg,$newline=true)를 사용해서 출력된다. 기본적으로 이 메소드는 메시지를 클라이언트로 전송한다. 그러나 필요한 경우 오류 기록할 수 있다.
데이타 소스명
PEAR 형식의 DSN를 사용한 접속을 지원한다. 이때 DSN은 다음과 같은 형식의 접속 문자열이 된다:
$dsn = "$driver://$username:$password@$hostname/$databasename";
DNS을 정적 크래스 함수 DB::Connect에 전달한다. 예:
include_once('../adodb/adodb-pear.inc.php'); $username = 'root'; $password = ''; $hostname = 'localhost'; $databasename = 'xphplens'; $driver = 'mysql'; $dsn = "$driver://$username:$password@$hostname/$databasename";
$db = DB::Connect($dsn);
$rs = $db->Execute('select firstname,lastname from adoxyz'); $cnt = 0; while ($arr = $rs->FetchRow()) { print_r($arr); print "<br>"; }
이 것은 PEAR가 설치되어 있어야 하며 php.ini의 기본 Include 경로에 설치된 PEAR가 포함되어 있어야 한다.
레코드셋의 캐싱
ADOdb는 CacheExecute( ), CachePageExecute( )와 CacheSelectLimit( )를 사용해서 레코드셋의 캐쉬를 지원한다. 이 것은 캐쉬되지않는 함수와 유사하지만 새로운 매개변수, $secs2cache를 취한다는 차이점이 있다.
예:
include('adodb.inc.php'); # ADOdb의 공통 코드 읽기$ADODB_CACHE_DIR = '/usr/ADODB_cache';$conn = &ADONewConnection('mysql'); # 접속 생성$conn->PConnect('localhost','userid','','agora');# MySQL, agora DB에 연결$sql = 'select CustomerName, CustomerID from customers';$rs = $conn->CacheExecute(15,$sql);
첫번째 매개변수는 쿼리를 캐쉬할 시간으로 단위는 초이다. 이 쿼리를 연속해서 호출하면 $ADODB_CACHE_DIR에 저장된 레코드셋(캐쉬된)이 사용된다. 강제로 캐쉬를 비우고 쿼리를 실행하기위해 CacheExecute()의 첫번째 매개변수를 0으로 설정하고 호출할 수 있다. 또 다른 방법으로 CacheFlush($sql)를 호출할 수 있다.
$ADODB_CACHE_DIR를 사용하는 경우 보안을 위해 php.ini의 register_globals=off를 설정할 것을 권고한다.
ADOdb 1.80 이상의 경우 CacheSelectLimit()와 CacheExecute()에서 secs2cache 매개변수는 옵션이다. 만약 이 값을 설정하지 않으면 $connection->cacheSecs 매개변수를 사용한다(기본값은 60분이다).
$conn->Connect(...); $conn->cacheSecs = 3600*24; # 24시간동안 캐쉬 $rs = $conn->CacheExecute('select * from table');
magic_quotes_runtime이 off 이어야 한다는 것에 주의하기 바란다. 자세히. 피벗 테이블
ADOdb 2.30 이상은 교차 테이블로 알려진 피벗 테이블을 생성하는 SQL 문을 생성할 수 있다. 보다 자세한 설명은 DevShed의 교차 테이블 길잡이를 읽기 바란다. 데이타 베이스가 CASE-WHEN 문을 지원하는 것으로 가정했다.
이 예에서 Microsoft의 Northwind DB를 사용할 것이다. 이 DB는 제품 테이블을 가지고 있고 이 테이블을 공급자대 제품 분류로 분석하길 원한다고 하자. 각행에 공급자를 두고 분류상에 피벗을 두는 것으로 하겠다. 따라서 좌측의 테이블로부터 우측의 피벗 테이블로 생성된다:
| --> |
|
다음 코드는 교차 테이블을 생성하는데 사용될 SQL을 생성할 것이다:
# 메일 "products" 테이블에 질의# 행을 CompanyName으로 설정# 컬럼을 Categories의 값으로 설정# "categories"과 "suppliers"를 조회하기위하 링크에대한 Join을 정의# include "adodb/pivottable.php"; $sql = PivotTableSQL( $gDB, # adodb 접속 'products p ,categories c ,suppliers s', # 테이블 'CompanyName', # 행(다중 필드도 허용됨) 'CategoryName', # 피벗할 컬럼 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where);
이 것은 다음과 같은 SQL을 생성하게 된다:
SELECT CompanyName,
SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
SUM(1) as Total
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY CompanyName
범위를 사용함으로서 숫자 컬럼과 합계를 피벗할 수 있다. 이 코드는 ADOdb 2.41에서 개발되었으며 하위호환성은 없다. 두번째 예는 다음과 같다:
$sql = PivotTableSQL( $gDB, # adodb 접속 'products p ,categories c ,suppliers s', # 테이블 'CompanyName', # 행(다중 필드도 허용됨) array( # 컴럼 범위 ' 0 ' => 'UnitsInStock <= 0', "1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5', "6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10', "11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15', "16+" => '15 < UnitsInStock' ), ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where 'UnitsInStock', # 필드 합 'Sum ' # 합계 라벨의 접두어);
이 것은 다음과 같은 SQL을 생성한다:
SELECT CompanyName,
SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
SUM(UnitsInStock) AS "Sum UnitsInStock",
SUM(1) as Total,
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
GROUP BY CompanyName
크래스 참조
[ ]로 표시된 매개변수는 옵션이다.
전역 변수
$ADODB_COUNTRECS
데이타베이스 드라이버 API가 리턴되는 레코드의 수(SELECT 문)를 계산하는 기능을 지원하지 않는다면 RecordCount() 함수는 전역변수 $ADODB_COUNTRECS가 참으로 설정(기본값)되었을 때 에뮬레이션을 수행한다. 에뮬레이션은 레코드를 버펑링함으로서 수행된다. 따라서 레코드셋이 큰 경우 많은 양의 메모리가 사용될 수 있다. 최적의 성능을 위해 이 변수를 거짓으로 설정하기 바란다. 이 변수는 질의가 수행될 때 마다 검사된다. 따라서 레코셋의 카운트를 선택적으로 사용할 수 있다.
$ADODB_CACHE_DIR
레코드셋 캐쉬를 사용한다면, 이 값은 레코드셋이 저장될 디렉토리이다. 이 특징을 사용한다면 보안상 php.ini에서 register_globals=off로 설정할 것을 권고한다.
Unix와 아파치를 사용한다면 다음처럼 캐쉬 디렉토리의 권한을 모든 사람이 접근할 수 있도록 변경할 필요가 있다:
chown -R apache /path/to/adodb/cache
chgrp -R apache /path/to/adodb/cache
$ADODB_ANSI_PADDING_OFF
올바른 trim CHAR 필드(ibase/firebird의 경우 VARCHAR)를 결정한다. trim시 참으로 설정한다. 기본값은 거짓이다. 현재 oci8pro, ibase와 firebird 드라이버에서 동작한다. ADOdb 4.01에서 추가 되었다.
$ADODB_LANG
MetaErrorMsg()에서 사용되는 언어를 결정한다. 기본값은 'en(영어)'이다. 지원되는 언어를 알기위해서는 adodb/lang/adodb-$lang.inc.php 파일을 찾아보기 바란다. 여기서 $lang는 지원되는 언어이다.
$ADODB_FETCH_MODE
이 값은 레코드셋을 어떤 종류의 배열을 사용해서 복원할 것인지를 결정하는 전역변수이다. 레코드셋은 생성(예. Execute( ) 또는 SelectLimit( ))시 이 값에따라 저장된다. 이어서 $ADODB_FETCH_MODE를 변경해도 기존의 레코드셋에는 영향을 주지못하며, 오로지 새로 생성된 레코드셋에만 영향을 미친다.
다음 상수가 정의되었다:
define('ADODB_FETCH_DEFAULT',0);
define('ADODB_FETCH_NUM',1);
define('ADODB_FETCH_ASSOC',2);
define('ADODB_FETCH_BOTH',3);
예:
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $rs1 = $db->Execute('select * from table'); $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $rs2 = $db->Execute('select * from table'); print_r($rs1->fields); # array([0]=>'v0',[1] =>'v1')로 출력 print_r($rs2->fields); # array(['col1']=>'v0',['col2'] =>'v1')로 출력
위의 예에서 알수 있는 것처럼 레코드셋은 Execute()에의해 생성될 때 설정된 $ADODB_FETCH_MODE에따라 서로 다른 모드로 저장/사용될 수 있다.
페치 모드가 미리 정의되지 않으면 페치 모드는 ADODB_FETCH_DEFAULT로 설정된다. 기본 모드의 동작은 드라이버에따라 다르며 ADODB_FETCH_DEFAULT에 의존하지 않는다. 스크립트 호환성을 위해 ADODB_FETCH_NUM이나 ADODB_FETCH_ASSOC를 고수할 것을 권고한다. 많은 드라이버는 ADODB_FETCH_BOTH를 지원하지 않는다.
SetFetchMode 함수
몇몇 프로그래머는 보다 개체 지향적인 방법을 사용하길 좋아한다. 페치 모드 역시 개체 함수, SetFetchMode에의해 설정될 수 있다. 일단 이 함수가 접속 개체에대해 호출되면 접속 개체는 전역변수 $ADODB_FETCH_MODE를 무시하고 내부의 fetchMode 속성을 참조하기된다.
$db->SetFetchMode(ADODB_FETCH_NUM); $rs1 = $db->Execute('select * from table'); $db->SetFetchMode(ADODB_FETCH_ASSOC); $rs2 = $db->Execute('select * from table'); print_r($rs1->fields); # array([0]=>'v0',[1] =>'v1')를 출력 print_r($rs2->fields); # array(['col1']=>'v0',['col2'] =>'v1')를 출력
이전 패치 모드를 복원하기 위해 $db->fetchMode 속성을 검사하거나 SetFetchMode( )의 리턴값을 사용할 수 있다.
서로 다르게 동작하는 임의의 드라이버에서 연관배열의 대소문자를 제어할 수 있다. sybase, oci8po, mssql, odbc, ibase 드라이버와 이들로부터 유도된 모든 드라이버는 기본적으로 키(필드명)가 소문자인 레코드셋을 생성한다. ADODB_ASSOC_CASE 상수를 사용함으로서 이 키의 대소문자를 변경할 수 있다. 다음은 가능한 세가지 값이다:
0 = 소문자 필드명. $rs->fields['orderid']
1 = 대문자 필드명. $rs->fields['ORDERID']
2 = DB 고유의 필드명. $rs->fields['OrderID'] -- ADOdb 2.90 이후 이 값이 기본임
이 상수를 사용하기위해 adodb.inc.php를 Include하기 전에 먼저 선언해야 한다.
define('ADODB_ASSOC_CASE', 2); # ADODB_FETCH_ASSOC에 DB 고유의 필드명 사용
include('adodb.inc.php');
ADOConnection
데이타베이스 연결, SQL 문 실행, 문자열 연결과 날짜 형식처럼 SQL 문을 일반 형식으로 변환하는 유틸리티 함수 집합을 가진 개체.
ADOConnection 필드
databaseType: 연결하려는 DB 시스템의 이름. 예. odbc, mssql, mysql.
dataProvider: DB 접속에 사용되는 기초 메카니즘. 보통 native로 설정됨. 예외: odbc나 ado
host: 연결할 서버 이름이나 데이타 소스명(DSN).
database: 연결할 데이타베이스의 이름. ado가 사용되면 ado 데이타 제공자를 유지한다.
user: 연결할 데이타베이스의 로그인 ID. 암호는 보안상 저장되지않는다.
raiseErrorFn: 이것으로 오류 처리 함수를 정의할 수 있다. 예는 adodb-errorhandler.inc.php를 보기바란다.
debug: 디버그 모드를 원하는 경우 true로 설정한다.
concat_operator: 보통 '+'나 '||'로 설정. SQL에서 문자를 연결하는 사용되는 연산자. Concat 함수에의해 사용됨.
fmtDate: 데이타베이스에 날짜를 전송할 때 DBDate에의해 사용되는 형식. Microsoft Access의 경우 '#Y-m-d#'이며 Mysql의 경우 ''Y-m-d''이다.
fmtTimeStamp: 데이타베이스에 타임스탬프를 전송할 때 DBTimeStamp에의해 사용되는 형식.
true: 참을 표현하는 사용되는 값. 예. Foxpro의 경우 '.T.', Microsoft SQL의 경우 '1'.
false: 거짓을 표현하는데 사용되는 값. 예. Foxpro의 경우 '.F.', Microsoft SQL의 경우'0'.
replaceQuote: 인용부호를 이스케이프하는데 사용되는 문자. 예. Microsoft SQL의 경우 큰따옴표, 작은 따옴표, MySQL의 경우 역슬래쉬-작은따옴표. qstr에의해 사용됨.
autoCommit: 자동 커밋을 사용할 것인지를 지시함. 기본값은 참.
charSet: 사용되는 기본 문자집합을 설정. 현재 interbase만 지원.
dialect: 사용되는 기본 SQL Dialect 설정. 현재 interbase만 지원.
metaTablesSQL: 등록된 테이블의 목록을 리턴하는 SQL문. 예. MySQL의 경우 SHOW TABLES.
genID: 데이타베이스에서 지원되는 경우 GenID()에의해 생성된 가장 최신의 ID.
cacheSecs: CacheExecute() 이나 CacheSelectLimit()을 $secs2cache 매개변수없이 실행한 경우 레코드셋을 캐쉬하는 시간(단위 초).
sysDate: 현재 날짜를 가져오기위해 호출되는 데이타베이스 함수(문자열). 삽입, 갱신시 유용.
sysTimeStamp: 현재의 timestamp/datetime 값을 가져올때 호출되는 데이타베이스 함수(문자열).
leftOuter: 알려진 경우, Left Outter Join에대한 연산자를 가지고 있는 문자열. 그렇지 않으면 거짓으로 설정됨.
rightOuter: 알려진 경우, Right Outter Join에대한 연산자를 가지고 있는 문자열. 그렇지 않은 경우 거짓으로 설정됨.
ansiOuter: 부울. ANSI 형식의 Outter Join이 허용되는 경우 참. 예: select * from table1 left join table2 on p1=p2.
connectSID: oci8 드라이버에서 접속시 $database 매개변수를 SID로 처리할 것인지 아닌지를 지시하는 부울값. Oracle 8.0.5 이하의 버전에서 유용.
autoRollback: 이 값이 참으로 설정되면 PConnect( )를 이용한 영구 접속은 자동 롤백된다. 기본값은 거짓.
ADOConnection 주 함수
ADOConnection( )
생성자. 직접 호출할 수 없다. ADONewConnection( )을 사용한다.
Connect($host,[$user],[$password],[$database])
데이타 소스나 서버($host)에 사용자 ID($user)와 암호($password)로 일시 접속한다. 서버가 다중 데이타베이스를 지원하는 경우 $database로 데이타베이스에 접속할 수 있다.
접속 성공 여부에따라 참/거짓을 리턴한다.
ADO 주의: OLEDB가 아니라 Microsoft ADO를 사용하는 경우 사용중인 OLEDB 데이타 제공자로 $database 매개변수를 설정할 수 있다.
PostgreSQL: 데이타베이스에 접속하는 또 다른 방법은 첫번째 매개변수 $host에 표준 PostgreSQL 접속 문자열을 지정하는 것이다. 이 경우 다른 매개변수는 무시된다.
Oracle과 Oci8의 경우 두가지 접속방법이 제공된다. 첫번째로 tnsnames.ora(또는 ONAMES나 HOSTNAMES)에 정의된 TNS 명을 사용하는 것이다. $database 필드에 TNS 명을 두고 $host 필드를 거짓으로 설정한다. 또다른 방법은 $host에 서버를 설정하고, $database에 데이타베이스 SID를 설정한다. 이 방법을 사용하면 tsnnames.ora를 우회하게된다.
예:
# tnsnames.ora/ONAMES/HOSTNAMES의 $oraname $conn->Connect(false, 'scott', 'tiger', $oraname); $conn->Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # tnsnames.ora를 우회함
php.weblogs.com/ADOdb와 이 배포본에 포함된 testdatabases.inc.php에 데이타베이스에 접속하는 많은 예가 있다.
PConnect($host,[$user],[$password],[$database])
데이타 소스나 서버($host)에 사용자 ID($user)와 암호($password)로 영구 접속한다. 서버가 다중 데이타베이스를 지원하는 경우 $database로 데이타베이스에 접속할 수 있다.
PHP 매뉴얼에서 언급한 것처럼 ADOdb 2.21 이후 버전에서는 선택된 데이타베이스에 영구접속하는 경우 롤백을 수행한다. 영향을 받는 데이타베이스는 변경 기록이나 소스 코드를 보기 바란다.
접속 성공 여부에따라 참/거짓을 리턴한다. 보다 자세한 정보는 위의 Connect( )를 보기 바란다.
ADOdb 2.21 이후 버전에서는 자동 롤백을 지원한다. 예:
$conn = &NewADOConnection('mysql'); $conn->autoRollback = true; # 기본값은 거짓 $conn->PConnect(...); # 롤백이 수행됨
PConnect( )로 영구 접속할 때 ADOdb는 먼저 롤백을 수행한다. 이 것은 PHP는 영구 접속이 사용될 때 기존의 실패한 트랜잭션에대해 롤백을 보장하지않는다고 PHP 문서에 나와있기때문이다. 이 기능은 현재 Oracle, MySQL, PgSQL, MSSQL, ODBC에서 구현되었다.
ADOdb 3.11 이래 PConnect를 호출하기전에 ADODB_NEVER_PERSIST 상수를 정의해서 PConnect를 호출할 지라도 강제로 일시 접속으로 접속할 수 있다.
NConnect($host,[$user],[$password],[$database])
강제로 새로운 접속을 만든다. PHP는 때때로 Connect()나 PConnect()를 사용할 때 기존 접속을 다시 사용한다. 현재 MySQL(PHP 4.3.0 이상), PostgreSQL, oci8에서 유도된 드라이버에서만 동작한다. 다른 드라이버에서 NConnect( )는 Connect( )와 동일하게 동작한다. SQL 문, $sql를 실행하고 성공적인 경우 유도된 ADORecordSet 크래스를 리턴한다. 비록 Insert와 Update문이 수행된 경우라도 성공한 경우 레코드셋은 항상 리턴된다. 또한 Prepare()로 준비(컴파일)된 $sql 문을 전달 할 수 있다. 유도된 ADORecordSet 크래스를 리턴. 예. MySQL을 통해 접속한 경우, ADORecordSet_mysql이 리턴된다. SQL 문을 실행하는중 오류가 발생한 경우 거짓이 리턴된다. $inputarr 매개변수는 매개변수와 변수를 바인딩하는데 사용될 수 있다. 다음은 Oracle의 예이다: ? 관례를 사용한 또다른 예(ODBC 경우): 변수 바인딩은 SQL 문을 컴파일하고 캐쉬하는 속도를 높여주며, 결과적으로 보다 높은 성능을 기대할 수 있다. 현재 Oracle, Inetbase와 ODBC가 변수 바인딩을 지원한다. Interbase/ODBC 형식의 ?이 바인딩을 지원하지 않는 데이타베이스에서 바인딩을 흉내내기위해 사용된다. ODBC, Interbase, oci8po 드라이버에서 변수 바인딩. ADOdb 3.80 이래로 ADOdb는 Execute( )에서 벌크 바인딩을 지원한다. 벌크 바인딩은 INSERT/UPDATE나 DELETE 문에 바운드될 2차원 배열을 전달하는 것이다. 이 것은 SQL문이 먼저 만들어지기때문에 아주 높은 성능을 제공한다. 준비된 문장은 각 배열에대해 반복적으로 수행된다. 모든 행이 실행되거나 첫번째 오류가 발생하면 실행이 중단된다. 이 것은 많은 량의 데이타를 가져오는데 아주 유용하다. CacheExecute([$secs2cache,]$sql,$inputarr=false) Execute와 비슷하지만 레코드셋이 $ADODB_CACHE_DIR 디렉토리에 $secs2cache 초동안 캐쉬된다는 것과 $inputarr는 1차원 배열만 허용된다는 점이 다르다. 만약 동일한 데이타베이스, 동일한 사용자 ID로 연결하고, 동일한 $sql, $inputarr를 사용해서 CacheExecute()을 호출한다면 그리고 캐쉬된 레코드셋이 만료되지 않았된다면 캐쉬된 레코드셋이 리턴된다. ADOdb 1.80 이후로 $secs2cache 매개변수는 옵션이다: 성능 주의: 필자는 몇몇 벤치마크를 수행했으며 캐쉬의 성능상 잇점은 크게 변한다는 것을 알 수 있었다. 데이타베이스 서버가 웹 버서에비해 아주 느리거나 데이타베이스 서버가 지나치게 과부하가 걸린 경우 ADOdb의 캐쉬는 데이타베이스 서버의 부하를 줄여줄 수 있기때문에 아주 효과적이다. 그러나 데이타베이스 서버의 부하가 심하지 않거나 웹 서버에비해 훨씬 빠르다면 캐슁은 오히려 성능을 감소시킨다. ExecuteCursor($sql,$cursorName='rs',$parameters=false) 오라클의 저장된 프로시져를 실행하고 오라클의 REF 커서 변수를 정규 ADOdb 레코드셋으로 반환한다. 이 것은 oci8을 제외한 어떤 다른 데이타베이스에서도 동작하지 않는다. 이 것을 설계한 Robert Tuttle에 감사한다. ExecuteCursor()는 내부적으로 다음과 같이 동작하는 보조 함수이다: SelectLimit($sql,$numrows=-1,$offset=-1,$inputarr=false) 성공하면 레코드셋이 리턴된다. 그렇지 않으면 거짓이 리턴된다. PostgreSQL의 LIMIT $numrows OFFSET $offset 구를 흉내낸 SELECT 문을 수행한다. PostgreSQL에서 SELECT * FROM TABLE LIMIT 3은 단지 세개의 레코드만 리턴한다. 이 것은 SELECT * FROM TABLE LIMIT 3 OFFSET 2은 3, 4, 5 레코드가 리턴된다(예: 레코드 2이후의 3행). 이 것은 ADOdb에서 주의: 이 것은 MySQL의 LIMIT 구와는 반대이다. 마지막 행으로부터 11개의 행을 가져오기위해 마지막 매개변수 $inputarr는 Oracle oci8과같이 변수 바인딩을 지원하는 데이타베이스를 위한 것이다. 이 것은 결과적으로 SQL 컴파일 오버헤드를 줄여준다. 다음은 Oracle의 예이다: oci8po 드라이버(오라클 호환 드라이버)는 보다 표준적인 바인딩 변수, ?를 사용한다. Ron Wilson의 보고에따르면 SelectLimit는 UNION과는 동작하지 않는다고 한다. CacheSelectLimit([$secs2cache,] $sql, $numrows=-1,$offset=-1,$inputarr=false) SelectLimit와 유사하지만 리턴된 레코드셋이 $ADODB_CACHE_DIR 디렉토리에 $secs2cache 초동안 캐쉬된다는 것이 다르다. 1.80 이래 $secs2cache은 옵션이며, $connection->cacheSecs에서 캐쉬될 시간을 정의할 수 있다. $conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val));
$conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val));
변수 바인딩 $rs = $db->Execute('select * from table where val=?', array('10'));
oci8 드라이버에서 변수 바인딩: $rs = $db->Execute('select name from table where val=:key', array('key' => 10));
벌크 바인딩 $arr = array( array('Ahmad',32), array('Zulkifli', 24), array('Rosnah', 21) );$ok = $db->Execute('insert into table (name,age) values (?,?)',$arr);
include('adodb.inc.php'); include('tohtml.inc.php'); $ADODB_CACHE_DIR = '/usr/local/ADOdbcache'; $conn = &ADONewConnection('mysql'); $conn->PConnect('localhost','userid','password','database'); $rs = $conn->CacheExecute(15, 'select * from table'); # 15 초 캐쉬 rs2html($rs); /* 레코드셋을 HTML 표로 */
$conn->Connect(...); $conn->cacheSecs = 3600*24; // 24 시간 캐쉬 $rs = $conn->CacheExecute('select * from table');
$secs2cache 매개변수를 누락한 경우 $connection->cacheSecs(기본값은 3600초 또는 1시간)이 사용된다. SELECT 문만 CacheExecute()를 사용할 수 있다. $db = ADONewConnection("oci8"); $db->Connect("foo.com:1521", "uid", "pwd", "FOO"); $rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;", 'cursorvar', array('param1'=>10)); # $rs는 이제 ADOdb 레코드셋 개체처럼 동작한다 rs2html($rs);
$stmt = $db->Prepare("BEGIN :RS := SP_FOO(); END;"); $db->Parameter($stmt, $cur, 'RS', false, -1, OCI_B_CURSOR); $rs = $db->Execute($stmt);
$connection->SelectLimit('SELECT * FROM TABLE',3)
와 동일하다. 이 기능은 이러한 특징을 지원하지않는 데이타베이스의 경우 시뮬레이트된다.$connection->SelectLimit('SELECT * FROM TABLE',3,2)
를 실행하는 것과 동일하다.$connection->SelectLimit('SELECT * FROM TABLE',-1,10)
를 실행할 수 있다. $conn->SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=> $val));
$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=?", 100,-1,array('val'=> $val));
$conn->Connect(...); $conn->cacheSecs = 3600*24; // 24시간 캐쉬 $rs = $conn->CacheSelectLimit('select * from table',10);
CacheFlush($sql=false,$inputarr=false)
$ADODB_CACHE_DIR에 SQL문 $sql에대해 캐쉬된 임의의 레코드셋을 삭제한다.
매개변수를 지정하지 않으면 모든 adodb_*.cache 파일이 삭제된다.
캐쉬된 레코드셋을 수작업으로 삭제하길 원한다면 다음 PHP 코드(유닉스에서만 동작함)를 실행하기 바란다:: system("rm -f `find ".$ADODB_CACHE_DIR." -name adodb_*.cache`");
일반적으로 모든 만료된 파일의 삭제는 유닉스의 경우, crontab, 윈도우즈의 경우 at.exe를 사용하고 다음과 비슷한 ? 스크립트를 사용해야 한다:
#------------------------------------------------------
# 이 예는 TMPPATH 디렉토리내의 파일을 삭제한다
# 삭제되는 파일은 이름에 ".cache"를 포함하고 있으며
# 생성일자가 7일 이상된 파일들이다.
#------------------------------------------------------
AGED=7
find ${TMPPATH} -mtime +$AGED | grep "\.cache" | xargs rm -f
PEAR DB 오류 번호 시스템을 기초로 가상화된 오류 번호를 리턴한다. 이 함수를 호출하기전에 adodb-error.inc.php를 Include해야 한다. 매개변수를 지정하지 않으면 MetaError는 ErrorNo()를 호출하며, 이 것을 변환한다. 오류 번호가 가상화되지 않으면 MetaError는 -1(DB_ERROR)을 리턴한다.
오류 메시지를 복원하기위해 MetaError()에의해 리턴된 오류 번호를 전달한다.
마지막 상태나 오류 메시지를 리턴한다. 이 것은 오류가 발생하지 않은 겨우에도 문자열을 리턴할 수 있다. 일반적으로 ADOdb 함수가 오류시 거짓을 리턴하는 경우를 제외하고 이 함수를 호출할 필요는 없다.
주의: debug를 참으로 설정한 경우 Execute 함수가 호출될 때 SQL 오류 메시지는 항상 출력된다.
마지막 오류 번호를 리턴한다. 이전 버전의 PHP(4.0.6 이하)는 ODBC에대한 오류 번호를 지원하지 않는다는 것에 주의하기 바란다. 일반적으로 ADOdb 함수가 오류시 거짓을 리턴하는 경우를 제외하고 이 함수를 호출할 필요는 없다.
현재의 페치 모드를 설정하고 설정된 값을 $db->fetchMode에 저장한다. 사용할 수 있는 모드는 ADODB_FETCH_ASSOC과 ADODB_FETCH_NUM이다. 보다 자세한 정보는 $ADODB_FETCH_MODE를 보기 바란다.
이전 페치 모드를 리턴한다. SetFetchMode( )가 이전에 호출된 적이 없다면 거짓이 리턴될 수 있다.
CreateSequence($seqName = 'adodbseq',$startID=1)
시퀀스를 생성한다. 다음번에 GenID( )가 호출되면 리턴된 값은 $startID가 된다. ADOdb 2.60에서 추가되었다.
DropSequenceD($seqName = 'adodbseq')
시퀀스를 삭제한다. ADOdb 2.60에서 추가되었다.
GenID($seqName = 'adodbseq',$startID=1)
시퀀스 번호를 생성한다. 현재 interbase, mysql, postgresql, oci8, oci8pro, mssql, ODBC에 근거한 드라이버(access, vfp, db2등)와 동작한다. 시퀀스의 이름으로서 $sqlName를 사용한다. GenID()는 시퀀스가 존재하지않는 경우 자동적으로 시퀀스를 생성한다(제공된 사용자 ID가 권한이 있는 경우). 그렇지않으면 스스로 시퀀스를 생성해야 한다.
데이타베이스 드라이버가 시퀀스를 에뮬레이션하는 것이라면 테이블의 이름이 시퀀스의 이름이 된다. 테이블은 하나의 컬럼, "id"를 가지고 있어야 하며, 컬럼의 타입은 정수 또는 numeric(16)보다 큰 것이야 한다.
ODBC와 시퀀스를 지원하지 않는 데이타베이스(예: mssql, mysql) 경우, 각 시퀀스에대한 테이을 생성한다. 만약 먼저 시퀀스가 정의되지않았다면 $startID에서 설정된 시작값으로 생성된다.
주의: ADOdb 1.9 이하의 mssql 드라이버의 GenID()는 16 바이트의 GUID를 생성하는데 사용된다.
UpdateBlob($table,$column,$val,$where)
blob($val에)을 $table의 $where가 지시하는 행의 $column에 저장할 수 있다.사용예:
# 오라클의 경우 $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())'); $conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1'); # 다른 DB의 경우 $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); $conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
성공하면 참이 리턴되며, 그렇지 않은 경우 거짓이 리턴된다. MySQL, PostgreSQL, Oci8, Oci8pro와 Interbase 드라이버에의해 지원된다. 다른 드라이버는 해당 드라이버의 개발 상황에따라 동작할 수도 있다.
주의: Interbase blob는 SELECT를 사용해서 복원할 때 원래의 값을 끌어내기위해 $connection->DecodeBlob($blob);를 사용해서 디코드할 필요가 있다(PHP 4.1.0 이하 버전).
PostgreSQL의 경우 blob oid를 사용하거나 bytea 필드로 저장할 수 있다. UpdateBlob( )은 bytea 필드는 사용할 수 있지만 oid는 사용할 수 없다. 반대로 UpdateBlobFile( )는 oid를 지원하지만 bytea 데이타는 지원하지 않는다
만약 oid로 전달되지않으면 UpdateBlob()는 bytea 필드에 저장된 것으로 간주한다.
UpdateClob($table,$column,$val,$where)
clob($val의)을 $table의 $where가 지시하는 행의 $column에 저장할 수 있다. UpdateBlob와 유사하지만 Character Large OBjects라는 점이 다르다.사용예:
# 오라클 $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())'); $conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1'); # 다른 DB의 경우 $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)'); $conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');
UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
UpdateBlob과 비슷하지만 blob가 위치한 파일 경로를 전달하는 것이 다르다.
PostgreSQL의 경우 blob oid를 사용하는 경우 이 인터페이스를 사용한다. 이 인터페이스는 bytea 필드를 지원하지 않는다.
성고하면 참을, 그렇지 않으면 거짓을 리턴한다.
몇몇 데이타베시스는 업로드전에 수작업으로 blob를 인코드할 필요가 있다. 주의: UpdateBlob( )나 UpdateBlobFile( )를 사용한다면 변환은 자동적으로 수행되므로 이 함수를 호출할 필요는 없다. PostgreSQL의 경우 현재 BlobEncode()는 bytea 필드에대해서만 사용할 수 있다.
인코드된 blob 값을 리턴한다..
주의: blobEncodeType라고 부르는 접속 속성이 존재한다. 속성 값은 다음과 같다:
거짓 - 인코드, 디코드를 수행할 필요가 없음.
'I' - blob 인코딩이 필요함, 리턴된 blob(인코드된)은 숫자로 구성된(인용할 필요는 없음).
'C' - blob 인코딩이 필요함, 리턴된 blob(인코드된)은 문자로 구성됨(인요할 필요가 있음).
이 것은 순전히 문서화 목적으로만 사용된다. 다중 데이타베이스 드라이버를 허용하는 프로그램은 blob를 처리할 때 해야하는 올바는 것이 무었인지 알고 있다.
몇몇 데이타베이스는 SELECT 문을 수행한 후 수작업으로 blob를 디코드해야한다. 만약 데이타베이스가 디코딩을 필요로하지 않는다면 이 함수는 변경되지않는 blob를 리턴한다. 현재 BlobDecode는 단 하나의 데이타베이스, PostgreSQL에서, blob oid를 사용하는 경우에만 필요하다(만약 bytea 필드를 사용한다면 자동적으로 디코드된다). Replace($table, $arrFields, $keyCols,$autoQuote=false) 레코드를 갱신한다. 만약 레코드가 존재하지않는다면 삽입된다. 실패시 0이 리턴되며, 갱신시 1이, 삽입시 2가 리턴된다. 이 함수는 MySQL의 Replace와 다르다. MySQL의 Replace는 레코드를 삭제한 후, 새로운 레코드를 삽입한다. 이 것은 또한 프라이머리 키는 업데이트 할 수 없음을 의미한다. 이 것의 유일한 예외는 Interbase와 Interbase로부터 유도된 드라이버이다. Interbase의 경우 Interbase API 제한 때문에 삭제/삽입을 사용한다. 매개변수 $table은 테이블 명이며, $arrFields는 필드명을 키로하는 연관배열이며, $KeyCols는 프라이머리 키이거나 프라이머리 키의 배열(조합 키인 경우)이어야 한다. $autoQuote가 참으로 설정되며, Replace()는 Numeric 형을 제외한 모든 형을 인용한다. 자동 인용은 Null은 인용하지는 않는다. 자동 인용은 SQL 함수나 연산자를 사용하면 동작하지 않는다. 예: GetUpdateSQL(&$rs, $arrFields, $forceUpdate=false,$magicq=false) 레코드셋 $rs로 주어진 테이블을 갱신할 수 있는 SQL 문을 생성한다. 변경된 배열 필드 $arrFields가 현재 레코드셋과 비교된다. $arrFields는 컬럼명을 키, 새로운값을 값으로하는 연관배열이다. 만약 $forceUpdate가 참이면 $arrFields가 $rs->fields와 동일할 지라도 SQL 문을 생성한다. 관련 레코드셋이 필요하다. $magicq는 매직 Quote(qstr()을 참조)를 사용할 것인지 아닌지를 지시하는데 사용된다. 배열의 필드명은 대소문자를 구분하지 않는다. 3.61 이래로 define('ADODB_FORCE_NULLS',1)과 모든 PHP 널은 SQL 널로 자동 변환된다. GetInsertSQL(&$rs, $arrFields,$magicq=false) 레코드셋 $rs로 주어진 테이블에 삽입할 수 있는 SQL 문을 생성한다. 관련 질의를 필요로한다. $magicq는 Quote(qstr()을 참조)를 사용할 것인지 아닌지를 지시하는데 사용된다. 배열의 필드명은 대소문자를 구분하지 않는다. 3.61 이래로 define('ADODB_FORCE_NULLS',1)과 모든 PHP 널은 SQL 널로 자동 변환된다. PageExecute($sql, $nrows, $page, $inputarr=false) 레코드셋을 페이지화하는데 사용된다. $page는 1 부터 시작된다. 참조: 예 8.$rs = $db->Execute("select bloboid from postgres_table where id=$key");$blob = $db->BlobDecode( reset($rs->fields) );
# 하나의 프라이머리 키$ret = $db->Replace('atable', array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'), 'id',$autoquote = true); # UPDATE atable SET firstname='Harun',lastname='Al-Rashid' WHERE id=1000 이나# INSERT INTO atable (id,firstname,lastname) VALUES (1000,'Harun','Al-Rashid') 생성# 조합키$ret = $db->Replace('atable2', array('firstname'=>'Harun','lastname'=>'Al-Rashid', 'age' => 33, 'birthday' => 'null'), array('lastname','firstname'), $autoquote = true);# 자동 인용 사용 안함$ret = $db->Replace('atable2', array('firstname'=>"'Harun'",'lastname'=>"'Al-Rashid'", 'age' => 'null'), array('lastname','firstname'));
CachePageExecute($secs2cache, $sql, $nrows, $page, $inputarr=false)
레코드셋을 페이지화하는데 사용된다. $page는 1부터 시작된다. 참조: 예 8. PageExecute의 캐쉬버전이다.
데이타베이스 접속을 닫는다. PHP에서는 PHP4의 참조 계수 메카니즘이 자동적으로 접속을 삭제하기때문에 접속 종료시 더이상 강제로 접속을 해제할 필요가 없다고 언급하고 있다.
트랜잭션 감시를 시작한다. SQL 문이 실행됨에따라 ADOdb는 SQL 오류를 감시하고, 임의의 오류가 검출(CompleteTrans()가 호출)되면 자동 롤백을 실행한다.
왜 StartTrans()가 BeginTrans()보다 우수한지 이해하기위해 BeginTrans()를 사용한 몇몇 방법을 조사했다. 다음은 트랜잭션을 사용하는 잘못된 방법이다(오류 검사를 수행하지 않았으므로):
$DB->BeginTrans();$DB->Execute("update table1 set val=$val1 where id=$id");$DB->Execute("update table2 set val=$val2 where id=$id");$DB->CommitTrans();
이 예는 table1을 갱신 할 수 있고, 실패시 table2를 갱신 할 수 있다. 다음은 보다 나은 방법이다:
$DB->BeginTrans();$ok = $DB->Execute("update table1 set val=$val1 where id=$id");if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");if ($ok) $DB->CommitTrans();else $DB->RollbackTrans();
다음은 또 다른 방법이다(ADOdb 2.0 이상):
$DB->BeginTrans();$ok = $DB->Execute("update table1 set val=$val1 where id=$id");if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");$DB->CommitTrans($ok);
위의 예에서 알 수 있듯이 SQL 문을 수행할 때마다 $ok를 감시해야 한다. StartTrans()는 모든 SQL 오류를 감시할 수 있기때문에 BeginTrans()에비해 개선되었다. 이 것은 SQL 질의가 수행되는 블랙박스 함수를 호출할 때에는 특히 유용하다. 또한 StartTrans 블럭내의 모든 BeginTrans, CommitTrans 와 RollbackTrans 호출은 무시된다. 심지여 블랙박스 함수가 커밋을 수행할 지라도 무시된다.
$DB->StartTrans();CallBlackBox();$DB->Execute("update table1 set val=$val1 where id=$id");$DB->Execute("update table2 set val=$val2 where id=$id");$DB->CompleteTrans($ok);
StartTrans 블럭은 중첩될 수 있지만 안쪽의 블럭은 무시된다는 것에 주의하기바란다.
CompleteTrans($autoComplete=true)
StartTrans()로 호출된 모든 트랜잭션을 완료한다. 이 함수는 SQL 오류를 감시하고, 오류가 없으면 커밋하고, 그렇지 않으면 롤백한다. 커밋시 참이 리턴되며, 롤백시 거짓이 리턴된다. 매개변수 $autoComplete이 참이면 SQL 오류를 감시하고 결과에따라 적당히 커밋, 롤백한다. SQL 오류가 검출되지않은 경우에도 롤백하려면 $autoComplete를 거짓으로 설정한다.
StartTrans()로 시작된 트랜잭션을 실패하게 한다. CompleteTrans()이 호출되면 일단 롤백이 수행된다.
지능적 트랜잭션의 실패 여부를 검사한다. 예: SQL 수행상의 오류가 발생했거나 FailTrans()가 호출된 경우 참이 리턴된다. SmartTrans() 블럭 내가 아니라면 거짓이 리턴된다.
트랜잭션을 시작한다. 자동 커밋은 사용되지않는다. 성공적인 경우 참이 리턴된다. 트랜잭션을 지원하지 못하는 몇몇 데이타베이스는 항상 거짓을 리턴한다. 임의의 열려진 트랜잭션은 접속이 종료될 때 롤백된다. 트랜잭션을 지원하는 데이타베이스 중에는 Oracle, PostgreSQL, Interbase, MSSQL, 몇몇 MySQL 버전, DB2, Informix, Sybase등이 있다.
StartTrans()와 CompleteTrans()가 트랜잭션을 처리하는 보다 나은 방법이며, 이 기능은 ADOdb 3.40 이상 버전에서 사용할 수 있다. 보다 자세한 설명은 StartTrans() 문서를 보기 바란다.
오류시 스크립트를 종료하고 명시적으로 트랜잭션을 롤백하기위해 ADOdb 오류 처리기를 사용할 수 있다. 몇몇 버그가 있는 데이타베이스 확장 모듈은 모든 트랜잭션을 커밋하는 것으로 알려져있으므로 안전을 위해 오류 처리기에서 명시적으로 $DB->RollbackTrans()하기를 원할 수 있다.
트랜잭션 검출
ADOdb 2.50 이래로 트랜잭션을 검출할 수 있다. $connection->transCnt가 0 보다 큰지 검사한다. 이 변수는 BeginTrans()가 호출될때마다 증가하며, RollbackTrans() 또는 CommitTrans()가 호출될 때마다 감소한다.
트랜잭션을 성공적으로 종료한다. 성공하면 참이 리턴된다. 데이타베이스가 트랜잭션을 지원하지 않는 경우도 데이타는 항상 커밋됨므로 참이 리턴될 것이다.
매개변수 $ok=false를 전달하면 데이타는 롤백된다. BeginTrans()의 예를 보기바란다.
트랜잭션을 종료하고 모든 변경을 롤백한다. 성공하면 참이 리턴된다. 트랜잭션을 지원하지않는 데이타베이스의 경우 어떠한 데이타로 롤백할 수 없으므로 거짓이 리턴될 것이다.
GetAssoc($sql,$inputarr=false,$force_array=false,$first2cols=false)
주어진 질의 $sql에대한 연관 배열을 리턴한다. $inputarr로 표시되는 바인딩 매개변수는 옵션이다. 만약 리턴된 컬럼의 수가 2보다 크다면 2차원 배열이 리턴된다. 레코드셋의 첫번째 컬럼이 나머지 행에대한 키가 된다. 컬럼이 2이면 1차원 배열이 생성되며, 키는 값으로 직접 매핑된다(각각의 값에대해 배열이 생성될때 $force_array가 참으로 설정되지않은다면).
레코드셋에 다음과 같은 데이타를 가지고 있다고 하자:
row1: Apple, Fruit, Edible
row2: Cactus, Plant, Inedible
row3: Rose, Flower, Edible
GetAssoc는 다음과 같은 2차원 연관배열을 생성하게된다:
Apple => array[Fruit, Edible]
Cactus => array[Plant, Inedible]
Rose => array[Flower,Edible]
만약 데이타 집하이 다음과 같다면:
row1: Apple, Fruit
row2: Cactus, Plant
row3: Rose, Flower
GetAssoc은 다음과 같은 1차원 연관배열을 생성하게된다.($force_array==false 인경우):
Apple => Fruit
Cactus=>Plant
Rose=>Flower
함수 리턴:
연관배열 또는 오류가 발생한 경우 거짓.
CacheGetAssoc([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)
위의 GetAssoc 함수의 캐쉬 버전이다.
SQL 문을 실행하고 첫행의 첫번째 필드를 리턴한다. 레코드셋과 남은 행은 자동적으로 삭제된다. 오류가 발생하면 거짓이 리턴된다.
SQL을 실행하고 첫번째 행을 배열로 리턴한다. 레코드셋과 남은 행은 자동적으로 삭제된다. 오류가 발생한 경우 거짓이 리턴된다.
SQL을 실행하고 모든 행을 2차원 배열로 리턴한다. 레코드셋은 자동적으로 삭제된다. 오류가 발생하면 거짓이 리턴된다.
GetCol($sql,$inputarr=false,$trim=false)
SQL 문을 실행하고 첫번째 컬럼의 모든 항목을 1차원 배열로 리턴한다. 레코드셋은 자동적으로 삭제된다. 오류가 발생하면 거짓이 리턴된다.
CacheGetOne([$secs2cache,] $sql,$inputarr=false), CacheGetRow([$secs2cache,] $sql,$inputarr=false), CacheGetAll([$secs2cache,] $sql,$inputarr=false), CacheGetCol([$secs2cache,] $sql,$inputarr=false,$trim=false)
위의 Get* 함수와 비슷하지만 레코드셋은 $ADODB_CACHE_DIR 디렉토리에 $secs2cache 초동안 캐쉬되고 시리얼화된다는 차이가있다. 드물게 변경되는 데이타에대한 질의 속도를 높이이기에 좋다. $secs2cache 매개변수는 옵션이라는 것에 주의하기 바란다. $secs2cache를 누락하면 $connection->cacheSecs(기본값은 3600초 또는 한시간)의 값이 사용된다.
반복적인 실행을 위해 SQL 질의를 준비(컴파일)한다. 바인드 매개변수는 ?로 표기된다. oci8 드라이버의 경우 전통적인 Oracle 바인드 변수인 :varname로 표기된다.
배열의 첫번째 요소에 원 SQL 문이 포함된 배열을 리턴한다. 배열의 나머지 부분은 드라이버에따라 다르다. 오류가 발생하거나 Prepace( )를 에뮬레이션하는 경우 원래의 $sql 문자열이 리턴된다. 이것은 모든 오류 처리는 Execute( )에 집중되기때문이다.
Prepare( )는 SQL 쿼리를 다시 생성하는 함수(예: PageExecute( )와 SelectLimit( ))와는 함께 사용할 수 없다.
예:
$stmt = $DB->Prepare('insert into table (col1,col2) values (?,?)');for ($i=0; $i < $max; $i++)
$DB->Execute($stmt,array((string) rand(), $i));
또한 아래의 PrepareSP()와 Parameter()를 보기 바란다. 이 것은 내부적으로 interbase, oci8과 몇몇 ODBC-기반 드라이버만 지원한다. 그외의 것들은 에뮬레이션된다. 에뮬레이션되는 경우 Prepare()를 사용하는 경우 성능상 잇점은 없다.
중요: PHP의 제한이나 버그때문에 미리 준비된 질의를 사용할 때 오류를 확인할 수 없다면 Prepare()를 사용하기 전에 $ADODB_COUNTRECS = false로 설정하고 시도하기 바란다. 이러한 문제는 ODBC에서 관측되었다.
IfNull($field, $nullReplacementValue)
다른 DB와 호환되는 IFNULL 함수(오라클의 NVL). 주어진 데이타베이스에대해 $field가 널인지를 검사하는 함수(문자열)를 리턴한다. 만약 널이면 $nullReplacementValue로 리턴된 값을 변경한다. 예.
$sql = 'SELECT '.$db->IfNull('name', "'- unknown -'"). ' FROM table';
이 것은 함수가 아니라 속성이다. 몇몇 데이타베이스는 부분 문자열을 복사하는 함수로 "substr"과 "substring"를 가지고 있다. 이 속성은 다음과 같이 사용한다:
$sql = "SELECT ".$db->substr."(field, $offset, $length) from table"; $rs = $db->Execute($sql);
모든 데이타베이스에서 substr의 첫번째 매개변수는 필드이며, 두번째는 부분 문자열의 시작을 표시하는 옵셋(1부터 시작)이고, 세번째는 부분 문자열의 길이이다.
이것은 함수가 아니라 속성이다. 이 것은 0.0~1.0 사이의 란수를 생성하는데 사용되는 SQL 문(문자열).
바인드 변수를 다른 DB와 호환되게 생성한다. 대부분의 데이타베이스의 경우 바인드 매개변수는 "?"이다. 그러나 몇몇 데이타베이스의 경우 이름을 갖는 바인드 변수를 사용한다. 예를들어 Oracle 경우 이름을 갖는 바인드 변수 ":somevar"를 사용한다. 이 함수로 바인드 매개변수를 갖는 SQL 문을 다른 DB와 호환가능하게 정의할 수 있다:
$sql = 'insert into table (col1,col2) values ('.$DB->Param('a').','.$DB->Param('b').')';# 'insert into table (col1,col2) values (?,?)'# 또는 'insert into table (col1,col2) values (:a,:b) 생성'$stmt = $DB->Prepare($sql);$stmt = $DB->Execute($stmt,array('one','two'));
mssql과 oci8에서 저장된 프로시져를 호출하면서 직접 매개변수와 리턴값을 바인드하길 원할때(특히 LOB를 처리할 때) PrepareSP()로 이 작업을 수행할 수 있다.
위의 Prepare( )와 동일한 배열이나 $sql 문자열을 리턴한다. 만약 리턴값을 바인드할 필요가 없다면 이 함수 대신에 Prepare를 사용해야 한다.
PrepareSP( )의 사용예는 아래의 Parameter( )을 보기 바란다.
주의: mssql 드라이버에서 저장된 프로시저를 준비(컴파일)하는 것은 특별한 함수, mssql_init( ) 호출을 필요로 한다. PrepareSP( )는 모든 다른 드라이버에서 사용할 수 있으며, Prepare( )를 호출함으로서 에뮬레이션된다.
Parameter($stmt, $var, $name, $isOutput=false, $maxLen = 4000, $type = false )
PrepareSP( )를 사용해서 SQL문을 준비(컴파일)한 후, 바인드 매개변수를 리턴값이나 특별한 데이타 처리(LOB)에 적당하게 추가한다. 현재 mssql과 oci8에서만 지원된다. 매개변수는 다음과 같다:
$stmt Prepare() 나 PrepareSP()에의해 리턴된 문.
$var 바인드할 PHP 변수. 반드시 먼저 초기화해야 한다!
$name 바인드할 저장된 프로시저의 변수명.
[$isOutput] 매개변수의 방향을 지시 0/false=IN 1=OUT 2=IN/OUT. oci8 드라이버는 방향을 자동 검출하므로 oci8에서는 무시된다.
[$maxLen] 매개변수의 최대 길이.
[$type] type에대해 사용할 수 있는 값에대한 보다 자세한 정보는 php.net의 mssql_bind와 ocibindbyname 문서를 보기 바란다.
예:
# @RETVAL = SP_RUNSOMETHING @myid,@group
$stmt = $db->PrepareSP('SP_RUNSOMETHING'); # 주의: 매개변수 명은 @로 시작되지 않음
$db->Parameter($stmt,$id,'myid'); $db->Parameter($stmt,$group,'group',false,64);# MSSQL에서 리턴값 - RETVAL는 프로그램에의해 정해진 이름임 $db->Parameter($stmt,$ret,'RETVAL',true);
$db->Execute($stmt);
oci8 예:
# 오라클의 경우, Prepare와 PrepareSP는 동일하다$stmt = $db->PrepareSP( "declare RETVAL integer; begin :RETVAL := SP_RUNSOMETHING(:myid,:group); end;");$db->Parameter($stmt,$id,'myid');$db->Parameter($stmt,$group,'group',false,64);$db->Parameter($stmt,$ret,'RETVAL',true);$db->Execute($stmt);
oci8과 mssql 구현상의 유일한 차이는 $sql의 문법이라는 것이 주의하기바란다.
mssql에서 만약 $type 매개변수가 거짓으로 설정되면 $type는 전달된 PHP 변수형에따라 동적으로 결정된다(string => SQLCHAR, boolean =>SQLINT1, integer =>SQLINT4 또는 float/double=>SQLFLT8).oci8에서 $type는 OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB)과 OCI_B_ROWID (ROWID)로 설정될 수 있다. 널을 전달하기위해 $db->Parameter($stmt, $null=null, 'param')를 사용한다.
마지막으로 oci8에서 바인드 매개변수는 PrepareSP( ) 나 Parameters를 다시 호출하지않고 사용할 수 있다. 이 것은 mssql에서는 불가능하다. oci8 예:
$id = 0; $i = 0;$stmt = $db->PrepareSP( "update table set val=:i where id=:id");$db->Parameter($stmt,$id,'id');$db->Parameter($stmt,$i, 'i');for ($cnt=0; $cnt < 1000; $cnt++) { $id = $cnt;
$i = $cnt * $cnt; # works with oci8! $db->Execute($stmt);
}
Bind($stmt, $var, $size=4001, $type=false, $name=false)
이것은 oci8 드라이버에서만 지원되는 저수준 함수이다. 오라클만 지원하기를 원하는 경우가 아니라면 사용하지 않는 것이 좋다. 변수를 바인드하는데에 Parameter( ) 함수를 사용할 것을 권고한다.
Bind( ) 로 SQL 문내의 변수를 바인드할 수 있다. 이 함수로 PHP 변수를 Prepare( )를 사용해서 준비(컴파일)된 오라클 SQL문에 정의된 이름으로 바인드 할 수 있다. 오라클의 이름을 갖는 변수는 콜론(:)으로 시작되며, ADOdb는 :0, :1, :2, :3 등으로 호출되는 이름을 갖는 변수를 요구한다. Bind( )의 첫번째 호출은 :0로 매치되며, 두번째 호출은 :1 등으로 호출된다. 바인딩은 Insert, Select, Update문의 속도를 100% 증가시킨다.
다른 변수, $size는 데이타 스토리지에대한 버퍼 크기를 설정한다. $type는 옵션으로 서술자 유형, OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB)와 OCI_B_ROWID (ROWID)를 나타낸다. 마지막으로 기본적인 :0, :1, 등의 이름을 사용하는 대신에 $name를 사용해서 자신의 바인드 명을 정의할 수 있다.
다음 예는 3개의 바인드 변수, :p1, :p2, :p3를 보이고 있다. 이 들 변수는 :0, :1, :2로 바인드된다.
$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");$DB->Bind($stmt, $p1);$DB->Bind($stmt, $p2);$DB->Bind($stmt, $p3);for ($i = 0; $i < $max; $i++) { $p1 = ?; $p2 = ?; $p3 = ?; $DB->Execute($stmt);}
또한 이름을 갖는 변수를 사용할 수 있다:
$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:name0, :name1, :name2)");$DB->Bind($stmt, $p1, "name0");$DB->Bind($stmt, $p2, "name1");$DB->Bind($stmt, $p3, "name2");for ($i = 0; $i < $max; $i++) { $p1 = ?; $p2 = ?; $p3 = ?; $DB->Execute($stmt);}SQL 로깅과 타이밍 함수(fnExecute를 사용)를 설치하기위해 이 메소드를 호출한다. 그러면 모든 SQL문이 테이타베이스의 adodb_logsql 테이블에 기록된다. 만약 adodb_logsql 테이블이 존재하지 않는다면 ADOdb는 테이블을 생성하게된다. 물론 사용자는 테이블 생성 권한이 있어야 한다. 이전에 기록된 값이 리턴된다(사용중일 겨우 참, 그렇지 않을 경우 거짓). 다음은 몇몇 데이타 베이스에대한 DDL의 예이다:
mysql: CREATE TABLE adodb_logsql ( created datetime NOT NULL, sql0 varchar(250) NOT NULL, sql1 text NOT NULL, params text NOT NULL, tracer text NOT NULL, timer decimal(16,6) NOT NULL ) postgres: CREATE TABLE adodb_logsql ( created timestamp NOT NULL, sql0 varchar(250) NOT NULL, sql1 text NOT NULL, params text NOT NULL, tracer text NOT NULL, timer decimal(16,6) NOT NULL ) mssql: CREATE TABLE adodb_logsql ( created datetime NOT NULL, sql0 varchar(250) NOT NULL, sql1 varchar(4000) NOT NULL, params varchar(3000) NOT NULL, tracer varchar(500) NOT NULL, timer decimal(16,6) NOT NULL ) oci8: CREATE TABLE adodb_logsql ( created date NOT NULL, sql0 varchar(250) NOT NULL, sql1 varchar(4000) NOT NULL, params varchar(4000), tracer varchar(4000), timer decimal(16,6) NOT NULL )사용예:
$conn->LogSQL(); // 로깅 켜기 : $conn->Execute(...); : $conn->LogSQL(false); // 로깅 끄기 # 로그된 결과의 요약 출력 $perf = NewPerfMonitor($conn); echo $perf->SuspiciousSQL(); echo $perf->ExpensiveSQL();
로깅의 유일한 제한은 SQL 로깅을 막는 롤백이다.
또한 성능 감시를 보기바란다.
이 두개의 속성으로 ADOdb에의해 처리되는 모든 SQL문에대해 병목함수를 정의할 수 있다. 이 속성으로 통계분석과 질의 재작성을 수행할 수 있다.
fnExecute의 예
이 것은 fnExecute을 사용하는 예로, 모든 캐쉬된 질의와 캐쉬되않은 질의를 계산하기위해 다음과 같이 할 수 있다:
# $db 는 접속 개체function CountExecs($db, $sql, $inputarray){global $EXECS;if (!is_array(inputarray)) $EXECS++;# 2차원 입력 배열 처리else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);else $EXECS++;}# $db는 접속개체function CountCachedExecs($db, $secs2cache, $sql, $inputarray){
global $CACHED; $CACHED++;}
$db = NewADOConnection('mysql');$db->Connect(...);$db->fnExecute = 'CountExecs';$db->fnCacheExecute = 'CountCachedExecs'; : :
# 많은 SQL 문 실행후:`printf("<p>토탈 질의=%d; 캐쉬=%d</p>",$EXECS+$CACHED, $CACHED);
fnExecute 함수는 SQL이 해석/실행되기 전에 호출되므로 질의 재작성을 수행할 수 있다. 만약 준비(컴파일)된 문장에 전달되는 경우 $sql은 배열이 된다(Prepare 참조). fnCacheExecute 함수는 리턴된 레코드셋이 캐쉬된 경우에만 호출된다. 함수 매개변수는 각각 Execute와 CacheExecute와 매치된다. 단 $this(접속 개체)가 첫번째 매개변수로 전달된 경우는 예외로 한다.
ADOdb 3.91 이후버전에서 fnExecute의 동작은 정의된 함수가 리턴하는 값이 무었이냐에따라 달라진다. 만약 값을 리턴하지 않는다면 $sql이 실행된다. 이 것은 질의 재작성이나 SQL 질의 계산에 유용하다.
다시 말하면 Execute 함수를 자신이 설계한 함수로 교체하길 원한다고 하자. 만약 이 경우라면 자신이 설계한 함수는 값을 리턴하면 된다. 값이 리턴되면 이 값은 어떠한 처리도 거치지 않은체 즉시 리턴된다. 이 것은 내부적으로 ADOdb에서 LogSQL( ) 함수를 구현하는데 사용되었다.
사용할 수 없음 - 1.99에서 제거됨. $s1, $s2등을 연결하는데 사용되는 SQL 문자열을 생성한다. 문자열 연결을 새성하기위해 concat_operator 필드의 문자열을 사용한다. 연결 연산자가 사용되지않으면 이 함수는 중첩된다. 예: MySQL 연결된 문자열을 리턴한다. $date를 데이타베이스가 허용하는 형식으로 변환한다. 이 것은 INSERT/UPDATE문에서 사용된다. SELECT 문의 경우 SQLDate를 사용한다. $date 매개변수는 유닉스의 정수 타임스탬프나 ISO 형식 Y-m-d 일수 있다. 사용되는 형식을 유지하기위해 fmtDate 필드를 사용한다. 만약 널이나 거짓 또는 ''가 전달되면 SQL 널로 변환된다. 인용된 날짜를 리턴한다. 타임스탬프 $ts를 데이타베이스가 허용하는 형식으로 변환한다. 이 것은 유닉스의 정수 타이스탬프나 ISO 형식 Y-m-d H:i:s 일 수 있다. 사용되는 형식을 유지하기위해 fmtTimeStamp 필드를 사용한다. 만약 널이나 거짓 또는 ''가 전달되면 SQL 널로 변환된다. 인용된 문자열로 타임스탬프를 리턴한다. qstr($s,[$magic_quotes_enabled=false]) 데이타베이스에 전송될 문자열을 인용한다. $magic_quotes_enabled 매개변수는 장난처럼 보이지만 POST/GET 변수에서 추추된 문자열을 인용하고, 이 값을 get_magic_quotes_gpc()의 두번째 매개변수로 전달하는 경우 유용하다. 이 것으로 변수를 두번 인용하는 것(qstr에의해 한번, magic_quotes_gpc의해 한번)을 확실히 막을 수 있다. 예. $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc()); 인용된 문자열을 리턴한다. 문자열 $s를 인용하고, 데이타베이스에서 사용되는 인용 문자를 적당히 이스케이프한다. 이전에는 Magic Quote 설정을 검사했지만 이 것은 PEAR DB와의 호환성때문에 3.31에서 제거되었다. Update 또는 Delete 문에의해 영향을 받은 행의 수를 리턴한다. 이 기능이 지원되지않는 경우 거짓이 리턴된다. interbase/firebird는 현재 지원되지않는다 Insert된 마지막 자동증가 ID가 리턴된다. 이 기능이 지원되않는 경우 거짓이 리턴된다. 자동증가나 개체 ID를 지원하는 데이타베이스, PostgreSQL, MySQL, MSSQL만 지원된다. PostgreSQL은 OID를 리턴하며, OID는 데이타베이스를 다시 로드한 경우 변경될 수 있다. 트랜잭션동안 테이블 행을 잠근다. 다음은 table1의 레코드 $id를 잠그는 예이다: db2, interbase, informix, mssql, oci8, postgres, sybase에서 지원된다. 서버에서 사용할 수 있는 모든 데이타베이스의 목록을 배열로 리턴한다. 먼저 서버에 접속해야 하며, ODBC, MySQL, ADO에서 사용할 수 있다. MetaTables($ttype = false, $showSchema = false, $mask=false) 현재 데이타베이스에서 사용할 수 있는 테이블과 뷰를 배열로 리턴한다. 이 배열에는 가능하다면 카달로그 테이블은 제외된다. 테이블만 보기위해서는 $db->MetaTables('TABLES')를 사용한다. 뷰만 보기위해서는 $db->MetaTables('VIEWS')를 사용한다. $showSchema 매개변수는 현재 DB2에서만 동작한다. 이 값을 참으로 설정하면 스키마 이름에 테이블에 추가된다. 예: "SCHEMA.TABLE". 또한 매스크를 지정할 수 있다. 예를들어 $mask = 'TMP%'로 설정하면 'TMP'로 시작되는 모든 테이블만 리턴된다. 현재 mssql, oci8, odbc_mssql과 postgre+만 $mask를 지원한다. $table의 각 컬럼에대한 하나의 필드 개체(ADOFieldObject)의 배열을 리턴한다. 현재 Sybase는 테이타 형의 인식을 지원하지 않으며 ADO는 올바른 데이타 타입을 확인할 수 없다(따라서 기본 varchar을 갖는다). $table에대한 컴럼명의 배열을 리턴한다. ADOConnection 유틸리티 함수
$DB->StartTrans(); $DB->RowLock("table1","rowid=$id"); $DB->Execute($sql1); $DB->Execute($sql2); $DB->CompleteTrans();
$table의 프라이머리 키 컬럼의 이름을 배열로 리턴한다. 현재 mysql, odbc(db2, odbc_mssql 포함), mssql, postgres, interbase/firebird, oci8 에의해 지원된다.
두개의 요소, '설명'과 '버전'을 포함하는 배열을 리턴한다. '설명'은 데이타베이스에대한 설명을 포함하고 있다. '버전'은 본질적으로 버전 번호를 가지고 있다(이또한 문자열이다). MetaForeignKeys($table, $owner=false, $upper=false) 외래키의 연관배열을 리턴하거나 지원되지않는 경우 거짓을 리턴한다. 예를들어 Employee 테이블은 dept_table.deptid를 지시하는 외래키, employee.deptkey를 가지고 있고 employee.posn=posn_table.postionid와 employee.poscategory=posn_table.category 라면 $conn->MetaForeignKeys('employee')는 다음 결과를 리턴한다 추가적인 스키마나 소유주는 $owner에서 정의할 수 있다. 만약 $upper가 참이면 테이블 명(배열의 키)은 대문자가 된다. SQL 문이 ADOConnection->Execute($sql)에의해 성공적으로 수행되면 ADORecordSet 개체가 리턴된다. 이 개채는 가상 커서를 포하하고 있으므로 행에서 행으로 이동할 수 있으며, 컬럼과 컬럼 타입에대한 정보를 구할 수 있고 보조 함수로 사용자에게 보여질 결과를 처리할 수도 있다. fields: 현재 행을 포함하는 배열. 이 것은 연관배열이 아니며, 0에서부터 columns-1까지 번호로 참조할 수 있는 배열이다. 또한 연관배열처럼 동작하는 함수 Fields를 보기 바란다 dataProvider: 데이타베이스 연결에 사용된 메카니즘. 일반적으로 odbc 나 ado를 사용하는 경우를 제외하고 native로 설정된다. blobSize: Blob(Blob는 TEXTAREA 태그에서 사용되는 것과같은 대용량 문자열)로 처리되기 전의 char, String, Varchar 개체의 최대 크기. MetaType 함수를 보기 바란다. sql: 이 레코드셋을 생성하는데 사용된 SQL 상태를 가지고 있다. canSeek: Move( ) 함수가 동작하면 참으로 설정된다. EOF: 커서가 마지막 레코드를 지나면 참. ADORecordSet( ) 생성자. 일반적으로 이 함수를 호출하는 경우는 없다. 레코드셋으로부터 연관배열을 생성한다. 주의: 이 함수는 접속 개체에서도 사용할 수 있다. 보다 자세한 정보는 접속 개체에서 찾을 수 있다. array( 'dept_table' => array('deptkey=deptid'), 'posn_table' => array('posn=positionid','poscategory=category') )
ADORecordSet
ADORecordSet Fields
ADORecordSet 함수
현재 커서 위치에서부터 레코드의 2차원 배열을 만든다. 이 배열은 0에서부터 $number_of_rows-1까지 번호로 참조할 수 있다. $number_of_rows가 정의되지 않으면 EOF까지 참조할 수 있다.
현재 커서 위치에서부터 레코드의 2차원 배열을 만든다. Microsoft ADO와 호환을 위해 만든 함수로 GetArray()와 동일한 함수이다.GetMenu($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])
HTML 메뉴(<select><option><option></select>)를 생성한다. 레코드셋의 첫 컬럼(fields[0])는 OPTION 태그로 출력될 문자열이다. 레코드셋이 하나 이상의 컬럼을 갖는다면 두번째 컬럼(fields[1])은 웹서버로 전송되는 값이된다. 메뉴의 이름은 $name로 줄 수 있다.
$default_str을 정의하고 $default_str == fields[0]라면 이 필드가 선택된다. $blank1stItem이 참이라면 옵션 태그의 첫번째 항목은 빈 공백이 된다. 또한 $blank1stItem = "$value:$text"르 설정함으로서 옵션 태그의 첫번째 항목을 설정할 수 있다.
다중 선택 목록 상자의 경우 $Default_str에 배열을 지정할 수 있다.
목록 상자를 만들기위해 $size에 0이 아닌값을 설정한다(또는 $default_str에 배열을 지정한다). $multiple_select가 참이면 $size 항목만큼의 목록 상자가 만들어 진다. $size==0이면 5개의 항목을 갖는 목록 상자가 만들어진다. 그후 배열이 서버로 리턴된다. 마지막으로 Javascipt나 Styles와 같은 추가적인 속성을 추가하기위해 $moreAttr 를 사용한다.
메뉴 예 1: GetMenu('menu1','A',true)
는 다음과 같은 메뉴를 생성할 것이다: 여기서 데이타는 (A,1), (B,2), (C,3)로 설정되었다. 또한 예 5를 보기바란다.
메뉴 예 2: 동일한 데이타에대해, GetMenu('menu1',array('A','B'),false)
는 A와 B가 선택된 메뉴를 생성할 것이다:
GetMenu2($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])
이 것은 거의 GetMenu와 동일하지만 $default_str이 fields[1](옵션 태그의 값)과 매치된다는 것이 다르다.
메뉴 예 3: 메뉴 예 2에서 주어진 데이타, GetMenu2('menu1',array('1','2'),false)
는 메뉴 예 2에서 선택된 A와 B가 선택된 메뉴가 생성된다. 그러나 이 번에 선택 기준은 2번째 컬럼(웹서버로 리턴되는 값)이다.
날짜 문자열 $str을 다른 형식으로 변환한다. 날짜 형식은 Y-m-d 또는 유닉스 타임스탬프 형식이다. 기본 $fmt는 Y-m-d 이다.
타임스탬프 문자열 $str를 다른 형식으로 변환한다. 타임스탬프 형식은 '2002-02-28 23:00:12'에서처럼 Y-m-d H:i:s이거나 유닉스 타임스탬프 형식이다. UserTimeStamp는 $str을 해석하기위해 UnixTimeStamp을 호출하며, $fmt를 정의하지않은 경우 기본값 Y-m-d H:i:s가 된다.
날짜 문자열 $str를 해석하고 유닉스 mktime 형식(예: 1970년 1월 1일부터 현재까지를 초로 환산한 숫자)으로 리턴한다. 날짜는 Y-m-d H:i:s 형식일 것이다(예외: Sybase와 Microsoft SQL 서버). 여기서 M d Y 형식 또한 사용할 수 있다(3글자로 표현되는 월 문자열은 전역 변수(지역화에 필요한)에의해 제어된다).
이 함수는 ADORecordSet과 ADOConnection에서 사용할 수 있다(1.91이상).
타임스탬프 문자열 $str를 해석하고 유닉스 mktime 형식(예: 1970년 1월 1일부터 현재까지를 초로 환산한 숫자)으로 리턴한다. 날짜는 "Y-m-d, H:i:s" (1970-12-24, 00:00:00) 나 "Y-m-d H:i:s" (1970-12-24 00:00:00) 나 "YmdHis" (19701225000000)일 것이다(예외: Sybase와 Microsoft SQL 서버). 여기서 "M d Y h:i:sA" (Dec 25 1970 00:00:00AM) 또한 허용된다(3글자로 표현되는 월 문자열은 전역 변수(지역화에 필요한)에의해 제어된다).
ADORecordSet과 ADOConnection 에서 사용할 수 있는 함수(1.91이상)
OffsetDate($dayFraction, $basedate=false)
$basedate에대한 과거/미래의 날짜를 계산하기위한 SQL 함수(문자열)을 리턴한다. $basedate가 정의되지 않으면 현재 날짜가 사용된다. Execute()에 전달될 때 계산을 수행하는 SQL 문자열이 리턴된다.
예를들어, 오라클에서 오늘부터 2.5일 후의 날짜와 시간을 찾기위해 다음과 같이 사용할 수 있다:
# 지금 부터 한주의 날짜를 가져옴$fld = $conn->OffsetDate(7); // "(trunc(sysdate)+7")를 리턴
# 현재 일시로부터 60시간 지난 날짜와 시간을 가져옴$fld = $conn->OffsetDate(2.5, $conn->sysTimeStamp); // "(sysdate+2.5)"가 리턴됨$conn->Execute("UPDATE TABLE SET dodate=$fld WHERE ID=$id");
이 함수는 mysql, mssql, oracle, oci8과 postgresql 드라이버에서 사용할 수 있다(2.13 이상). 날짜 계산을 수행할 수 있는 다른 드라이버와도 동작할 수 있다.
SQLDate($dateFormat, $basedate=false)
날짜나 날짜 컬럼 $basedate를 형식변환할 수 있는 데이타베이스 고유의 SQL 함수(문자열)를 리턴한다. 이 것은 SELECT 문에서 사용된다. INSERT/UPDATE 문의 경우 DBDate를 사용한다. 이 함수의 날짜형식, $dateFormat는 대소문자를 구분하며, 지원되는 값은 다음과 같다:Y: 4 자리 년도 Q: 분기 (1-4) m: 월 (01-12) d: 일 (01-31) H: 24시 (00-23) h: 12시 (1-12) i: 분 (00-59) s: 초 (00-60) A: AM/PM 지시기
이외의 모든 다른 글자는 문자로서 처리된다. 또한 글자를 이스케이프하기위해 \를 사용할 수 있다. mysql, postgresql, mssql, oci8과 DB2를 포함한 몇몇 데이타베이스에서 사용할 수 있다.
이 함수는 다른 DB와 호환 가능한 SQL 문(날짜로 GROUP BY하는)을 쓰는데 유용하다. 다음 예는 분기별로 팔린 상품의 총 가격을 출력하는 예이다(날짜는 postdate라는 필드에 저장된다).
$sqlfn = $db->SQLDate('Y-\QQ','postdate'); # postdate를 2002-Q1로 변환하는 SQL 문을 가져옴 $sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";
내부 커서를 다음행으로 이동한다. $this->fields 배열은 자동적으로 갱신된다. 커서를 이동할 수 없으면(일반적으로 EOF에 도달한 경우), 거짓이 리턴되며, 그렇지 않으면 참이 리턴된다.
만약 EOF에 도달하면 $this->fields 배열은 거짓으로 설정된다(이 것은 ADOdb 3.30 이후의 버전에서만 구현되었다.) 3.30 이전 버전의 경우 $this->fields가 EOF에 도달하면 전역변수 $ADODB_COMPAT_FETCH가 참으로 설정된다.
예:
$rs = $db->Execute($sql);if ($rs) while (!$rs->EOF) { ProcessArray($rs->fields); $rs->MoveNext(); }
내부 커서를 지정된 행 $to으로 이동한다. 행은 0행부터 시작된다. 즉, 0은 첫행을 나타낸다. fields 배열은 자동적으로 갱신된다. 내부적으로 이동을 지원하지않는 데이타베이스의 경우 ADOdb는 전방 이동을 시뮬레이트한다. 몇몇 데이타베이스는 후방 이동을 지원하지않는다. $to를 EOF 뒤로 지정하면 대부분의 데이타베이스에서 $to는 레코드셋의 끝으로 이동할 것이다. ODBC를 사용하는 경우 몇몇 데이타베이스는 이렇게 동작하지 않을 수 있다.
주의: 이 함수는 Microsoft의 ADO와는 달리 절대위치를 사용한다.
참 또는 거짓을 리턴한다. 거짓이면 대부분 내부 커서가 이동되지 않은 것을 의미하며, 따라서 AbsolutePosition( )은 Move( )를 실행하기전의 마지막 커서의 위치를 리턴한다.
내부적으로 Move(0)가 호출된다. 몇몇 데이타베이스는 이 함수를 지원하지않는다는 것을 주의하기 바란다.
내부적으로 Move(RecordCount()-1)이 호출된다. 몇몇 데이타베이스는 이 함수를 지원하지않는다는 것에 주의하기 바란다.
현재행을 포함하는 연관배열을 리턴한다. 연관배열의 키는 컬럼명이다. 컬럼명은 쉽게 접근할 수 있도록 대문자를 사용한다. 다음 행으로 이동하기위해 MoveNext()를 호출할 필요가 있다.
예:
Array ( [ID] => 1 [FIRSTNAME] => Caroline [LASTNAME] => Miranda [CREATED] => 2001-07-05 )
주의: $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC와 GetRowAssoc() 를 함께 사용해서는 안된다. 이들은 동일한 기능을 하므로 서로 간섭을 일의킬 수 있기때문이다.
현재 페이지를 리턴한다. PageExecute()/CachePageExecute()가 호출되어야 한다. 참조: 예 8.
AtFirstPage($status='')
첫 페이지(1 페이지)면 참을 리턴한다. PageExecute()/CachePageExecute()가 호출되어야 한다. 참조: 예 8.
AtLastPage($status='')
마지막 페이지(첫페이지는 1)면 참을 리턴한다. PageExecute()/CachePageExecute()가 호출되어야 한다. 참조: 예 8.
현재 행에대해 관련 컬럼 $colname의 값을 리턴한다. 컬럼명은 대소문자를 구분한다.
이 함수는 보조 함수이다. 보다 높은 성능을 원하는 경우 $ADODB_FETCH_MODE를 사용하기 바란다.
현재 행을 포함하는 배열이나 EOF시 거짓을 리턴한다. FetchRow( )는 내부적으로 현재행을 리턴한 후 다음 레코드로 이동한다.
경고: FetchRow()와 MoveNext() 함께 사용해서는 안된다.
사용예:
$rs = $db->Execute($sql);if ($rs) while ($arr = $rs->FetchRow()) { # process $arr }
현재 행을 $array로 설정한다. EOF면 PEAR_Error 개체가 리턴되며, OK(DB_OK 상수)면 1이 리턴된다. 만약 PEAR가 정의되어 있지 않은 경우 EOF시 거짓이 리턴된다. FetchInto( )는 내부적으로 현재 행을 리턴한 후, 다음 레코드로 이동한다.
FetchRow()가 사용하기 쉽다. 위를 참조한다.
연관된 필드의 name, type와 max_length 포함하는 개체를 리턴한다. 만약 max_length를 신뢰성있는 방법으로 결정할 수 없으면 -1이 리턴된다. 컬럼 번호는 0부터 시작된다. 참조: 예 2.
레코드셋에서 필드(컬럼)의 수를 리턴한다.
레코드셋의 행수를 리턴한다. 리턴되는 행수를 데이타베이스 드라이버 API로부터 결정할 수 없으면 모든 행을 버퍼링하고 모든 레코드가 복원된 후 행수를 계산해서 리턴한다. 이 버퍼링은 전역 변수 $ADODB_COUNTRECS를 거짓으로 설정함으로서 사용하지 않을 수 있다(성능때문에). $ADODB_COUNTRECS를 거짓으로 설정하면 RecordCount( )는 몇몇 데이타베이스에서 -1을 리턴할 것이다. 지원되는 데이타베이스 목록은 위를 참조하기 바란다.
RowCount는 RecordCount의 동의어이다.
PO_RecordCount($table, $where)
레코드셋의 행수를 리턴한다. 데이타베이스가 이 기능을 지원하지않는 경우 $table 테이블에대해 주어진 $where 조건으로 SELECT COUNT(*)를 수행하고 평가된 레코드 크기를 리턴한다.
$numrows = $rs->PO_RecordCount("articles_table", "group=$group");
NextRecordSet()하나의 질의에 여러 개의 레코드셋을 리턴하는 데이타베이스의 경우 이 함수를 이용해서 다음 레코드셋으로 전환할 수 있디. 현재 mssql 드라이버만 지원된다.
$rs = $db->Execute('execute return_multiple_rs');$arr1 = $rs->GetArray();$rs->NextRecordSet();$arr2 = $rs->GetArray();
현재 행을 개체로서 리턴한다. 만약 $toupper를 참으로 설정하면 개체 필드는 대문자로 설정된다. 주의: 행을 개체로서 접근할 때 새로운 함수, FetchNextObject()를 사용할 것을 권고한다. 아래를 참조하기 바란다.
FetchNextObject($toupper=true)
현재행을 개체로서 가져오고 자동적으로 다음 행으로 이동한다. EOF의 경우 거짓이 리턴된다. $toupper을 참으로 설정하면 개체 필드는 대문자로 설정된다.
$rs = $db->Execute('select firstname,lastname from table');if ($rs) { while ($o = $rs->FetchNextObject()) { print "$o->FIRSTNAME, $o->LASTNAME<BR>"; }}
FetchNextObject()를 사용하면 속도면에서 몇몇 교환점이 발생한다. 성능이 중요하다면 fields[]
배열로 행을 접근해야 한다.
현재 레코드를 개체로서 리턴한다. 필드는 FetchObject와는 달리 대문자로 바꿀 수 없다.
현재 레코드를 개체로서 리턴하고 다음 레코드로 이동한다. 만약 EOF면 거짓이 리턴된다. 필드는 FetctNextObject와는 달리 대문자로 바꿀 수 없다.
레코드셋의 현재 행을 리턴한다. 0은 첫행이다
ADO와의 호환성 때문에 사용되는 함수로 CurrentRow와 동의어이다. 레코드셋의 현재 행을 리턴한다. 0은 첫번째 행이다.
MetaType($nativeDBType[,$field_max_length],[$fieldobj])
문자열로 주어진 DB 고유의 필드형 $nativeDBType과 필드 길이 $field_max_length로 일반 메타 형을 결정한다. 주의: 필드 길이를 알 수 없는 경우 field_max_length는 -1이될 수 있다. FetchField()에의해 리턴된 필드 개체는 $fieldobj나 첫번째 매개변수 $nativeDBType로서 전달될 수 있다. 이 것은 필드 개체에 primary_key와 같은 추가적인 정보를 가지고 있는 mysql과같은 데이타베이스의 경우 유용하다.
필드 blobSize를 사용하고 문자 필드가 실제 Blob인지 결정하기위해 $field_max_length과 비교한다. 예를들어 $db->MetaType('char')는 'C'를 리턴할 것이다
리턴값:
- C: <input type="text"> 태그에서 보여지는 문자 필드.
- X: Clob(Character Large Objects) 나 <textarea> 태그에서 볼 수 있는 텍스트 필드
- D: 날짜 필드
- T: 타임스탬프 필드
- L: 논리 필드(부울 또는 비트 필드)
- N: 숫자 필드. 10진수, 숫자, 부동 소숫점, 실수를 포함한다.
- I: 정수 필드.
- R: 카운터나 자동 증가 필드. 숫자형 이어야 한다.
- B: Blob(Binary Large Objects.)
ADOdb 3.0 이상 버전에서 MetaType는 첫번째 매개변수로 $nativeDBType 대신에 $fieldobj를 취한다.
레코드셋을 닫는다.
function rs2html($adorecordset,[$tableheader_attributes], [$col_titles])
이 함수는 PHP의 odbc_result_all과 유사한 단독 함수(rs2html = 레코드셋을 HTML 테이블로 변환)로서 ADORecordSet, $adorecordset을 HTML 표로 출력한다. $tableheader_attributes으로 테이블의 cellpadding, cellspacing와 border 속성을 제어할 수 있다. 마지막으로 데이타베이스 컬럼명은 배열 $col_titles으로 변경할 수 있다. 이 함수는 레코드셋을 표로 출력하기위해 설계된 것이 아니라 디버깅을 보다쉽게하기 위해 설계된 것이다.
이 함수를 사용하기전에 tohtml.inc.php를 Include 할 필요가 있다.
<?include('tohtml.inc.php'); # ADOdb 공통 코드 읽기include('adodb.inc.php'); # ADOdb 공통 코드 읽기$conn = &ADONewConnection('mysql'); # 접속 생성 $conn->PConnect('localhost','userid','','agora');# MySQL, agora db에 연결$sql = 'select CustomerName, CustomerID from customers'; $rs = $conn->Execute($sql); rs2html($rs,'border=2 cellpadding=3',array('Customer Name','Customer ID'));?>
ADOdb 라이브러리와 Microsoft ADO와의 차이
- ADOdb는 접속 개체에의해 생성된 레코드 셋만 지원한다. 레코드셋은 독립적으로 생성할 수 없다.
- ADO 속성은 ADOdb에서 함수로서 구현되었다. 이 것은 미래에 보강될 ADO 기능 보다 쉽게 구현할 수 있도록 해준다.
- ADOdb의 ADORecordSet->Move()는 상대 위치가 아니라 절대 위치를 사용한다. 아울러 책갈피는 지원하지않는다.
- ADORecordSet->AbsolutePosition() 은 레코셋을 이동하는데 사용할 수 없다.
- ADO 매개변수 개체는 지원되지않는다. 대신에 ADOConnection::Parameter( ) 함수를 가지고 있다. 이 함수는 매개변수를 준비(컴파일)하고, 저장된 프로시저를 호출할 수 있는 간단한 인터페이스를 제공한다.
- 레코드셋을 페이지화하는데 사용되는 레코드셋 속성을 사용할 수 있지만 예 8처럼 구현되었다.
데이타베이스 드라이버 길잡이
이 문서는 새로운 데이타베이스에 연결하는 크래스를 어떻게 만들수 있는 가를 설명하고 있다. 이와같은 크래스를 만들기로 결정했다면 작업의 중복을 피하기위해 먼저 필자에게 jlim#natsoft.com.my 주소로 메일을 주기 바란다.
데이타베이스를 호출하는 소문자의 드라이버명을 결정한다. 예를 들어 xbase라고 하자
adodb-xbase.inc.php 파일에 두개의 크래스 ADODB_xbase와 ADORecordSet_xbase를 생성한다.
데이타베이스 드라이버의 가장 간단한 형태는 기존의 ODBC 드라이버에 적용하는 것이다. 그리고 새로운 날짜와 타임스탬프 형식, 사용된 연결 연산자, 참과 거짓을 지원하도록 ADODB_xbase extends ADODB_odbc 크래스를 생성할 필요가 있다. ADORecordSet_xbase extends ADORecordSet_odbc 의 경우 MetaType 함수를 변경할 필요가 있다. 예로서 adodb-vfp.inc.php를 보기 바란다.
보다 복잡한 것은 새로운 PHP 확장 모듈에 연결하는 새로운 데이타베이스 드라이버를 전부 개발하는 것이다. 그리고 여러가지 함수를 구현할 필요가 있다. 다행이 복잡한 대부분의 코드를 변경하지않아도 된다. 몇몇 Stub 함수만 변경하면 된다. 예로서 adodb-mysql.inc.php를 보기 바란다.
ADOdb에서 내부적으로 사용하기는 기본 날짜 형식은 YYYY-MM-DD (Ansi-92)이다. 모든 날짜는 ADOdb의 Date 함수로 전달될 때 이 형식으로 변환되어야 한다. _pconnect _connect에서 ALTER SESSION을 사용해서 기본 날짜 형식을 변경하는 방법은 Oracle을 보기 바란다.
ADOConnection 함수 중첩
ADOConnection에서 유도된 함수에대해 생성자를 정의하는 것은 옵션이다. 반드시 기본 크래스 생성자를 호출할 필요는 없다
_connect: Connect의 저수준 구현. 참 또는 거짓을 리턴. _connectionID를 설정해야 한다.
_pconnect: Pconnect의 저수준 구현. 참 또는 거짓을 리턴. _connectionID를 설정해야 한다.
_query: 질의 실행. queryID를 리턴하거나 거짓을 리턴.
_close: 접속을 닫음 -- PHP는 모든 레코드셋을 삭제한다.
ErrorMsg: 프라이빗 변수 _errorMsg에 오류 메시지 저장.
ADOConnection 필드 설정
_bindInputArray: 참으로 설정. SQL의 Insert, Update시 매개변수 바인딩에 ?가 사용(예: ODBC)되면 참으로 설정한다.
fmtDate
fmtTimeStamp
true
false
concat_operator
replaceQuote
hasLimit MySQL의 SELECT * FROM TABLE LIMIT 10 지원.
hasTop Microsoft 형식의 SELECT TOP 10 * FROM TABLE 지원.
ADORecordSet 함수 중첩
부모 크래스를 호출하는 ADORecordSet의 유도된 크래스에대한 생성자를 정의할 필요가 있다.
FetchField: 위의 ADORecordSet에서 설명했다
_initrs: 레코드셋의 저수준 초기화: _numOfRows와 _numOfFields 필드를 설정한다 -- 생성자에의해 호출된다.
_seek: 특정 행 검색. 필드 배열로 데이타를 읽지마라. 이 것은 _fetch에의해 완료된다. 참 또는 거짓을 리턴한다. 주의: 몇몇 Interbase와 같은 몇몇 드라이버는 행 검색을 지원하지 않는다. 이 경우 canSeek를 거짓으로 설정한다.
_fetch: 데이타베이스 확장 함수를 사용해서 행을 가져오고 다음 행으로 이동한다. fields 배열을 설정한다. 매개변수 $ignore_fields가 참이면 fields 배열을 가져올 필요는 없으며 바로 다음 행으로 이동한다. 그리고 참 또는 거짓을 리턴한다.
_close: 레코드셋을 닫는다.
Fields: PHP 확장 모듈에의해 리턴된 배열형이 연관배열이 아니면 이 것을 중첩해야 한다. 예는 adodb-odbc.inc.php를 보기 바란다. MySQL과 MSSQL과 같은 데이타베이스는 연관배열을 리턴한다. 따라서 이 함수를 중첩시킬 필요는 없다.
ADOConnection 필드 설정
canSeek: _seek 함수가 동작하면 참으로서 설정.
할일:
개발 예정표 기사를 본다.
HTTP 원격 함수 호출을 사용해서 윈도우와 유닉스 데이타베이스 사이를 연결하는 작업을 수행중인 ADOdb 프록시 기사를 본다. 데이타베이스에대한 정보는 palslib.com를 방문하고 PHP 최적화에대한 기사를 읽기 바란다.
변경 사항
4.05 ? ? 2003
Datadict did not handle types like 16.0 properly in _GetSize. Fixed.
Oci8 driver SelectLimit() bug &= instead of =& used. Thx to Swen Th?mler.
Jesse Mullan suggested not flushing outp when output buffering enabled. Due to Apache 2.0 bug. Added.
MetaTables/MetaColumns return ref bug with PHP5 fixed in adodb-datadict.inc.php.
New mysqli driver contributed by Arjen de Rijke. Based on adodb 3.40 driver. John added BeginTrans, CommitTrans, RollbackTrans, IfNull, SQLDate. Also fixed return ref bug.
4.04 13 Nov 2003
Switched back to foreach - faster than list-each.
Fixed bug in ado driver - wiping out $this->fields with date fields.
Performance Monitor, View SQL, Explain Plan did not work if strlen($SQL)>max($_GET length). Fixed.
Performance monitor, oci8 driver added memory sort ratio.
Added random property, returns SQL to generate a floating point number between 0 and 1;
4.03 6 Nov 2003
The path to adodb-php4.inc.php and adodb-iterators.inc.php was not setup properly.
Patched SQLDate in interbase to support hours/mins/secs. Thx to ari kuorikoski.
Force autorollback for pgsql persistent connections - apparently pgsql did not autorollback properly before 4.3.4. See http://bugs.php.net/bug.php?id=25404
4.02 5 Nov 2003
Some errors in adodb_error_pg() fixed. Thx to Styve.
Spurious Insert_ID() error was generated by LogSQL(). Fixed.
Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL() enabled. Fixed.
More foreach loops optimized with list/each.
Null dates not handled properly in ADO driver (it becomes 31 Dec 1969!).
Heinz Hombergs contributed patches for mysql MetaColumns - adding scale, made interbase MetaColumns work with firebird/interbase, and added lang/adodb-de.inc.php.
Added INFORMIXSERVER environment variable.
Added $ADODB_ANSI_PADDING_OFF for interbase/firebird.
PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support.
4.01 23 Oct 2003
Fixed bug in rs2html(), tohtml.inc.php, that generated blank table cells.
Fixed insert_id() incorrectly generated when logsql() enabled.
Modified PostgreSQL _fixblobs to use list/each instead of foreach.
Informix ErrorNo() implemented correctly.
Modified several places to use list/each, including GetRowAssoc().
Added UserTimeStamp() to connection class.
Added $ADODB_ANSI_PADDING_OFF for oci8po.
4.00 20 Oct 2003
Upgraded adodb-xmlschema to 1 Oct 2003 snapshot.
Fix to rs2html warning message. Thx to Filo.
Fix for odbc_mssql/mssql SQLDate(), hours was wrong.
Added MetaColumns and MetaPrimaryKeys for sybase. Thx to Chris Phillipson.
Added autoquoting to datadict for MySQL and PostgreSQL. Suggestion by Karsten Dambekalns
3.94 11 Oct 2003
Create trigger in datadict-oci8.inc.php did not work, because all cr/lf's must be removed.
ErrorMsg()/ErrorNo() did not work for many databases when logging enabled. Fixed.
Removed global variable $ADODB_LOGSQL as it does not work properly with multiple connections.
Added SQLDate support for sybase. Thx to Chris Phillipson
Postgresql checking of pgsql resultset resource was incorrect. Fix by Bharat Mediratta bharat#menalto.com. Same patch applied to _insertid and _affectedrows for adodb-postgres64.inc.php.
Added support for NConnect for postgresql.
Added Sybase data dict support. Thx to Chris Phillipson
Extensive improvements in $perf->UI(), eg. Explain now opens in new window, we show scripts which call sql, etc.
Perf Monitor UI works with magic quotes enabled.
rsPrefix was declared twice. Removed.
Oci8 stored procedure support, eg. "begin func(); end;" was incorrect in _query. Fixed.
Tiraboschi Massimiliano contributed italian language file.
Fernando Ortiz, fortiz#lacorona.com.mx, contributed informix performance monitor.
Added _varchar (varchar arrays) support for postgresql. Reported by PREVOT St?hane.
3.92 22 Sept 2003
Added GetAssoc and CacheGetAssoc to connection object.
Removed TextMax and CharMax functions from adodb.inc.php.
HasFailedTrans() returned false when trans failed. Fixed.
Moved perf driver classes into adodb/perf/*.php.
Misc improvements to performance monitoring, including UI().
RETVAL in mssql Parameter(), we do not append @ now.
Added Param($name) to connection class, returns '?' or ":$name", for defining bind parameters portably.
LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8 _stmt and _affectedrows() bugs.
Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also added new $conn->datetime field to oci8, controls whether MetaType() returns 'D' ($this->datetime==false) or 'T' ($this->datetime == true) for DATE type.
Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php.
Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL().
Tuned include_once handling to reduce file-system checking overhead.
3.91 9 Sept 2003
Only released to InterAkt
Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory for driver instantiation.
Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com
Added portable substr support.
Now rs2html() has new parameter, $echo. Set to false to return $html instead of echoing it.
3.90 5 Sept 2003
First beta of performance monitoring released.
MySQL supports MetaTable() masking.
Fixed key_exists() bug in adodb-lib.inc.php
Added sp_executesql Prepare() support to mssql.
Added bind support to db2.
Added swedish language file - Christian Tiberg" christian#commsoft.nu
Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich.
Left join setting for oci8 was wrong. Thx to johnwilk#juno.com
3.80 27 Aug 2003
Patch for PHP 4.3.3 cached recordset csv2rs() fread loop incompatibility.
Added matching mask for MetaTables. Only for oci8, mssql and postgres currently.
Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano.
Added better debugging for Smart Transactions.
Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP.
ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define it after including adodb.inc.php.
Added portugese (brazilian) to languages. Thx to "Levi Fukumori".
Removed arg3 parameter from Execute/SelectLimit/Cache* functions.
Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute() to note change in sql query counting with 2-d arrays.
Added MONEY to MetaType in PostgreSQL.
Added more debugging output to CacheFlush().
3.72 9 Aug 2003
Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes and does the right thing...
Fixed CacheFlush() bug - Thx to martin#gmx.de
Walt Boring contributed MetaForeignKeys for postgres7.
_fetch() called _BlobDecode() wrongly in interbase. Fixed.
adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980
3.71 4 Aug 2003
The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner == false.
Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com.
Error handling in oci8 bugfix - if there was an error in Execute(), then when calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but the 2nd call would return no error.
Error handling in odbc bugfix. ODBC would always return the last error, even if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to 0 everytime before CacheExecute() and Execute().
3.70 29 July 2003
Added new SQLite driver. Tested on PHP 4.3 and PHP 5.
Added limited "sapdb" driver support - mainly date support.
The oci8 driver did not identify NUMBER with no defined precision correctly.
Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls in GetInsertSQL/GetUpdateSQL.
DBDate() and DBTimeStamp() format for postgresql had problems. Fixed.
Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit.
Added charset support to postgresql. Thx to Julian Tarkhanov.
Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS)
Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn.
adodb-cryptsession.php includes wrong. Fixed.
Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8.
Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring.
adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn.
Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring.
Upgraded to adodb-xmlschema.inc.php 0.0.2.
NConnect for mysql now returns value. Thx to Dennis Verspuij.
ADODB_FETCH_BOTH support added to interbase/firebird.
Czech language file contributed by Kamil Jakubovic jake#host.sk.
PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec.
Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it
ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed.
3.60 16 June 2003
We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with mssql driver.
The property $emptyDate missing from connection class. Also changed 1903 to constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn.
ADOdb speedup optimization - we now return all arrays by reference.
Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter. Suggested by vincent.
Added GetArray() to connection class.
Added not_null check in informix metacolumns().
Connection parameters for postgresql did not work correctly when port was defined.
DB2 is now a tested driver, making adodb 100% compatible. Extensive changes to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit() fixes.
The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed.
Some bugs in adodb_backtrace() fixed.
Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql properly.
MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions to odbc MetaColumns() for vfp and db2 compat.
Added unsigned support to mysql datadict class. Thx to iamsure.
Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to Josh R, Night_Wulfe#hotmail.com.
ChangeTableSQL contributed by Florian Buzin.
The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with mssql driver.
0.10 Sept 9 2000 First release
'PHP관련' 카테고리의 다른 글
[openX] 광고서버 openx 다운받기 :: 오픈소스 (0) | 2012.06.01 |
---|---|
FREETDS를 이용해 LINUX-PHP에서 원격의 MS-SQL 연결하기 (0) | 2011.10.14 |
Linux에서의 ODBC설정 입니다 (0) | 2011.10.14 |
header - 웹에서 엑셀파일 만들기 (0) | 2011.10.14 |
Smarty 를 윈도우에서 설치하기 (0) | 2011.10.14 |