Modelo de datos
Se proporciona (y se recomienda su uso) el directorio models/ para almacenar
aquí las clases PHP correspondiente al modelo de datos de nuestra aplicación.
No hay ninguna norma o restricción respecto a esto, ya que cada aplicación requiere un modelo y patrones diferentes.
Se proporcionan clases de conexión y consulta a base de datos que hacen cómodo el trabajo con la BD, pero son completamente opcionales; puede usarse directamente el conjunto de funciones de PHP para MySQL, SQLite, PostgreSQL, etc. tal cual y por supuesto bibliotecas de terceros como RedBeans.
No se proporciona un ORM pues en el mercado hay diferentes soluciones PHP listas para usar.
Acceso a bases de datos
Configuración
En ZWF hay soporte para MySQL y PostgreSQL. Se representan por las cadenas
my y pg respectivamente.
El sistema elegido se almacena en la clave de configuración dbSys. Por
defecto es pg. Por ejemplo para cambiarlo a MySQL:
$cfg['dbSys'] = 'my';
Esta clave determina, en el sistema de autocarga de clases, si se va a
buscar un fichero en el subdirectorio pg/ o my/ en cualquier módulo
y también en el directorio de modelos (models/).
Los parámetros de conexión se almacenan en un array anidado. La conexión
preterminada se denomina default, pero se pueden establecer tantas conexiones
como se necesiten. En caso de MySQL será:
$cfg['my'] = array(
'default' => array(
'dbHost' => 'hostname',
'dbUser' => 'username',
'dbPass' => 'password',
'dbDatabase' => 'databasename',
'dbPort' => '3306'
)
);
Análogamente para PostgreSQL será (en este ejemplo se usará dos perfiles):
$cfg['pg'] = array(
'default' => array(
'dbHost' => 'hostname',
'dbUser' => 'username',
'dbPass' => 'password',
'dbDatabase' => 'databasename',
'dbPort' => '5432'
),
'production' => array(
'dbHost' => 'hostname2',
'dbUser' => 'username2',
'dbPass' => 'password2',
'dbDatabase' => 'databasename2',
'dbPort' => '5432'
)
);
Si en lugar del perfil default quisiéramos usar otro de forma predeterminada (
por ejemplo production), estableceremos esta clave:
$cfg['dbProfile'] = 'production';
Conexion
La conexión a la base de datos se realiza instanciando un objeto de la clase
MyDB o PgDB dependiendo del motor que se quiera usar.
También puede usarse la clase DB para usar el motor predeterminado.
$db = new \zfx\DB();
Se puede especificar una conexión diferente a la predeterminada para esa instancia concreta:
$db = new \zfx\DB('production');
Consultas básicas
Una vez que está configurado el acceso a la BD, y hecha la conexion, se puede acceder directamente sin usar otras librerías ni modelos. Ejemplo:
$bd->q("UPDATE clientes SET deuda = 0");
Las clases PgDB y MyDB tienen funciones similares para realizar consultas.
Estas son las tareas más habituales para realizar con un objeto de la
clase PgBD o MyDB:
- La función
escape()prepara una cadena para ser usada dentro de una consulta y prevenir inyecciones de código. - La función
q()ejecuta una consulta y no devuelve datos. - La función
qr()ejecuta una consulta y devuelve la primera (o única) fila como un array asociativo. - La función
qa()ejecuta una consulta y devuelve todos los resultados como un array de arrays asociativos. - La función
qs()ejecuta una consulta pero no devuelve datos. Para obtener la siguiente fila (como un array asociativo) se usa la funciónnext().
Ejemplo:
$bd = new PgBD();
$bd->qs("SELECT nombre FROM clientes");
$fila = $bd->next();
while ($fila)
{
print_r($fila);
$fila = $bd->next();
}