include_path 에 지정된 패스에 아래와 같이 파일을 넣으시면 됩니다.

공통
SHJ/debug.inc
SHJ/DB/CommonSQL.inc

DBMS별
SHJ/DB/MySQL.inc
SHJ/DB/MSSQL.inc
SHJ/DB/ORACLE.inc
SHJ/DB/PostgreSQL.inc
SHJ/DB/SQLite.inc



- debug.inc

인클루드 하면 error_reporting(E_ALL) 로 맞춰집니다.
notice 레벨의 에러에도 프로세스를 멈춥니다.

에러에 반응하는 try catch 구문을 이용하기 위해 사용됩니다.

$_DEBUG = true;
선언을 하면,
에러 발생시 backtrace 까지 보여줍니다.


기본 사용 방법
try {
	에러나는 구문 (문법에러 제외)
} catch(Exception $e) {
	echo $e->getMessage();
}


활용 예
try {
	$im = createimagefromgif('test.gif');
} catch(Exception $e) {
	$im = createimage(100, 100);
}



- CommonSQL.inc

MySQL 기준 unsigned 정수형의 최대값들이 define 되어 있습니다.
SQL_BIGINT
SQL_INT
SQL_MEDIUMINT
SQL_SMALLINT
SQL_TINYINT

SQL 용 escape 함수가 들어 있습니다.

string sql_escape_like(string)
LIKE 문을 위해 %, _ 를 escape 합니다.


string sql_escape_string(string)
SQL 구문에 맞게 escape 합니다.
\ -> \\
\r\n, \r -> \n (이것은 1바이트 아끼려는 제 취향이므로 수정하셔도 무방합니다.)
' -> ''
\0 -> \0 ( 0x00 을 \0 문자열로 치환합니다.)


htmlTable make_table(array data, [array title])
SHJSQL::fetch_assoc_all() 로 리턴받은 변수와, 제목이 담긴 변수를 넣으면,
테이블을 생성해 줍니다.
디버그용으로 제작하였습니다.

예제
$data = $sql->fetch_assoc_all();
foreach($data[0] as $key => $value) {
	$title[] = $key;
}
echo make_table($data, $title);





개별 클래스의 공통적인 부분을 설명하면서 달라지는 부분의 설명을 첨가합니다.
[] 로 감싼 인자는 생략 가능하다는 표시이며, bool 을 제외한 인자는 null 을 넣어서 생략할 수 있습니다.

class SHJMySQL(conninfo.ini, [persistent bool], [character set])
class SHJMSSQL(conninfo.ini, [persistent bool])
class SHJORACLE(conninfo.ini, [persistent bool], [character set])
class SHJPostgreSQL(conninfo.ini, [persistent bool], [character set])
class SHJSQLite(db file)

conninfo.ini 파일은 ini 형식으로 작성하시면 됩니다.
웹에서 접근 못하는 디렉토리에 작성하세요.
; 으로 주석을 달 수 있습니다.

MySQL, PostgreSQL
host = ip주소
user = account
pass = 암호
db = DB명

MSSQL, ORACLE
dsn = dsn명(freetds.conf / tnsnames.ora 설정)
user = account
pass = 암호
db = DB명 (생략가능)

SQLite
DB 파일에 직접 접근하므로 작성하지 않습니다.


persistent : php 에서는 pconnect 함수를 제공합니다.
default false 이며 true 일 경우 pconnect 함수를 통해 연결합니다.

character set : 접속시에 기본 캐릭터셋 이외의 것으로 변경해야 할 경우 각 DBMS 에서 지원하는 캐릭터 셋으로 지정할 수 있습니다.
MySQL : utf8, euckr (http://dev.mysql.com/doc/mysql/en/charset-mysql.html) : SET NAMES 쿼리를 실행합니다.
MSSQL : freetds.conf 에 설정.
ORACLE : 사용하지 마십시오.
PostgreSQL : UNICODE, EUC_KR (http://kr.php.net/manual/en/function.pg-set-client-encoding.php) : pg_set_client_encoding() 함수를 실행합니다.
SQLite : UTF-8 을 지원하도록 컴파일 하는 정도만 지원됩니다.


$sql = new SHJMySQL(dbconn.ini); 를 한것으로 가정하고 설명을 진행합니다.

Transaction
$sql->begin();
$sql->commit();
$sql->rollback();



$sql->close();
연결을 닫습니다. begin 후 commit 안되었다면 rollback 합니다.

__destruct() 에서 $this->close() 를 호출합니다.
그러므로 begin 후 exit; 등으로 강제 종료되면 rollback 되게 됩니다.



$sql->query('query text');
쿼리를 실행합니다.
오류발생시 몇번째 쿼리인지가 카운트 됩니다.
$_DEBUG = true; 일 경우 쿼리문과 backtrace 가 출력됩니다.


$sql->select(array table name,
	array field name,
	[array where conditions],
	[array order by conditions],
	offset, limit);
$sql->exec();

offset, limit 구문이 없는 MSSQL, ORACLE 은 용도에 맞게 SELECT 문이 작성됩니다.
ORACLE 의 경우 SR숫자 로 테이블명이 임의 할당되게 됩니다.

array 부분은 한 필드인 경우 문자열로 대체 가능합니다.

where conditions 배열은 AND 로 연결합니다.
OR 연산은 한 문장 안에 넣으세요.


$sql->query 변수에 쿼리가 저장되고,
select 의 경우만 $sql->exec(); 를 호출하여 실행합니다.
서브쿼리 등에 활용하고자 선택한 방식인데, 아직 효용성은 모르겠습니다.


예제
$sql->select('test',
	array('a', 'b', 'c'),
	'c < 10',
	'b DESC',
	10, 10);

echo $sql->query;
$sql->exec();


$tables[] = 'table1 t1';
$tables[] = 'table2 t2';

$fields[] = 't1.a';
$fields[] = 't2.b';

$wheres[] = 't1.a = t2.a';
$wheres[] = 't2.b > 10';

$orders[] = 't1.a DESC';
$orders[] = 't2.b';
$sql->select($tables,
	$fields,
	$wheres,
	$orders,
	10, 10);



$field = $sql->field([int row], [int column or column name]);
ORACLE 은 인자를 받지 않습니다.

$fields = $sql->fetch();
object 로 반환합니다.

$fields = $sql->fetch_row();
숫자 배열로 반환합니다.

$fields = $sql->fetch_assoc();
문자 배열로 반환합니다.

$rows = $sql->fetch_all();
$rows = $sql->fetch_row_all();
$rows = $sql->fetch_assoc_all();
전체 반환합니다.

데이터가 없을 경우 false 를 반환합니다.

이런식으로 사용하세요.
if(false === ($fields = $sql->fetch())) {
	데이터 없음.
}



$count = $sql->rows();
result 수를 반환합니다.
ORACLE 은 지원하지 않습니다.



$lastid = $sql->id(['sequence']);
Auto Increment 값을 반환합니다.
오직 insert 후에만 사용할 수 있습니다.

MySQL, MSSQL, SQLite 은 인자를 받지 않습니다.
ORACLE 은 tableName_seq 로 시퀀스를 만들었을 경우 인자를 생략할 수 있습니다.
PostgreSQL 은 PK 에 default 값으로 nextval 이 들어있는 경우 인자를 생략할 수 있습니다. (생략시 약간의 쿼리가 발생합니다.)



$affected = $sql->affected_rows();
insert, update, delete 등에 적용된 row 수를 반환합니다.



$sql->insert(table name,
	array fields);
INSERT 문을 실행합니다.
필드가 문자열인지를 판단해서 '' 를 씌웁니다.
숫자형 필드라도 0으로 시작하면 '' 를 씌웁니다.

'' 를 씌우지 말아야 하는 필드는 define 된 CHR00 을 앞에 붙여줍니다.

ORACLE CLOB 을 자동으로 처리하려는데 마땅한 방법이 떠오르지 않는군요.
미지원입니다.

예제
$fields['a'] = 'a';
$fields['b'] = sql_escape_string(trim($_GET['test']));
$fields['c'] = CHR00.'NOW()';
$fields['d'] = CHR00.'d+1';

$sql->insert('test',
	$fields);


$data = $sql->fetch_assoc();
$sql->insert('test',
	$data);


$sql->insert_all(table name,
	array rows);
여러 rows 를 한번에 insert 합니다.
MySQL, PostgreSQL 만 지원합니다.
500건씩 나누어 쿼리합니다.
MySQL 은 (), (), () 의 형태로 쿼리하고,
PostgreSQL 은 COPY 를 이용합니다.

예제
$data = $sql->fetch_assoc_all();
$sql->insert_all('test',
	$data);



$sql->update(table name,
	array fields,
	array where conditions);



$sql->replace(table name,
	array fields,
	[PK]);
MySQL 의 REPLACE 문입니다.
프로그램이 명확해지기 위해서는 이건 없는게 좋다는 생각입니다.
본 라이브러리로 작성되지 않은 MySQL 로 개발된 PHP 프로그램의 포팅 속도를 높이고자 넣었습니다.
MySQL, SQLite 에서는 원래 지원 되므로 PK 없이 사용합니다.
ORACLE, PostgreSQL 에서는 생략 가능하나 약간의 쿼리가 발생합니다. (단일 키 에서만 정상 동작합니다. 키가 여러개라면 엉뚱한것을 지워먹을 수 있으니 주의하십시오.)
MSSQL 은 지원하지 않습니다.



$sql->delete(table name,
	array where conditions);
where 절 없이 동작하지 않도록 작성되었습니다.

$sql->truncate(table name);
table 을 완전히 비우는 명령입니다.