Disolví este proyecto porque es demasiado trabajo, aunque la idea parecía tonta al principio, en realidad funcionó hasta que encontré muchos problemas al realizar la paginación y, en términos de rendimiento, creo que la agrupación sería lo mejor. Úselo bajo su propio riesgo, fue divertido hacer este proyecto.
Esta es una biblioteca PHP gratuita , fácil de usar , liviana y potente que le permite conectarse a múltiples bases de datos MySQL con PDO. He creado esto específicamente para MySQL, pero creo que funcionará con PostgreSQL, MariaDB, CouchDB, etc. Recuerde, esto es para bases de datos SQL, por lo que no funcionará con sistemas de administración de bases de datos como MongoDB y Apache Cassandra.
✔ Conéctese a múltiples bases de datos MySQL usando PDO.
✔ Recuperar filas de múltiples bases de datos.
✔ Realice consultas de inserción de manera eficiente haciendo solo 1 consulta en lugar de agregar nuevas filas en todas las tablas de cada base de datos.
✔ Ordene, limite y administre fácilmente resultados/filas.
✔ Escale fácilmente, simplemente agregando más bases de datos (no es necesario utilizar esclavos, maestros o clústeres).
✔ Genere identificadores verdaderamente únicos (llamados MDGUID).
➔ PHP 7+ y Apache/Nginx (utiliza funciones para PHP 7 y superiores).
➔ MySQL 5.7+ (para aclarar, MySQL 5.7 funciona bien, por lo que cualquier versión superior a MySQL 5.7 sería excelente).
➔ Un controlador de base de datos compatible con PDO (lea más sobre esto aquí).
Puede utilizar MultiDatabasePDO para uso personal, educativo y comercial bajo los siguientes términos:
➔ No vendes, das ni alojas (copias originales o editadas) de esta biblioteca a otros usuarios, debes vincularlos a este repositorio.
➔ No cambias el comentario en el archivo ni lo eliminas; hacerlo me hará pensar que quieres reclamarlo como tuyo.
1. ¡CONECTANDO A TUS BASES DE DATOS!
Antes de comenzar, asegúrese de comprender los conceptos básicos de PDO. Simplemente descargue la última versión e incluya el archivo llamado MultiDatabasePDO .php
que incluirá automáticamente todas las clases adicionales. Su código de configuración debería verse así:
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 " ]
]);
Ahora necesitamos verificar si hay errores usando una función simple llamada hasAnyErrors()
. Puede enumerar las conexiones que fallan con la función 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. ¡LEER LA WIKI Y UTILIZAR ESTA BIBLIOTECA DE LA MANERA CORRECTA!
A continuación, recomendaría leer la documentación en la wiki para comprender qué hace cada función. Además, es importante saber que existen algunas diferencias entre esta biblioteca y la biblioteca PDO estándar, en particular:
execute()
, utilice bindValue()
o bindValues()
.ORDER BY
, LIMIT
o OFFSET
en sus consultas SQL; en su lugar, consulte esta guía.AUTO INCREMENT
para las columnas; en su lugar, si tiene una columna de ID, utilice esta función. 3. ¡CONFIGURA TUS BASES DE DATOS Y TABLAS!
Si planea usar MultiDatabasePDO , debe asegurarse de que todas las tablas de cada base de datos a la que se conecte estén estructuradas de la misma manera:
Por ejemplo, imagine que tenemos las siguientes 2 tablas de 2 bases de datos diferentes, ambas estructuradas y con el mismo nombre. Cada ejemplo en este README a continuación utiliza estas tablas. De manera realista, sus tablas tendrían miles, si no millones, de filas antes de que deba considerar el uso de MultiDatabasePDO (o si alguna vez desea prepararse para escalar su aplicación web).
Tabla "Usuarios", de la base de datos 1.
ID (int) | Nombre de usuario (texto) | PassHash (texto) | Correo electrónico (texto) | Nombre (texto) | Apellido (texto) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | Liam | allen |
2 | IndianaJones55 | npxCn975RSaP | [email protected] | Indiana | jones |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | esteban | jones |
Tabla "Usuarios", de la base de datos 2.
ID (int) | Nombre de usuario (texto) | PassHash (texto) | Correo electrónico (texto) | Nombre (texto) | Apellido (texto) |
---|---|---|---|---|---|
4 | realmente amigo | 6XBmD4bzGP87 | [email protected] | Liam | Masón |
5 | infiernoyeaboi | LeyTpTwvvMUM | [email protected] | julia | Crosby |
Para seleccionar filas de TODAS las bases de datos y TODAS las tablas, simplemente puede hacer, como PDO normal en 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 si tuviéramos un formulario y pudiera PUBLICAR la información en su archivo PHP y desea insertar 1 nuevo registro en una tabla de una base de datos llamada "Usuarios", todo lo que necesita hacer es lo siguiente. Tenga en cuenta que esto se insertará en la segunda tabla de las tablas de ejemplo anteriores porque tiene el recuento de filas más bajo. En lugar de ingresar una ID manual y usar el tipo de datos int en sus tablas, use la función generateMDGUID()
a continuación.
$ 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 con el método execute()
pasamos 2 parámetros, esto es necesario para insertar nuevas filas, porque le dice a la clase que estamos insertando (pasando: verdadero) una nueva fila en una tabla llamada "Usuarios". No coloque entradas de usuarios que no sean de confianza como segundo parámetro, ya que puede ocurrir una inyección SQL.
Esto es básicamente lo mismo que hacer una consulta SELECT, esto actualizará TODAS las tablas en TODAS las bases de datos que coincidan con la cláusula WHERE si se especifica, por ejemplo:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
Ahora, si ejecutamos una consulta SELECT en TODAS las tablas denominadas "Usuarios", veremos la fila actualizada.
Nuevamente, todo lo que tenemos que hacer es:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
Ahora, si ejecutamos una consulta SELECT en TODAS las tablas denominadas "Usuarios", veremos la fila actualizada.
Es importante tener en cuenta que no puede usar ORDER BY
, LIMIT
o OFFSET
en sus consultas SQL para ordenar todas las filas de cada base de datos, solo las filas de esa tabla actual en 1 base de datos. En su lugar, debe utilizar las siguientes funciones que están disponibles con MultiDatabasePDO que facilitan la organización de sus resultados/filas finales.
Ordenar resultados (en lugar de "ORDER BY"): puede ordenar sus resultados tal como lo hace en consultas SQL con "ASC" o "DESC" pasado en el segundo parámetro del método sortBy()
.
Así es como se ordenan las columnas 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 ); }
Así es como se ordenan las columnas de cadena/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 ); }
Puede ordenar varias columnas o varias veces si lo desea. En el siguiente ejemplo, ordenaremos una columna llamada "Nombre" en orden descendente, luego una columna llamada "Apellido". Esto enumerará los usuarios en la tabla en orden alfabético; si tienen el mismo nombre, también los ordenará por apellido. Coloque primero la columna de orden menos importante y luego la más importante al final, como puede ver en el 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 ); }
En lugar de AUTO INCREMENT
, o si necesita una forma de generar GUID verdaderamente únicos en múltiples bases de datos, puede utilizar nuestra función llamada generateMDGUID()
. A continuación se muestra una guía sobre cómo funcionan y cómo garantizan el 100% de singularidad, y un ejemplo de cómo utilizar la función al insertar nuevas filas en sus tablas.
Cómo funciona MDGUID y garantiza la singularidad:
Ejemplo:
//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 " );
Si necesita hacer una pregunta, comuníquese conmigo en Twitter.
Gorjeo: https://www.twitter.com/WulfGamesYT
Si te gusta esta biblioteca, considera destacarla y compartirla con otros desarrolladores a quienes les gusta PHP y MySQL. Estén atentos a las actualizaciones y asegúrese de informarme de cualquier error que encuentre. ¡Gracias por leer!