Cargar de un archivo plano o csv a una tabla mysql (maria db) utilizando un script php por consola

En este post les mostraré algo que se suele hacer mucho cuando trabajamos en aplicativos web los cuales requieren ser alimentados por plantillas de datos o datos que alimentan el aplicativo de forma masiva.

Vídeo explicativo

funciones php que se utilizan para leer datos de un archivo csv y otras cosas para cargar datos a una tabla con script php por consola

Contenido del vídeo

Código – scriptDataLoad.php

<?php
// Creamos la conexión
$cn = new mysqli('localhost', 'root', '', 'torneos');
// validamos la conexiòn
if ($cn->connect_error) {
    die("ERRROR CONECTANDO => " . $cn->connect_error);
}
$msgLog = '';
echo $msgLog .=  "********** SCRIPT CARGA DE DATOS DE UN ARCHIVO ************\n";
//definimos el archivo
$fileName = 'data.csv';
echo $msgLog .=  "Buscando el archivo $fileName.....\n";
//abrir el archivo
echo $msgLog .=  "Abriendo archivo $fileName.....\n";
$openFile = fopen($fileName,'r');
if($openFile!==FALSE){	
	echo $msgLog .=  "Archivo encontrado .....\n";	
	$contador = 0;
	$regOk = 0;
	$regError = 0;
	while (($data = fgetcsv($openFile,1000,';'))!== FALSE) {						
		if($contador>0){
			$cantEquipo = trim($data[0]);
			$cantDuelos = trim($data[1]);			
			echo $msgLog .=  "Procesando fila $contador...\n";		
			echo $msgLog .=  "Datos encontrados en fila $contador [ $cantEquipo - $cantDuelos]...\n";		
			echo $msgLog .=  "Guardando en tabla competencia ...\n";		
			$sql="INSERT INTO competencia (Id_com, Cant_equipos, Cant_duelos) VALUES (NULL,".$cantEquipo.",".$cantDuelos.");";
			echo $sql."\n";
			$insert= $cn->query($sql);
			if($insert){
				$regOk++;
				echo $msgLog .=  "Se almaceno los valores correctamente \n";
			}else{
				$regError++;
				echo $msgLog .=  "Problema la insertar valores de la fila $contador \n";
			}
		}else{
			$contador++;
		}
	}
	echo $msgLog .=  "********** RESUMEN SCRIPT ************\n";
	echo $msgLog .=  "** filas encontradas $contador      **\n";
	echo $msgLog .=  "** registros realizados $regOk      **\n";
	echo $msgLog .=  "** errores de registro $regError    **\n";
	echo $msgLog .=  "***********************+**************\n";
	$date = date('Y-m-d H:m:i');
	echo $msgLog .= "FECHA DE CARGA => $date";
	error_log($msgLog,3,"ArchivoLog.txt");
}

Archivo a cargar – data.csv

cantidad_equipos|catidad_duelos
3;4
1;3
12;123
12;12
1;3
1;2
12;12
12;221
12;12
12;12
22;22
32;12

Archivo de log – ArchivoLog.txt

********** SCRIPT CARGA DE DATOS DE UN ARCHIVO ************
Buscando el archivo data.csv.....
Abriendo archivo data.csv.....
Archivo encontrado .....
Procesando fila 1...
Datos encontrados en fila 1 [ 3 - 4]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 1 - 3]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 123]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 12]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 1 - 3]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 1 - 2]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 12]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 221]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 12]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 12 - 12]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 22 - 22]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
Procesando fila 1...
Datos encontrados en fila 1 [ 32 - 12]...
Guardando en tabla competencia ...
Se almaceno los valores correctamente 
********** RESUMEN SCRIPT ************
** filas encontradas 1      **
** registros realizados 12      **
** errores de registro 0    **
***********************+**************
FECHA DE CARGA => 2020-04-10 04:04:23

Como hacer un login con sesiones en php

Como hacer un login con sesiones en php

En este post muestro el código que utilice para hacer el vídeo tutorial de como hacer un login con sesiones, espero les sea de ayuda.

Login.php

<!doctype html>
<html lang=”en”>
<head>
<!– Required meta tags –>
<meta charset=”utf-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1, shrink-to-fit=no”>

<!– Bootstrap CSS –>
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css” integrity=”sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO” crossorigin=”anonymous”>
<title>Login</title>
<style type=”text/css”>
form{
text-align: center;
background: #36A0FF;
margin: 10% 30%;
color: Blue;
border-rusadi: 5px;
padding: 2%;
}
</style>
</head>
<body>
<form action=”Para_ingresar.php” method=”post” role=”form”>
<div class=”form-group”>
<label for=”User”>Su usuario:</label>
<input type=”text” name=”usuario” class=”form-control” id=”User”>
</div>
<div class=”form-group”>
<label for=”pass”>Contraseña:</label>
<input type=”password” class=”form-control” name=”Contrasena” id=”pass”>
</div>
<div class=”form-group”>
<label><a href=”Registro.php”>No tengo cuenta</a></label>
</div>
<button type=”submit” class=”btn btn-primary”>Ingresar</button>
</form>
<!– Optional JavaScript –>
<!– jQuery first, then Popper.js, then Bootstrap JS –>
<script src=”https://code.jquery.com/jquery-3.3.1.slim.min.js” integrity=”sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo” crossorigin=”anonymous”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js” integrity=”sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49″ crossorigin=”anonymous”></script>
<script src=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js” integrity=”sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy” crossorigin=”anonymous”></script>
</body>
</html>

Para_ingresar.php

<?php
$U_bd = “”;
$P_bd = “”;
$N_bd = “”;
$User = $_POST[‘usuario’];
$Pass = $_POST[‘Contrasena’];
$tr = new PDO(‘mysql:host=localhost;dbname=gestime_v1’, ‘root’, ”);
$tr -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$tr -> exec(‘set character set UTF8’);
$query = “select User, Pass, Name from usuarios where User = ‘$User'”;
$rs = $tr->query($query);
$c = $rs ->rowCount();
if($c > 0)
{
while ($rst = $rs->fetch()) {
$U_bd = $rst[‘User’];
$P_bd = $rst[‘Pass’];
$N_bd = $rst[‘Name’];
}
if ($Pass == $P_bd && $User == $U_bd) {
session_start();
$_SESSION[‘Nombre_sesion’] = $N_bd;
echo “<script> alert(‘Bienvenido a Gestime, $N_bd’); location =’index.php’;</script>”;
}else
{
echo “<script> alert(‘La contraseña es incorrecta, prueba otra vez’);location =’index.php’;</script>”;
}
}else
{
echo “<script> alert(‘El usuario no existe en la base de gestime_v1’);</script>”;
}
?>

Index.php

//Esto para la sesion– ingresos no validos

session_start();
if(!isset($_SESSION[‘Nombre_sesion’])){
echo “<script>alert(‘esta entrando de manera indebida al sistema, por favor ingrese como es’); location = ‘Login.php’;</script>”;
}

//para mostrar el nombre de usuario que tiene la sesion

<span class=”font-weight-light”>User: <?php echo $_SESSION[‘Nombre_sesion’];?></span>

 

Cerrar_session.php

<?php
session_start();
$nombre = $_SESSION[‘Nombre_sesion’];
echo “<script>alert(‘Hasta pronto $nombre’); location=’Login.php’;</script>”;
session_destroy();
?>

como hacer un formulario php y mysql

como hacer un formulario php y mysql

En este pequeño post muestro el código del video que hice en mi canal. Espero les sea de gran ayuda. No olviden dejar sus comentarios comentando que contenido esperan en el canal y sobre que quieren que hable.

Código Formulario login

<!doctype html>
<html lang=”en”>
<head>
<!– Required meta tags –>
<meta charset=”utf-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1, shrink-to-fit=no”>

<!– Bootstrap CSS –>
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css” integrity=”sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO” crossorigin=”anonymous”>
<title>Login</title>
<style type=”text/css”>
form{
text-align: center;
background: #36A0FF;
margin: 10% 30%;
color: Blue;
border-rusadi: 5px;
padding: 2%;
}
</style>
</head>
<body>
<form role=”form”>
<div class=”form-group”>
<label for=”User”>Su usuario:</label>
<input type=”text” name=”usuario” class=”form-control” id=”User”>
</div>
<div class=”form-group”>
<label for=”pass”>Contraseña:</label>
<input type=”password” class=”form-control” name=”Contrasena” id=”pass”>
</div>
<div class=”form-group”>
<label><a href=”Registro.php”>No tengo cuenta</a></label>
</div>
<button type=”submit” class=”btn btn-primary”>Ingresar</button>
</form>
<!– Optional JavaScript –>
<!– jQuery first, then Popper.js, then Bootstrap JS –>
<script src=”https://code.jquery.com/jquery-3.3.1.slim.min.js” integrity=”sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo” crossorigin=”anonymous”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js” integrity=”sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49″ crossorigin=”anonymous”></script>
<script src=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js” integrity=”sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy” crossorigin=”anonymous”></script>
</body>
</html>

Código Formulario registro

<!doctype html>
<html lang=”en”>
<head>
<!– Required meta tags –>
<meta charset=”utf-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1, shrink-to-fit=no”>
<!– Bootstrap CSS –>
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css” integrity=”sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO” crossorigin=”anonymous”>
<style type=”text/css”>
form{
text-align: center;
background: #36A0FF;
margin: 10% 30%;
color: Blue;
border-rusadi: 5px;
padding: 2%;
}
</style>
<title>Registro</title>
</head>
<body>
<form action=”Para_usuarios.php” method=”post” role=”form”>
<div class=”form-group”>
<label for=”Name”>Nombre:</label>
<input type=”text” name=”Name” class=”form-control” id=”Name” placeholder=”Completo”>
</div>
<div class=”form-group”>
<label>País:</label>
<select class=”form-control” name=”Pais”>
<option>Seleccione su país</option>
<option>Peru</option>
<option>Ecuador</option>
<option>Colombia</option>
<option>Argentina</option>
</select>
</div>
<div class=”form-group”>
<label for=”User”>Asignar usuario:</label>
<input type=”text” placeholder=”User” name=”usuario” class=”form-control” id=”User”>
</div>
<div class=”form-group”>
<label for=”pass”>Asignar Contraseña:</label>
<input type=”password” placeholder=”****” class=”form-control” name=”Contrasena” id=”pass”>
</div>
<div class=”form-group”>
<label><a href=”Registro.php”>No tengo cuenta</a></label>
</div>
<button type=”submit” class=”btn btn-primary”>Ingresar</button>
</form>
<!– Optional JavaScript –>
<!– jQuery first, then Popper.js, then Bootstrap JS –>
<script src=”https://code.jquery.com/jquery-3.3.1.slim.min.js” integrity=”sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo” crossorigin=”anonymous”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js” integrity=”sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49″ crossorigin=”anonymous”></script>
<script src=”https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js” integrity=”sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy” crossorigin=”anonymous”></script>
</body>
</html>

Código PHP

<?php
$Nombre = $_POST[‘Name’];
$Pais = $_POST[‘Pais’];
$User = $_POST[‘usuario’];
$Pass = $_POST[‘Contrasena’];
$tr = new PDO(‘mysql:host=localhost;dbname=gestime_v1’, ‘root’, ”);
$tr -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$tr -> exec(‘set character set UTF8’);
$query = “insert into usuarios(Name, Country, User, Pass) values(‘$Nombre’, ‘$Pais’, ‘$User’, ‘$Pass’)”;
$rs = $tr->query($query);
$c = $rs ->rowCount();
if($c > 0)
{
echo “<div class=’alert alert-success’>
<strong>Éxito</strong> Se registro en Gestime.
</div>”;
}else
{
echo “<script>alert(‘<div class=’alert alert-danger’>
<strong>Algo va mal!</strong> Falla en el sistema al registrar
</div>’);</script>”;
}
?>

Mapeo de procesos – Mejores herramientas

¿qué es un mapeo de procesos?

Los procesos son tareas ligadas las cuales pueden depender la una de la otra, o simplemente pueden estar relacionadas por su contexto. Muchas veces esas tareas forman sub-procesos que a su vez forman un ecosistema de procesos.

Al momento de hacer una solución informática para una organización es necesario tener claro el paso a paso de todos los procesos que se desean solucionar con la herramienta tecnológica que construiremos .

Importancia del mapeo de procesos

Los mapeos de procesos son importantes en el desarrollo del software ya que si tenemos claros los procedimientos que se ejecutan en dichas tareas de un proces o sub- proceso, podemos tener facilidad al momento de plantear o hacer el levantamiento de requerimiento del sistema.

Desarrollo de un software con mapeo de procesos

En mi trabajo propuse una solución informática que ayudaría a mejorar la ejecución o implementación de otro gran sistema informático de mayor magnitud e impacto para la organización.  En mi tarea como analista, estuve mirando la forma en como anteriormente estaban ejecutando las tareas que en sí, definían el avance de este gran sistema.

Fue ahí que propuse a mis lideres el desarrollo de esta herramienta que nos ayudaría en la laboriosa tarea de hacer funcionar a la “perfección” la gran herramienta informática.

La propuesta paso por sus verificaciones y aprobaciones para después ser aprobada. Luego en una de las reuniones de este proyecto se definió el alcance del mismo y después era la hora de ponerse manos a la obra…

En ese  momento nos encontramos con la necesidad de saber de que manera se estaban realizando las labores o tareas importantes, y como se debían realizar. El mapeo de estos procesos fue necesario y estos mismos nos ayudaron a tener más claridad al momento de hacer los casos de uso del sistema.

Después de eso, hacer el diseño de la base de datos del sistema fue tarea fácil. Modelo entidad relación y modelo relacional se realizaron como tajando mantequilla con cuchillo caliente. Con eso hecho; hacer  el script de la base de datos era lo único que faltaba.

Herramientas para hacer mapeo de procesos

Tras ver la importancia que lleva conocer con exactitud los procesos y todas sus variables, me puse a a tarea de investigar las mejores herramientas para hacer diagramas de flujo de procesos. Por el tema de las licencias no nos vamos a preocupar (Esto para las personas que vayan a utilizar estas aplicaciones en sus lugares de trabajo) ya que aunque algunas son de pago otras son también son de uso libre.

Lucidchart

 

Esta es una herramienta que funciona on-line, te pide que te registres y es buena pero no deja hacer diagramas robustos, si quieres seguir trabajando en un diagrama que crece más tienes que pagar o a la fecha de este post; probar la cuenta premium por un mes (dando tus datos de pago).
Ingresa a lucidchart.

Graphviz

Es pun proyecto de código abierto el cual puedes descargar facilmente en la web del programa. Te permite hacer digramas de flujo, a demás de diagramas de modelado de objetos de datos (Entidad relación) y demás tareas del desarrollo de software.

Dia

Este es un programa para dibujar diferentes estructuras de diagramas. El uso de este software es gratis bajo la licencia que el mismo refiere en este sitio.

yEd Graph Editor

 

yEd está disponible gratuitamente, te permite hacer diagramas de alta calidad de forma rápida. Puedes descargar aquí.

Bizagi Modeler

Es un software potente para esta tarea, aunque es licenciado es muy utilizado por compañías y no precisamente que tengan que ver con la ingeniería de software. Para tener más información ingresa a la página oficial.

Proyecto EPEIB

Encuentra plantel educativo ideal en Bogotá o EPEIB es un portal donde los usuarios pueden hacer búsqueda de planteles educativos (preescolar, básica primaria, básica secundaria y educación media), la búsqueda esta por diferentes filtros y el usuario tiene la oportunidad de tener la información pertinente de cada plantel que sea de su interés.

Introducción

Buscando en las plataformas de datos abiertos de mi país(Colombia), vi unos datos que llamaron mi atención, con ellos me propuse crear una plataforma con el simple fin de estudiar el uso de las API REST.

Uso de datos abiertos

Colombia en su página de datos abiertos (OpenData) tiene un portafolio de datos que las entidades gubernamentales y privadas muestran o ponen a disposición a todos los usuarios del país.

Nosotros lo programadores podemos descargar esta información o acceder a ella por medio del servicio que brinda SODA  API, mediante peticiones a los recursos o datos vamos llenando nuestro sitio o proyecto.

El problema

La información que aparecía en la página de datos de Colombia acerca de los planteles educativos de la ciudad de Bogotá era muy antigua o des-actualizada.   Esto haría que los datos para los usuarios no fueran confiables

La solución

Hice una búsqueda extensiva y en otra página del gobierno encontré la última actualización por parte de la secretaría de educación de esa ciudad. Eso en conclusión resolvía mi problema, luego me encargaría de hacer accesibles esos datos para crear el contenido de EPEIB.

Desarrollo del proyecto EPEIB

Para la estructura pues lo obvio (por decirlo así) uso de etiquetas html, para la “pintura” y “decorado” use el framework bootstrap. Para gestionar los datos hice el siguiente procedimiento:
Exporte los registros de los planteles educativos a un archivo svc que luego pase a formato json e incluí este archivo en el directorio del proyecto epeib.

Para la gestión de esa información en json, utilice el clásico php que con json_decode paso el .json a un objeto o array multidimensional, al cual recorro utilizando diferentes metodos de _arrays() en php. Esto para poder brindar al usuario los diferentes tipos de busquedas.

Ubicación y API maps

El portal EPEIB brinda también que el usuario pueda fijar una ruta teniendo como destino el plantel educativo de sus interés, por otro lado al momento de listar todo el contenido del plantel (información) le muestra al usuario la ubicación exacta de dicho plantel. Esto gracias a google maps y su API.

Aunque encontré problemas con la ubicación mediante las direcciones, encontré la solución en buscar como parámetro de búsqueda en google mapas api el nombre de la sede del plantel.

Publicación y aceptación

Al momento de terminal el proyecto fue inscrito en el concurso de “datos a la U” que hace datos.gov.co, y el link (epeib.iaprogrammerweb.com) de publicación es un subdominante de este blog, en el portal se dio un espacio para que los usuarios dieran su opinión sobre el mismo.

epeib(ecuentra plantel educativo ideal en bogotá)
Proyecto que usa datos abiertos del gobierno Colombiano

EPEIP

 

Qué es PDO

¿Que es PDO?

Definición de PDO

Para saber que es PDO o en sus siglas en ingles php data object ( Objetos de datos PHP ) se debe definir como una extensión o librería de PHP que es capaz de lograr una conexión para el acceso a datos de gran variedad de motores de bases de datos.

PDO
Lo bueno de PDO es que permite la comunicación para el acceso a datos de una gran variedad de MBD

Versiones de PHP con PDO

PDO esta disponible desde versiones posteriores a PHP 5.1, pero para PHP5.0 se encuentra una librería PECL (Extension Community Library – Librería de extensiones para la comunidad). PDO requiere de unos parámetros específicos que se encuentran solo desde la versión del nucleo de PHP5, de esta manera no esta disponible para versiones anteriores a ella.

Proyectos WEB con PDO

Para la arquitectura de una web PHP que sea realizada con esta extensión/librería se debe saber que esta maneja una capa de abstracción de acceso a datos. Esta capa realizará  las funciones que se especifiquen en la misma, con una sintaxis MySql  ya que PDO por defecto trabaja con este motor de bases de datos.

Ejemplo de conexión PDO - MySql
Ejemplo de conexión PDO – MySql

PDO permita conexiones con SQL Server- Oracle  no quiere decir que esta librería realice un cambio de sintaxis en el lenguaje de base de datos. Simplemente permite el acceso a los datos de las DataBases que funcionen con estos motores.

Y como se especifico en la definición de que es PDO esta librería maneja conexión para el acceso a datos de varios motores de bases de datos. Dependiendo de cual de ellos se quiera utilizar se debe implementar su respectivo driver.

Drivers para conexiones PDO a motores de bases de datos

Para su instalación en cada link se especifica.
Recordar que estos controladores son para el acceso a datos, si lo que se busca es una conexión total al motor de base de datos deberá ver otras opciones.

Bases de datos Cubrid

CUBRID (PDO)

Bases de datos MS SQL Server – Sybase

SQL Server y Sybase a través de la biblioteca FreeTDS
MS SQL Server (PDO)

Bases de datos Firebird

Firebird (PDO)

Bases de datos IBM

IBM (PDO)

Bases de datos Informix

Informix (PDO)

Bases de datos MySql

MySQL (PDO)

Bases de datos Ms SqlServer – Azure

MS SQL Server (comenzando con SQL Server 2005) y de SQL Azure
MS SQL Server (PDO)

Bases de datos Oracle

Oracle (PDO)

Bases de datos ODBC – DB2

ODBC y DB2 (PDO)

Bases de datos PostgreSQL

PostgreSQL (PDO)

Bases de datos SQLite

SQLite (PDO)

Bases de datos 4D

4D (PDO)