PHP-DbHandler는 MySQL 데이터베이스와의 상호 작용을 단순화하도록 설계된 PHP 라이브러리입니다. 쿼리 작성 및 실행, 트랜잭션 관리, PDO 연결을 통한 데이터베이스 스키마 처리를 위한 포괄적인 도구 세트를 제공합니다.
Where
및 Having
절 만들기or
및 and
연산자Composer를 통해 패키지를 설치합니다.
composer require tribal2/db-handler
Db
인스턴스를 생성하여 시작합니다.
use Tribal2 DbHandler Core PDOWrapper ;
use Tribal2 DbHandler Db ;
use Tribal2 DbHandler DbConfig ;
$ config = DbConfig:: create ( ' my_database ' )
-> withUser ( ' username ' )
-> withPassword ( ' password ' )
-> withHost ( ' localhost ' ) // Optional. Default: 'localhost'
-> withPort ( 3306 ) // Optional. Default: 3306
-> withCharset ( ' utf8mb4 ' ); // Optional. Default: 'utf8mb4'
$ pdoWrapper = new PDOWrapper (
$ config ,
// Optional PsrLogLoggerInterface instance.
// $logger, // Default: PsrLogNullLogger
);
$ db = new Db (
$ pdoWrapper ,
// Optional PsrSimpleCacheCacheInterface instance.
// $cache, // Default: NULL
);
Where
및 Having
절 만들기Where 클래스는 쿼리 조건을 구성하는 유연하고 직관적인 방법을 제공합니다. 다양한 비교 및 논리 연산자를 지원하므로 데이터베이스에서 데이터를 선택하거나 필터링하기 위한 기준을 정확하게 정의할 수 있습니다.
이 메서드는 안전하고 효율적인 쿼리를 위해 매개변수화된 값과 함께 조건을 캡슐화하는 Where 개체를 반환합니다.
Where 절은 쿼리 구문 구성을 단순화할 뿐만 아니라 SQL 삽입과 관련된 위험을 내부적으로 관리하여 보안을 강화합니다. 이 라이브러리는 자동으로 값을 PDO 명명된 매개변수로 바꾸고 적절한 PDO 데이터 유형을 사용하여 바인딩을 수행합니다. 이러한 중요한 측면을 처리함으로써 쿼리가 깔끔하고 유지 관리가 용이할 뿐만 아니라 보안도 보장됩니다.
더 이상 데이터베이스 쿼리에 대한 입력을 수동으로 삭제하는 것에 대해 걱정할 필요가 없습니다. 라이브러리는 데이터베이스 기반 애플리케이션에서 가장 일반적인 보안 취약점 중 하나인 SQL 주입을 방지하는 방식으로 명령문 준비를 관리합니다. 이 접근 방식을 사용하면 데이터베이스 상호 작용이 안전하고 효율적으로 처리된다는 것을 신뢰하면서 애플리케이션의 비즈니스 논리에 집중할 수 있습니다.
$ where = Where:: equals ( ' status ' , ' active ' );
// Output: `status` = :status___1
$ where = Where:: notEquals ( ' category ' , ' archived ' );
// Output: `category` <> :category___1
$ where = Where:: greaterThan ( ' price ' , 100 );
// Output: `price` > :price___1
$ where = Where:: greaterThanOrEquals ( ' price ' , 100 );
// Output: `price` >= :price___1
$ where = Where:: lessThan ( ' price ' , 50 );
// Output: `price` < :price___1
$ where = Where:: lessThanOrEquals ( ' price ' , 50 );
// Output: `price` <= :price___1
$ where = Where:: isNull ( ' description ' );
// Output: `description` IS NULL
$ whereNotNull = Where:: isNotNull ( ' description ' );
// Output: Output: `description` IS NOT NULL
$ where = Where:: like ( ' name ' , ' %Apple% ' );
// Output: `name` LIKE :name___1
$ where = Where:: notLike ( ' name ' , ' %Apple% ' );
// Output: `name` NOT LIKE :name___1
$ where = Where:: between ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` BETWEEN :date___1 AND :date___2
$ where = Where:: notBetween ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` NOT BETWEEN :date___1 AND :date___2
$ where = Where:: in ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` IN (:status___1, :status___2, :status___3)
$ where = Where:: notIn ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` NOT IN (:status___1, :status___2, :status___3)
or
및 and
연산자 $ where1 = Where:: equals ( ' status ' , ' active ' );
$ where2 = Where:: greaterThan ( ' price ' , 100 );
$ orWhere = Where:: or ( $ where1 , $ where2 );
// Output: (`status` = :status___1 OR `price` > :price___1)
$ andWhere = Where:: and ( $ where1 , $ where2 );
// Output: (`status` = :status___1 AND `price` > :price___1)
or
및and
연산자를 중첩할 수도 있습니다.
$ where3 = Where:: equals ( ' category ' , ' archived ' );
$ combinedWhere = Where:: and ( $ where3 , $ orWhere );
// Output: (`category` = :category___1 AND (`status` = :status___1 OR `price` > :price___1))
다음 하위 섹션에서는 이 라이브러리를 사용하여 쿼리를 생성하고 실행하는 방법을 살펴보겠습니다. 단순화를 위해 $db
변수가 Db
클래스의 인스턴스라고 가정합니다.
아래의 모든 예에서는 쿼리 구성과 실행을 분리했습니다. 이 접근 방식을 사용하면 쿼리 개체를 재사용하고 다양한 매개 변수를 사용하여 여러 번 실행할 수 있지만 다음과 같이 단일 문에서 메서드를 연결하여 쿼리를 생성하고 실행할 수도 있습니다.
$ results = $ db
-> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 ))
-> fethAll ();
$ select = $ db -> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> column ( ' column3 ' )
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 )) // See "Where Clauses" section above
-> groupBy ( ' column1 ' )
-> having (Where:: equals ( ' sum(column2) ' , 5 ))
-> orderBy ( ' column3 ' , ' ASC ' )
-> limit ( 10 )
-> offset ( 5 );
$ sql = $ select -> getSql ();
// $sql:
// SELECT
// `column1`,
// `column2`,
// `column3`
// FROM
// `table_name`
// WHERE
// `column2` = :column2___1
// GROUP BY
// `column1`
// HAVING
// `sum(column2)` = :sum_column2____1
// ORDER BY
// `column3` ASC
// LIMIT
// 10
// OFFSET
// 5;
결과 가져오는 중:
기본적으로 fetchAll()
메소드는 객체 배열을 반환합니다(기본적으로 PDO::FETCH_OBJ
사용). 여기서 각 객체는 데이터 행을 나타냅니다. 쿼리를 실행하기 전에 PDO::FETCH_ASSOC
상수를 fetchMethod()
빌더 메서드에 인수로 전달하여 결과를 연관 배열의 배열로 가져올 수도 있습니다.
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
// Output: object(FetchResult) {
// data => array(n) {
// [0]...
// [1]...
// [n-1]...
// },
// count => int(n)
// }
다음을 사용하여 결과 수를 가져올 수도 있습니다.
$ countResults = $ select -> fetchCount ();
// Output: 5
쪽수 매기기:
대규모 데이터 세트를 효율적으로 처리하고 데이터 탐색을 위한 사용자 친화적인 인터페이스를 제공하는 것은 모든 강력한 애플리케이션에 필수적입니다. PHP-DbHandler의 페이지 매김 기능은 이러한 요구 사항을 우아하게 해결합니다. 이는 데이터를 관리 가능한 청크 또는 "페이지"로 나누는 프로세스를 단순화하여 시스템이나 사용자에게 부담을 주지 않으면서 대규모 데이터 세트 작업을 더 쉽게 만듭니다.
페이지 매김 설정
쿼리에 대한 페이지 매김을 설정하는 방법에는 두 가지가 있습니다.
페이지 매기기 방법 사용: 이 방법을 사용하면 페이지당 항목 수를 간결하게 정의할 수 있습니다. 이는 페이지 매김을 위한 쿼리를 준비하는 효율적인 방법입니다.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> paginate (itemsPerPage: 10 );
수동으로 제한 및 오프셋 설정: 더 많은 제어를 위해 쿼리에 대한 제한(페이지당 항목 수) 및 오프셋(데이터세트의 시작점)을 수동으로 지정할 수 있습니다.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> limit ( 10 )
-> offset ( 0 );
페이지 매김으로 결과 가져오기
페이지 매김이 설정되면 데이터 세트를 쉽게 탐색하면서 다양한 방법으로 결과를 가져올 수 있습니다.
fetchPage(?int $page)
: 현재 또는 특정 페이지를 가져옵니다.fetchNextPage()
: 다음 페이지에 대한 결과를 가져옵니다.fetchPreviousPage()
: 이전 페이지에 대한 결과를 가져옵니다.fetchFirstPage()
: 첫 번째 페이지에 대한 결과를 가져옵니다.fetchLastPage()
: 마지막 페이지에 대한 결과를 가져옵니다. 이러한 각 메서드는 다음 속성을 포함하는 FetchPaginatedResult
개체를 반환합니다.
data
: 현재 페이지의 레코드 배열입니다.count
: 데이터 세트의 총 레코드 수입니다.page
: 현재 페이지 번호입니다.perPage
: 페이지당 레코드 수입니다.totalPages
: 총 페이지 수입니다. // Example output structure of FetchPaginatedResult
object (FetchPaginatedResult) {
data => array (n) {
[ 0 ]. . .
[ 1 ]. . .
[n- 1 ]. . .
},
count => int(n),
page => int( 10 ),
perPage => int( 10 ),
totalPages => int( 23 )
}
PHP-DbHandler의 이 페이지 매김 시스템을 사용하면 대규모 데이터 세트를 효과적으로 관리하고 탐색할 수 있어 애플리케이션의 전반적인 성능과 사용자 경험이 향상됩니다.
캐싱:
오늘날의 데이터 기반 애플리케이션에서는 효율성과 성능이 핵심입니다. 데이터베이스 상호 작용에서 이러한 측면을 향상시키기 위해 라이브러리에는 Select
쿼리 내에 캐싱 기능이 포함되어 있습니다. 이 기능은 쿼리 결과를 캐싱하여 성능을 향상시켜 데이터베이스 부하를 줄이고 자주 실행되는 쿼리에 대한 응답 시간을 향상시킵니다. 중요한 것은 PSR-16(Simple Cache) 표준을 완벽하게 준수하도록 설계되어 광범위한 호환성과 유연성을 보장한다는 것입니다.
PSR-16 호환 캐싱
Select 쿼리 내의 캐싱 기능은 PsrSimpleCacheCacheInterface를 구현하는 모든 캐시 인스턴스를 허용합니다. PSR-16 표준을 준수한다는 것은 이 인터페이스를 준수하는 광범위한 캐싱 라이브러리를 원활하게 통합할 수 있음을 의미하며, 애플리케이션 요구 사항에 가장 적합한 캐싱 솔루션을 선택할 수 있는 유연성을 제공합니다.
Db
클래스를 초기화할 때 PsrSimpleCacheCacheInterface
인스턴스가 제공된 경우 이 단계를 건너뛸 수 있습니다. 그렇지 않은 경우 setCache
메소드를 사용할 수 있습니다. $ select = $ db -> select ()-> setCache ( $ simpleCacheInstance );
참고:
Db
클래스를 초기화할 때 캐시 인스턴스를 제공하지 않은 경우 캐시하려는 각Select
쿼리에 대해 이를 설정해야 합니다.Select
쿼리에 대해 특정 캐시 인스턴스를 설정하려는 경우에도 이 방법을 사용할 수 있습니다. 이를 통해 애플리케이션의 요구 사항에 따라 다양한 쿼리에 다양한 캐싱 솔루션을 사용할 수 있습니다.
withCache
메서드를 사용하여 쿼리에 대한 캐싱을 활성화하고 구성합니다. 누락된 캐시 항목에 대한 기본 반환 값과 캐시된 데이터에 대한 TTL(Time To Live)을 지정할 수 있습니다. $ select -> withCache (defaultValue, ttl);
참고:
defaultValue
인수는 선택 사항입니다. 제공되지 않으면 라이브러리는 누락된 캐시 항목에 대해NULL
반환합니다.ttl
인수는 선택 사항입니다. 제공되지 않으면 라이브러리는 PsrSimpleCache 인스턴스에 의해 설정된 TTL 값을 사용합니다.
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
주요 이점
PHP-DbHandler 라이브러리의 Insert
클래스는 데이터베이스에서 삽입 쿼리를 생성하고 실행하는 프로세스를 간소화합니다. 다양한 특성과 인터페이스를 갖춘 이 클래스는 다양한 고급 기능을 사용하여 삽입 작업을 처리하는 정교한 접근 방식을 제공합니다.
쿼리 생성
Insert
클래스를 사용하면 삽입할 열에 값을 동적으로 할당할 수 있습니다. 단일 값 또는 여러 값을 한 번에 추가할 수 있습니다. $ insert = $ db -> insert ()
-> into ( ' table_name ' )
-> value ( ' column1 ' , ' value1 ' )
-> values ([ ' column2 ' => ' value2 ' , ' column3 ' => ' value3 ' ]);
클래스는 값을 추가하기 전에 테이블에 열이 있는지 확인하고 필요한 PDO 바인딩도 처리합니다.
$ rows = [
[ ' column1 ' => ' value1 ' , ' column2 ' => ' value2 ' ],
[ ' column1 ' => ' value3 ' , ' column2 ' => ' value4 ' ],
// ...
];
$ insert -> rows ( $ rows );
실행
$ success = $ insert -> execute ();
체크 무늬
삽입 작업을 실행하기 전에 클래스는 자동으로 다음을 확인합니다.
- 데이터베이스가 읽기 전용 모드 인 경우 의도하지 않은 쓰기 작업을 방지합니다.
- 자동 증가가 아닌 기본 키에 충돌이 있는 경우 데이터 무결성을 보장합니다.
Insert
클래스는 데이터베이스에서 삽입 작업을 처리하기 위한 포괄적인 솔루션으로, 복잡한 삽입 작업을 효율적으로 관리하기 위한 사용 편의성과 고급 기능을 모두 제공합니다.
PHP-DbHandler 라이브러리의 Update
클래스는 데이터베이스에서 업데이트 쿼리를 구성하고 실행하는 정교하고 유연한 방법을 제공합니다. 업데이트 작업을 효과적으로 관리할 수 있는 강력한 기능을 제공하는 동시에 기존 데이터베이스 구조와 원활하게 통합되도록 설계되었습니다.
쿼리 생성
$ update = $ db -> update ()
-> table ( ' table_name ' )
-> set ( ' column1 ' , ' newValue1 ' )
-> set ( ' column2 ' , ' newValue2 ' );
```
2. **Conditional Updates**: Incorporate conditions into your update queries using the `where` method. This allows for precise targeting of records to be updated.
``` php
$ update -> where (Where:: equals ( ' column3 ' , ' conditionValue ' ));
실행
$ success = $ update -> execute ();
읽기 전용 모드 확인 : 클래스는 실행 전에 데이터베이스가 읽기 전용 모드인지 확인하여 의도하지 않은 쓰기 작업을 방지합니다.
Update
클래스는 데이터베이스에서 업데이트 작업을 구성하고 실행하기 위한 포괄적인 솔루션을 나타냅니다. 유연성, 견고성 및 사용 용이성이 결합되어 PHP 애플리케이션에서 데이터베이스 업데이트를 관리하는 데 이상적인 선택입니다.
PHP-DbHandler 라이브러리의 Delete
클래스는 데이터베이스에서 삭제 쿼리를 구성하고 실행하는 정교한 접근 방식을 제공합니다. 이 클래스는 최적의 쿼리 처리를 위해 필수 검사와 기능을 통합하여 삭제 작업이 정확하고 안전하게 수행되도록 보장합니다.
쿼리 생성
이 클래스를 사용하면 조건식을 사용하여 삭제할 레코드를 정확하게 타겟팅할 수 있습니다. 이는 where
메소드를 통해 달성되며, 주어진 기준에 따라 특정 행을 선택하여 삭제하도록 할 수 있습니다.
$ delete = $ db -> delete ()
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column ' , ' value ' ));
필수 Where 절 : 테이블의 모든 레코드가 실수로 삭제되는 것을 방지하려면 클래스에
WHERE
절을 지정해야 합니다. 이는 의도하지 않은 대량 삭제를 방지하는 역할을 합니다.
실행
$ success = $ delete -> execute ();
클래스는 삭제 작업을 실행하기 전에 테이블 존재 여부 확인, 데이터베이스가 읽기 전용 모드에 있지 않은지 확인하는 등 필수 검사를 수행합니다.
Delete
클래스는 높은 수준의 제어와 안전성을 바탕으로 삭제 작업을 처리하도록 설계되었습니다. 이는 데이터베이스의 구조와 제약 조건을 고려하여 삭제가 정확하게 수행되도록 보장합니다. 간단한 삭제 작업을 수행하든 복잡한 삭제 작업을 수행하든 이 클래스는 해당 작업을 안정적이고 안전하게 실행하는 데 필요한 도구를 제공합니다.
PHP-DbHandler 라이브러리의 StoredProcedure
클래스는 데이터베이스에서 저장 프로시저를 실행하는 간소화되고 효율적인 접근 방식을 제공합니다. 이 클래스는 저장 프로시저와 상호 작용하고 매개 변수 관리, 실행 및 결과 가져오기를 쉽게 처리하는 강력한 방법을 제공합니다.
쿼리 생성
저장 프로시저 호출 설정 : 동적 매개변수 관리를 통해 저장 프로시저에 대한 호출을 쉽게 설정합니다. 프로시저 이름과 필요한 매개변수를 지정하십시오.
$ procedure = $ db -> storedProcedure ()
-> call ( ' procedure_name ' )
-> with ( ' paramName ' , $ value )
// ...
-> with ( ' paramName2 ' , $ value );
실행
$ results = $ procedure -> execute ();
읽기 전용 모드 검사 : 실행 전에 클래스는 데이터베이스가 읽기 전용 모드에 있는지 확인하여 쓰기 작업이 실수로 수행되지 않도록 합니다.
StoredProcedure
클래스는 PHP 애플리케이션 내에서 저장 프로시저 호출을 처리하는 데 없어서는 안 될 도구입니다. 이는 저장 프로시저와의 상호 작용을 단순화하여 특히 복잡한 데이터베이스 작업에 크게 의존하는 응용 프로그램에서 프로세스를 더욱 직관적으로 만들고 오류 발생 가능성을 줄입니다.
데이터베이스 트랜잭션 관리는 특히 복잡한 데이터 조작을 처리하는 애플리케이션에서 데이터 무결성을 보장하는 데 있어 중요한 측면입니다. PHP-DbHandler는 이 프로세스를 단순화하여 트랜잭션을 처리하는 직관적이고 간단한 방법을 제공합니다.
제공된 트랜잭션 관리 기능을 사용하면 트랜잭션을 쉽게 시작, 커밋 또는 롤백할 수 있어 데이터베이스 작업을 완벽하게 제어할 수 있습니다. 이를 통해 일련의 데이터베이스 작업이 완전히 완료되거나 전혀 완료되지 않는 단일 원자 단위로 처리될 수 있으므로 데이터의 일관성과 신뢰성이 유지됩니다.
$ db -> transaction -> begin ();
$ db -> transaction -> commit ();
$ db -> transaction -> rollback ();
이 기능은 여러 관련 데이터베이스 작업을 함께 실행해야 하는 시나리오에서 특히 유용합니다. 트랜잭션 내의 작업이 실패하면 롤백 방법을 사용하여 트랜잭션 시작부터 변경된 모든 내용을 되돌릴 수 있으므로 데이터 불일치로 이어질 수 있는 부분 업데이트를 방지할 수 있습니다. 반대로 모든 작업이 성공하면 commit 메서드는 모든 변경 사항을 데이터베이스에 저장합니다.
이러한 트랜잭션 제어를 활용하는 PHP-DbHandler는 애플리케이션의 데이터 관리가 강력하고 일관되며 오류 복원력이 있음을 보장합니다. 복잡한 데이터 입력, 업데이트 또는 일괄 프로세스를 처리하는 경우 이러한 트랜잭션 기능은 데이터베이스 작업을 효과적으로 관리하는 데 필요한 도구를 제공합니다.
Transaction
클래스는 복잡한 트랜잭션 시나리오를 관리하기 위한 강력한 기능도 도입합니다. 이 기능을 사용하면 트랜잭션 커밋을 전역적으로 제어할 수 있으며, 특히 하나의 포괄적인 트랜잭션 컨텍스트에서 트랜잭션을 사용하는 여러 메서드를 포함하려는 경우에 유용합니다.
전 세계적으로 거래 처리
자동 커밋을 비활성화하여 더 큰 트랜잭션의 일부로 여러 트랜잭션 작업을 관리할 수 있습니다. 이는 각각 독립적으로 트랜잭션을 처리할 수 있는 여러 작업을 단일 원자 트랜잭션의 일부로 실행해야 하는 시나리오에서 특히 유용합니다.
// Begin a transaction
$ db -> transaction -> begin ();
// Disable automatic commits
$ db -> transaction -> setCommitsModeOff ();
// Execute other methods that use transactions
// $db->transaction->begin();
// ...
// $db->transaction->commit();
// Re-enable automatic commits
$ db -> transaction -> setCommitsModeOn ();
// Commit the transaction
$ db -> transaction -> commit ();
이 기능은 트랜잭션 작업에 대한 제어를 향상시켜 보다 복잡하고 안정적인 데이터 조작 시나리오를 허용합니다. 이는 글로벌 트랜잭션 범위 내에서 이루어진 모든 변경 사항이 함께 커밋되거나 롤백되어 데이터 무결성과 일관성을 유지하도록 보장합니다.
우리는 프로젝트에 대한 기여를 높이 평가하고 환영합니다! 기여에 관심이 있다면 CONTRIBUTING.md 파일을 읽어 시작 방법, 기여 제출 지침, 프로세스를 최대한 쉽고 효과적으로 만드는 방법에 대한 자세한 정보를 읽어보세요.
버그 수정, 기능 추가, 문서 개선 등 어떤 작업을 하든 여러분의 기여에 감사드리며 프로젝트에 큰 영향을 미칩니다.
코딩하기 전에 질문이 있거나 아이디어를 논의하고 싶다면 GitHub 문제 페이지에서 자유롭게 문제를 열어 토론해 보세요.
귀하의 기꺼이 기여해 주셔서 감사드리며 귀하의 제출을 기대합니다!
이 라이브러리는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
지원을 받으려면 GitHub 저장소의 문제 페이지인 GitHub 문제를 방문하세요.