Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

jueves, 25 de septiembre de 2014

Crear archivos descargables en CVS con PHP

CSV (valores separados por comas) es el formato más ampliamente soportado para la transferencia de datos tabulares entre aplicaciones. La capacidad de exportar datos en formato CSV es una característica útil para muchos programas, y se está convirtiendo cada vez más común en las aplicaciones web. Esta vez explicaré cómo usar PHP para crear archivos CSV, y cómo asegurarse de que el navegador del visitante ofrece para descargar el archivo en lugar de mostrarla.

1. El código


En el siguiente código se supone que los datos que se exportan provienen de una base de datos MySQL, pero puede ser fácilmente modificado para que funcione con otras fuentes de datos, y por lo tanto sirve como un modelo general:

// Encabezados que determinan la descarga del archivo y el nombre del archivo
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=datos_descargados.csv');

// Un punto para referir la descarga
$output = fopen('php://output', 'w');

// Los encabezados del archivo
fputcsv($output, array('Column 1', 'Column 2', 'Column 3'));

// Los datos
mysql_connect('localhost', 'username', 'password');
mysql_select_db('database');
$rows = mysql_query('SELECT field1,field2,field3 FROM table');

// loop en los registros, descargandolos
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);

La cadena 'datos_descargados.csv' en la línea 3 es el nombre que el navegador le sugerirá para el archivo descargado. El literal de matriz en la línea 9 contiene los títulos de las columnas; esta línea se debe omitir por completo si usted no desea incluir encabezados de columna. Las cadenas en líneas de 12 a 14 deben cambiar a los parámetros de conexión correspondientes y cadena de consulta de la base de datos. En una aplicación real de los parámetros de conexión de base de datos deben ser definidos como constantes en un archivo de configuración independiente.

2. ¿Cómo funciona?


El código tiene que decirle al navegador que se está produciendo un archivo CSV y que el archivo debe ser ofrecido para su descarga, en lugar de mostrarlo en el navegador. Línea 2 produce un encabezado HTTP decirle al navegador que el tipo MIME del contenido es text / csv, el tipo oficial MIME para los archivos CSV.

Línea 3 produce un encabezado 'Content-Disposition'. El encabezado Content-Disposition se define en el RFC 2183 y fue diseñado para ser utilizado en los correos electrónicos, pero también fue adoptado por los navegadores web. En navegadores web el valor 'apego' indica al navegador que ofrecerá el archivo para su descarga con el nombre sugerido - el archivo podría de otro modo se mostrará en la ventana del navegador como si fuera texto normal.

PHP 5.1 introdujo la función fputcsv, que da salida a una serie de datos a un puntero de archivo como valores separados por comas. Debido fputcsv sólo puede escribir en el archivo punteros, la línea 6 se abre la secuencia de salida como si fuera un archivo. Línea 9 entonces emite títulos de las columnas, mientras que la línea 17 bucles más de las filas de datos y les da salida.

martes, 1 de octubre de 2013

Consultar datos en una tabla que no están en otra

Por lo general cuando tenemos relaciones entre dos tablas en cualquier consulta tradicional, queremos saber por ejemplo cuáles son los datos que faltan en alguna tabla.

Me explico.  Por ejemplo queremos sabes cuáles son los eventos que no están en el historial de actividades.

La consulta será entonces:

SELECT tbl_eventos.id  
from 
tbl_eventos left join tbl_historial_actividades
on tbl_eventos.id=tbl_historial_actividades.evento_id
where 
tbl_historial_actividades.evento_id is null

Esta sencilla y extremadamente útil consulta, nos puede salvar el día.

Funciona en cualquier tipo de base de datos transaccional: MySQL, SQL Server, Oracle, Postgress, y muchas otras más.

martes, 18 de diciembre de 2012

Migrar datos y estructuras de SQL Server a MySQL

Recientemente nos encontramos en una disyuntiva dentro de la empresa, en la que nos tocó tomar un giro en la arquitectura de unos de nuestros proyectos principales, que implicaba migrar nuestra plataforma de SQL Server 2005 a MySQL.

Y la primer pregunta que nos surgió fue: "Es posible migrar toda nuestra plataforma e información de SQL Server a MySQL?"... yo ya estaba preparado mentalmente para pasar varias noches con pantuflas peluditas, escuchar rock, y litros de café frente a mi PC haciendo la transición casi manual.

En medio de la lluvia de ideas y de búsquedas me topé con esta herramienta, que realmente me dejó perplejo por su facilidad y gran desarrollo en su interfáz de usuario.

http://www.mysql.com/downloads/workbench/

Es una aplicación desarrollada por los mismos magos de MySQL y pensada para todos aquellos que venimos de otras plataformas de administración de bases de datos.

lunes, 30 de abril de 2012

Configuraciones universales o parámetros universales

Algunas veces nos encontramos con aplicaciones que requieren configuraciones, y estas, muchas veces, se hacen en un archivo de configuración. Pero luego, nos vamos dando cuenta que el archivo de configuraciones es tan grande, o que hay que darle acceso a varios colaboradores que implica que tengamos muchos detalles de seguridad que contemplar.

Indiferentemente a la tecnología, se puede construir un sistema de configuraciones que sea gestionable a nivel de base de datos y hacer una pantalla administrativa para sus diferentes valores.

¿Qué se puede guardar en un sistema de configuraciones?

Casi de todo: Traducciones, parámetros de configuración, plantillas de html, hojas de estilos css, llaves de acceso a APIs, definición de permisos, etc.

El esquema de la base de datos es la siguiente:

En donde:
  • config_id: Es un autonumérico, llave principal.
  • config_area: Nuestro proyecto puede tener varias áreas, aquí se pueden categorizar las diferentes configuraciones por cada uno de los módulos (usuarios, clientes, chat, agenda, facturas, etc)
  • config_texto: Es necesario que le pongamos un texto indicando de qué se trata la configuración.
  • config_parametro: Este es realmente el parámetro que será llamado desde el código, para poder hacer uso de su valor. Personalmente, acostumbro hacerlo memotécnico para poderlo leer o capturar fácilmente desde el código, por ejemplo: val_chat_permitir_salas_privadas, val_usuario_long_max_login, val_usuario_email_requerido, val_lang_en_register, etc
  • config_valor: Este es el valor que haremos uso en el aplicativo, el que mostraremos, o nos permitirá tener completamente configurado nuestro entorno. Sin importar el tipo de base de datos, es recomendable que sea de gran tamaño el archivo, para que su contenido pueda ser amplio.  en algunos proyectos, incluso aquí ingreso hasta la apariencia completa de la plantilla html del sitio.
Crear la tabla en SQLServer (2000, 2005, 2008)

CREATE TABLE [configuracion]( [config_id] [int] IDENTITY(1,1) NOT NULL, [config_area] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [config_texto] [varchar](1500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [config_parametro] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [config_valor] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL, CONSTRAINT [PK_configuracion] PRIMARY KEY CLUSTERED ( [config_id] ASC ) ) END

Crear la tabla en MySQL
CREATE TABLE IF NOT EXISTS `configuracion` ( `config_id` int(11) NOT NULL AUTO_INCREMENT, `config_area` varchar(50) DEFAULT NULL, `config_texto` varchar(1500) DEFAULT NULL, `config_parametro` varchar(50) DEFAULT NULL, `config_valor` text, PRIMARY KEY (`config_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Opcional a esto, se puede construir un administrador para estos datos, o se pueden gestionar todas las configuraciones a nivel de base de datos... eso ya depende del alcance que se le quiera dar al sistema de configuraciones universales.

Una sola función para invocar los valores
En VB.NET

Imports System.Data.SqlClient

    Function LN_obtener_configuracion(ByVal parametro As String) As String
        ' por defecto la respuesta de resultado es una cadena en blanco
        Dim rta As String = ""
        'se conecta a la base de datos
        Dim MyConnection As New SqlClient.SqlConnection("Data Source=server_name;Initial Catalog=my_db;Integrated Security=True")
        Dim MyCommand As SqlDataAdapter
        'hace la consulta en la base de datos
        MyCommand = New SqlDataAdapter("Select config_valor from configuracion where config_parametro='" & parametro.ToString() & "'", MyConnection)
        Dim DS As New DataSet
        Try
            MyCommand.Fill(DS, "res")
        Catch ex As Exception
            'aqui se controla cualquier error
        End Try
        'cierra las conexiones
        MyCommand.Dispose()
        MyConnection.Dispose()
        'extrae el valor, solo si hay algun contenido y existe el parámetro
        If DS.Tables("res").Rows.Count > 0 Then
            'Leemos la primera aparición de este valor en la BD, se supone que solo hay un registro con este parámetro
            rta = DS.Tables("res").Rows(0)("config_valor").ToString()
        End If
        'retorna el valor
        Return rta.ToString()
    End Function

En C#.NET
public string LN_obtener_configuracion(string parametro)
{
 // por defecto la respuesta de resultado es una cadena en blanco
 string rta = "";

 //se conecta a la base de datos
 System.Data.SqlClient.SqlConnection MyConnection = new System.Data.SqlClient.SqlConnection("Data Source=server_name;Initial Catalog=my_db;Integrated Security=True");
 SqlDataAdapter MyCommand = default(SqlDataAdapter);

 //hace la consulta en la base de datos
 MyCommand = new SqlDataAdapter("Select config_valor from configuracion where config_parametro='" + parametro.ToString() + "'", MyConnection);
 DataSet DS = new DataSet();
 try {
  MyCommand.Fill(DS, "res");
 } catch (Exception ex) {
  //aqui se controla cualquier error
 }

 //cierra las conexiones
 MyCommand.Dispose();
 MyConnection.Dispose();

 //extrae el valor, solo si hay algun contenido y existe el parámetro
 if (DS.Tables["res"].Rows.Count > 0) {
  //Leemos la primera aparición de este valor en la BD, se supone que solo hay un registro con este parámetro
  rta = DS.Tables["res"].Rows[0]["config_valor"].ToString();
 }
 //retorna el valor
 return rta.ToString();
}

En PHP
function LN_obtener_configuracion($parametro)
{
 $rta = "";
 $con = mysql_connect("localhost","peter","abc123");
 if (!$con) {
   die('Could not connect: ' . mysql_error());
 }
 
 mysql_select_db("my_db", $con);
 $result = mysql_query("Select config_valor from configuracion where config_parametro='" . $parametro . "'");
 while($row = mysql_fetch_array($result)) {
   $rta = $row['config_valor'];
 }
 
 mysql_close($con);
    return $rta;
}

Para su utilización simplemente ponemos en nuestro código:
VB.NET:
Dim txt_mensajebienvenida As String = LN_obtener_configuracion("val_lang_en_hello").ToString()

C#.NET:
string txt_mensajebienvenida = LN_obtener_configuracion("val_lang_en_hello").ToString();

PHP:
$txt_mensajebienvenida = LN_obtener_configuracion('val_lang_en_hello');

Y de esta manera la variable txt_mensajebienvenida tendrá a partir de este momento el valor que le hayamos puesto al parámetro de val_lang_en_hello en la base de datos.


7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores...