작업이 너무 많아서 이 프로젝트를 해체했습니다. 처음에는 아이디어가 어리석은 것처럼 보였지만 페이지 매김에 많은 문제가 발견될 때까지 실제로 작동했으며 성능 측면에서는 클러스터링이 가장 좋을 것이라고 생각합니다. 이 프로젝트를 만드는 것은 즐거웠습니다.
이것은 PDO를 사용하여 여러 MySQL 데이터베이스에 연결할 수 있는 무료 이며 사용하기 쉽고 가볍고 강력한 PHP 라이브러리입니다. 저는 이것을 MySQL용으로 특별히 구축했지만 이것이 PostgreSQL, MariaDB, CouchDB 등에서 작동할 것이라고 믿습니다. 이것은 SQL 데이터베이스용이므로 MongoDB 및 Apache Cassandra와 같은 데이터베이스 관리 시스템에서는 작동하지 않습니다.
✔ PDO를 사용하여 여러 MySQL 데이터베이스에 연결합니다.
✔ 여러 데이터베이스에서 행을 검색합니다.
✔ 모든 데이터베이스의 모든 테이블에 새 행을 추가하는 대신 단 하나의 쿼리만 수행하여 효율적으로 삽입 쿼리를 수행합니다.
✔ 결과/행을 쉽게 정렬, 제한 및 관리할 수 있습니다.
✔ 데이터베이스를 추가하기만 하면 쉽게 확장할 수 있습니다(슬레이브, 마스터 또는 클러스터를 사용할 필요 없음).
✔ 진정한 고유 식별자(MDGUID라고 함)를 생성합니다.
➔ PHP 7+ 및 Apache/Nginx(PHP 7 이상의 기능 사용).
➔ MySQL 5.7+(MySQL 5.7이 잘 작동한다는 점을 명확히 하기 위해 MySQL 5.7보다 높은 버전이면 좋습니다.)
➔ PDO 호환 데이터베이스 드라이버(자세한 내용은 여기에서 확인하세요).
귀하는 다음 조건에 따라 개인, 교육 및 상업적 용도로 MultiDatabasePDO 사용할 수 있습니다:
➔ 귀하는 이 라이브러리의 다른 사용자에게 판매, 제공 또는 호스팅(원본 또는 편집된 사본)할 수 없으며 이를 이 저장소에 연결해야 합니다.
➔ 파일의 댓글을 변경하거나 삭제하지 마세요. 그렇게 하면 당신이 그 댓글을 자신의 것으로 주장하고 싶다고 생각하게 될 것입니다.
1. 데이터베이스에 연결 중!
시작하기 전에 PDO의 기본 사항을 이해했는지 확인하세요. 최신 릴리스를 다운로드하고 MultiDatabasePDO .php
라는 파일을 포함시키면 모든 추가 클래스가 자동으로 포함됩니다. 설정 코드는 다음과 같아야 합니다.
require " ./ MultiDatabasePDO / MultiDatabasePDO .php " ;
$ multiPDO = new WulfGamesYT MultiDatabasePDO MultiDatabasePDO ([
[ " mysql " , " 1.1.1.1 " , " database_1 " , " username " , " password " ],
[ " mysql " , " 2.2.2.2 " , " database_2 " , " username " , " password " ]
]);
이제 hasAnyErrors()
라는 간단한 함수를 사용하여 오류를 확인해야 합니다. getFailedConnections()
함수를 사용하면 실패한 연결을 나열할 수 있습니다.
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. 위키를 읽고 이 라이브러리를 올바른 방법으로 사용하십시오!
다음으로, 각 기능이 수행하는 작업을 이해하기 위해 위키의 문서를 읽는 것이 좋습니다. 또한 이 라이브러리와 표준 PDO 라이브러리 사이에는 다음과 같은 몇 가지 차이점이 있다는 점을 아는 것이 중요합니다.
execute()
메서드에서 자리 표시자/값 배열을 전달할 수 없습니다. bindValue()
또는 bindValues()
사용하세요.ORDER BY
, LIMIT
또는 OFFSET
사용할 수 없습니다. 대신 이 가이드를 참조하세요.AUTO INCREMENT
사용하지 마십시오. 대신 ID 열이 있는 경우 이 기능을 사용하십시오. 3. 데이터베이스와 테이블 설정!
MultiDatabasePDO 사용할 계획이라면 연결하는 모든 데이터베이스의 모든 테이블이 동일한 방식으로 구성되어 있는지 확인해야 합니다.
예를 들어, 구조와 이름이 모두 동일한 2개의 서로 다른 데이터베이스에 다음과 같은 2개의 테이블이 있다고 가정해 보겠습니다. 아래 README의 각 예에서는 이러한 테이블을 사용합니다. 현실적으로 MultiDatabasePDO 사용을 고려해야 하는 경우(또는 웹 앱 확장을 준비하려는 경우) 테이블에는 수백만 개는 아니더라도 수천 개의 행이 있을 것입니다.
데이터베이스 1의 "사용자" 테이블.
ID(정수) | 사용자 이름(텍스트) | PassHash(텍스트) | 이메일(문자) | 이름(텍스트) | 성(텍스트) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | 리암 | 알렌 |
2 | 인디애나존스55 | npxCn975RSaP | [email protected] | 인디애나 | 존스 |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | 스티브 | 존스 |
데이터베이스 2의 "사용자" 테이블.
ID(정수) | 사용자 이름(텍스트) | PassHash(텍스트) | 이메일(문자) | 이름(텍스트) | 성(텍스트) |
---|---|---|---|---|---|
4 | 진짜야 | 6XBmD4bzGP87 | [email protected] | 리암 | 석공 |
5 | 지옥이야보이 | LeyTpTwvvMUM | [email protected] | 줄리 | 크로스비 |
모든 데이터베이스와 모든 테이블에서 행을 선택하려면 PHP의 일반 PDO처럼 간단히 수행할 수 있습니다.
$ selectQuery = $ multiPDO -> prepare ( " SELECT ID, Username, Email FROM Users WHERE Username = :username " );
$ selectQuery -> bindValue ( " :username " , " WulfGamesYT " );
$ selectQuery -> execute ();
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
양식이 있고 정보를 PHP 파일에 게시할 수 있고 "Users"라는 데이터베이스의 테이블에 새 레코드 1개를 삽입하려는 경우 수행해야 할 작업은 다음과 같습니다. 이는 행 수가 가장 적기 때문에 위 예제 테이블의 두 번째 테이블에 삽입됩니다. 수동 ID를 입력하고 테이블에 int 데이터 유형을 사용하는 대신 아래 generateMDGUID()
함수를 사용하세요.
$ longSQL = " INSERT INTO Users VALUES (6, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
우리가 2개의 매개변수에 전달한 execute()
메소드를 사용하면 이는 새 행을 삽입하는 데 필요합니다. 이는 클래스에 "Users"라는 테이블에 새 행을 삽입(전달: true)함을 알려주기 때문입니다. SQL 주입이 발생할 수 있으므로 신뢰할 수 없는 사용자 입력을 두 번째 매개변수로 넣지 마십시오.
이는 기본적으로 SELECT 쿼리를 수행하는 것과 동일합니다. 지정된 경우 WHERE 절과 일치하는 모든 데이터베이스의 모든 테이블을 업데이트합니다. 예를 들면 다음과 같습니다.
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
이제 "Users"라는 이름의 모든 테이블에 대해 SELECT 쿼리를 실행하면 업데이트된 행이 표시됩니다.
다시 한번 말씀드리지만, 우리가 해야 할 일은 다음과 같습니다:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
이제 "Users"라는 이름의 모든 테이블에 대해 SELECT 쿼리를 실행하면 업데이트된 행이 표시됩니다.
각 데이터베이스의 모든 행을 정렬하기 위해 SQL 쿼리에서 ORDER BY
, LIMIT
또는 OFFSET
사용할 수 없으며 데이터베이스 1개의 현재 테이블에 있는 행만 정렬할 수 있다는 점에 유의하는 것이 중요합니다. 대신 최종 결과/행을 쉽게 구성할 수 있도록 MultiDatabasePDO 에서 사용할 수 있는 다음 기능을 사용해야 합니다.
결과 정렬("ORDER BY" 대신): sortBy()
메서드의 두 번째 매개 변수에 전달된 "ASC" 또는 "DESC"를 사용하여 SQL 쿼리에서와 마찬가지로 결과를 정렬할 수 있습니다.
숫자 열의 순서를 지정하는 방법은 다음과 같습니다.
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "ID" column in descending order.
$ selectQuery -> sortBy ( " ID " , " DESC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
문자열/객체 열의 순서를 지정하는 방법은 다음과 같습니다.
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "Username" column in ascending order.
$ selectQuery -> sortBy ( " Username " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
원하는 경우 여러 열을 주문하거나 여러 번 주문할 수 있습니다. 아래 예에서는 "FirstName"이라는 열을 내림차순으로 정렬한 다음 "LastName"이라는 열을 정렬합니다. 그러면 테이블에 사용자가 알파벳 순서로 나열됩니다. 이름이 같으면 성순으로도 정렬됩니다. 코드에서 볼 수 있듯이 가장 중요하지 않은 순서 열을 먼저 배치한 다음 가장 중요한 순서 열을 마지막에 배치합니다.
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort both the columns.
$ selectQuery -> sortBy ( " LastName " , " ASC " );
$ selectQuery -> sortBy ( " FirstName " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
AUTO INCREMENT
대신 또는 여러 데이터베이스에서 고유한 GUID를 생성하는 방법이 필요한 경우 generateMDGUID()
라는 함수를 사용할 수 있습니다. 다음은 작동 방식과 100% 고유성을 보장하는 방법에 대한 지침과 테이블에 새 행을 삽입할 때 함수를 사용하는 방법의 예입니다.
MDGUID의 작동 방식과 고유성을 보장하는 방법:
예:
//Here we generate the MDGUID.
$ mdguid = $ multiPDO -> generateMDGUID ();
$ longSQL = " INSERT INTO Users VALUES (:mdguid, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :mdguid " => $ mdguid ,
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
질문이 필요하시면 트위터로 저에게 연락해주세요.
트위터: https://www.twitter.com/WulfGamesYT
이 라이브러리가 마음에 들면 별표로 표시하고 PHP 및 MySQL을 좋아하는 동료 개발자와 공유하는 것을 고려해 보십시오! 업데이트를 계속 지켜봐 주시고, 버그를 발견하면 저에게 꼭 보고해주세요. 읽어주셔서 감사합니다!