Eu desmanchei este projeto porque dá muito trabalho, embora a ideia parecesse boba no início, na verdade funcionou até que encontrei muitos problemas ao fazer a paginação e em termos de desempenho, acho que o cluster seria melhor. Use isso por sua conta e risco, foi divertido fazer este projeto.
Esta é uma biblioteca PHP gratuita , fácil de usar , leve e poderosa que permite conectar-se a vários bancos de dados MySQL com PDO. Eu construí isso especificamente para MySQL, mas acredito que funcionará com PostgreSQL, MariaDB, CouchDB etc. Lembre-se, isso é para bancos de dados SQL, portanto não funcionará com sistemas de gerenciamento de banco de dados como MongoDB e Apache Cassandra.
✔ Conecte-se a vários bancos de dados MySQL usando PDO.
✔ Recupere linhas de vários bancos de dados.
✔ Execute consultas de inserção com eficiência, fazendo apenas uma consulta em vez de adicionar novas linhas em todas as tabelas de cada banco de dados.
✔ Classifique, limite e gerencie facilmente resultados/linhas.
✔ Escale facilmente, simplesmente adicionando mais bancos de dados (sem necessidade de usar escravos, mestres ou clusters).
✔ Gere identificadores verdadeiramente únicos (chamados MDGUIDs).
➔ PHP 7+ e Apache/Nginx (usa recursos para PHP 7 e superior).
➔ MySQL 5.7+ (para esclarecer, o MySQL 5.7 funciona bem, então qualquer versão superior ao MySQL 5.7 seria ótima).
➔ Um driver de banco de dados compatível com PDO (leia mais sobre isso aqui).
Você poderá utilizar MultiDatabasePDO para uso pessoal, educacional e comercial nos seguintes termos:
➔ Você não vende, dá ou hospeda (cópias originais ou editadas) desta biblioteca para outros usuários, você deve vinculá-los a este repositório.
➔ Você não altera o comentário no arquivo nem o remove; isso me fará pensar que você deseja reivindicá-lo como seu.
1. CONECTANDO-SE AOS SEUS BANCOS DE DADOS!
Antes de começar, certifique-se de compreender os fundamentos do DOP. Basta baixar a versão mais recente e incluir o arquivo chamado MultiDatabasePDO .php
que incluirá automaticamente todas as classes extras para você. Seu código de configuração deve ser semelhante a:
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 " ]
]);
Agora precisamos verificar se há erros usando uma função simples chamada hasAnyErrors()
. Você pode listar conexões que falham com a função 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. LENDO O WIKI E USE ESTA BIBLIOTECA DA MANEIRA CERTA!
A seguir, recomendo a leitura da documentação no wiki para entender o que cada função faz. Além disso, é importante saber que existem algumas diferenças entre esta biblioteca e a biblioteca PDO padrão, nomeadamente:
execute()
, use bindValue()
ou bindValues()
.ORDER BY
, LIMIT
ou OFFSET
em suas consultas SQL; em vez disso, consulte este guia.AUTO INCREMENT
para colunas; em vez disso, se você tiver uma coluna de ID, use esta função. 3. CONFIGURANDO SEUS BANCOS DE DADOS E TABELAS!
Se você planeja usar MultiDatabasePDO , você deve garantir que todas as tabelas de cada banco de dados ao qual você se conecta estejam estruturadas da mesma maneira:
Para fins de exemplo, imagine que temos as 2 tabelas a seguir de 2 bancos de dados diferentes, ambas estruturadas e com o mesmo nome. Cada exemplo neste README abaixo usa essas tabelas. Realisticamente, suas tabelas teriam milhares, senão milhões de linhas antes de você precisar considerar o uso MultiDatabasePDO (ou se quiser se preparar para dimensionar seu aplicativo da web).
Tabela "Usuários", do banco de dados 1.
ID (int) | Nome de usuário (texto) | PassHash (texto) | E-mail (texto) | Nome (texto) | Sobrenome (texto) |
---|---|---|---|---|---|
1 | WulfGames YT | ThLfkbQFyvDx | [email protected] | Liam | Allen |
2 | IndianaJones55 | npxCn975RSaP | [email protected] | Indiana | Jones |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | Steve | Jones |
Tabela "Usuários", do banco de dados 2.
ID (int) | Nome de usuário (texto) | PassHash (texto) | E-mail (texto) | Nome (texto) | Sobrenome (texto) |
---|---|---|---|---|---|
4 | RealmenteCara | 6XBmD4bzGP87 | [email protected] | Liam | Pedreiro |
5 | InfernoSimBoi | LeyTpTwvvMUM | [email protected] | Júlia | Crosby |
Para selecionar linhas de TODOS os bancos de dados e TODAS as tabelas, você pode simplesmente fazer, como o PDO normal em PHP:
$ 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 ); }
Digamos que se tivéssemos um formulário e você pudesse POSTAR as informações em seu arquivo PHP, e deseja inserir 1 novo registro em uma tabela de um banco de dados chamado "Usuários", tudo que você precisa fazer é o seguinte. Observe que isso será inserido na segunda tabela nas tabelas de exemplo acima porque possui a contagem de linhas mais baixa. Em vez de inserir um ID manual e usar o tipo de dados int em suas tabelas, use a função generateMDGUID()
abaixo.
$ 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 " );
Observe que com o método execute()
que passamos 2 parâmetros, isso é necessário para inserir novas linhas, pois informa à classe que estamos inserindo (passando: true) uma nova linha em uma tabela chamada "Usuários". Não coloque entradas de usuários não confiáveis como segundo parâmetro, pois pode ocorrer injeção de SQL.
Isso é basicamente o mesmo que fazer uma consulta SELECT, atualizará TODAS as tabelas em TODOS os bancos de dados que correspondam à cláusula WHERE, se especificada, por exemplo:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
Agora, se executarmos uma consulta SELECT em TODAS as tabelas denominadas "Usuários", veremos a linha atualizada.
Novamente, tudo o que precisamos fazer é:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
Agora, se executarmos uma consulta SELECT em TODAS as tabelas denominadas "Usuários", veremos a linha atualizada.
É importante observar que você não pode usar ORDER BY
, LIMIT
ou OFFSET
em suas consultas SQL para ordenar todas as linhas de cada banco de dados, apenas as linhas da tabela atual em 1 banco de dados. Em vez disso, você deve usar as seguintes funções disponíveis no MultiDatabasePDO , que facilitam a organização de seus resultados/linhas finais.
Ordenando resultados (em vez de "ORDER BY"): Você pode ordenar seus resultados da mesma forma que faz em consultas SQL com "ASC" ou "DESC" passado para o segundo parâmetro do método sortBy()
.
É assim que você ordena colunas numéricas:
$ 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 ); }
É assim que você ordena colunas de string/objeto:
$ 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 ); }
Você pode ordenar várias colunas ou várias vezes, se desejar. No exemplo abaixo estaremos ordenando uma coluna chamada "Nome" em ordem decrescente e, em seguida, uma coluna chamada "Sobrenome". Isso listará os usuários na tabela em ordem alfabética; se eles tiverem o mesmo nome, também será ordenado pelo sobrenome. Coloque a coluna de ordem menos importante primeiro e depois a mais importante no final, como você pode ver no código:
$ 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 ); }
Em vez de AUTO INCREMENT
, ou se você precisar de uma maneira de gerar GUIDs verdadeiramente exclusivos em vários bancos de dados, você pode usar nossa função chamada generateMDGUID()
. Abaixo está um guia de como funcionam e como garantem 100% de exclusividade, e um exemplo de como usar a função ao inserir novas linhas em suas tabelas.
Como o MDGUID funciona e garante a exclusividade:
Exemplo:
//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 " );
Se você precisar fazer uma pergunta, entre em contato comigo no Twitter.
Twitter: https://www.twitter.com/WulfGamesYT
Se você gosta desta biblioteca, considere marcá-la e compartilhá-la com outros desenvolvedores que gostam de PHP e MySQL! Fique atento às atualizações e não se esqueça de relatar quaisquer bugs que encontrar para mim. Obrigado por ler!