Sobre PHP

Códigos y Scripts de php

Wordfence Security un puglin de Seguridad para su Web en WordPress.

Hola Colegas!

Comparto el siguiente post para los que desean reforzar su seguridad de su Sitio en WordPress

Wordfence el plugin de wordpress que te puede librar de muchos dolores de cabeza!, este plugin es un plugin de seguridad bastante efectivo para tu sitio de WordPress, el mismo ofrece una serie de opciones y/o características disponibles que monitorizan, escanean compara los archivos modificados por atacantes contra los originales liberados por la comunidad de WordPress, bloquea ataques, muestra tráfico online, entre otros.

Wordfence cuenta con dos modalidades la Free disponible para tu Sitio Web y la de pago para antispam y publicidad no deseada.

Comparto algunas pantallas y el link para que lo instalen en su sitio Web y puedan prevenir algun desastre en su Sitio Web.

Más información: http://www.wordfence.com/learn/

Cambiar el botón de “add to cart” por un boton de “Read More”

Recientemente tuve la necesidad de cambiar en un WooCommerce el botón de “Add to Cart” por un botón de “Read More“, en los listados de productos, listados de Categorías del WooCommerce, investigando se debe utilizar los filtros que permite habilitar o deshabilitar dicha funcionalidad.

Esto lo podemos adicionar muy fácilmente, comparto el script que para mi funcionó muy bien.

Primeramente nos vamos al panel de administración de WordPress, ingresamos a la opción de “Appearance/Apariencia“, Luego a buscamos la opción de “Editor/Editor“, En esa pantalla buscamos a lado derecho el script llamado “functions.php” de nuestro template o bien; el template que estamos trabajando en ese momento y en el TextArea ingresamos el siguiente código PHP.

/*Paso #1 - Eliminar el "ADD TO CART BUTTON" de nuestro Shop/tienda  */

function remove_loop_button(){
	remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
}
add_action('init','remove_loop_button');


/*Paso 2 -Agregamos el Boton que linkea a la pagina de detalle del producto, de cada ITEM*/

add_action('woocommerce_after_shop_loop_item','replace_add_to_cart');
function replace_add_to_cart() {
	global $product;
	$link = $product->get_permalink();
	echo do_shortcode('<a href="'.$link.'" class="button addtocartbutton">Read More</a>');
}

Espero les ayude en algún momento de su configuración con WooCommerce.

Buena Suerte!

Controlador PHP

Configuración PHP

PHP es uno de los lenguajes de scripting más populares para la creación de páginas web dinámicas. La mayoría de los sitios y aplicaciones web se basan en scripts PHP. Es por este motivo que los administradores de sitios web deberían entender de forma sumamente clara cómo pueden controlar la ejecución de scripts PHP.

La forma en la que se ejecutan los scripts PHP para un determinado sitio web se define de forma completa mediante dos aspectos: el controlador PHP y la configuración PHP para el sitio. A continuación se describe cómo configurar estos parámetros para un determinado sitio web en el panel de control.

Controlador PHP

Cuando un visitante accede a un sitio basado en scripts PHP, el servidor web interpreta los scripts del sitio para así generar la página que se mostrará al visitante. El controlador PHP llama a las librerías PHP requeridas para esta interpretación. Usted puede escoger entre distintos controladores PHP: ISAPI (Windows), Apache module (Linux), FastCGI, CGI o PHP-FPM (Linux). La decisión acerca del controlador PHP a escoger debería depender de distintos factores, como por ejemplo consideraciones de seguridad, velocidad de ejecución de los scripts y consumo de memoria.

Ejecutar PHP como

Rendimiento

Uso de memoria

Seguridad

Módulo Apache(solo Linux)

Elevado

Se ejecuta como una parte del servidor web Apache.

Baja

Este controlador (también conocido como mod_php) es la opción menos segura, ya que todos los scripts PHP se ejecutan en nombre del usuarioapache. Esto significa que todos los archivos creados por los scripts PHPde cualquier suscriptor del plantendrán el mismo propietario (apache) y el mismo grupo de permisos. Así, las acciones de un usuario pueden afectar a otro usuario o a algunos archivos críticos del sistema.

Nota: puede evitar algunas incidencias de seguridad activando la opción safe_mode de PHP. Esta opción desactiva varias funciones de PHP que suponen un riesgo de seguridad potencial. Tenga en cuenta que esto puede hacer que algunas aplicaciones web no estén operativas. La opción safe_mode se considera obsoleta y está en desuso en PHP 5.3.

Extensión ISAPI (solo Windows, no soportado a partir de PHP 5.3)

Elevado

Se ejecuta como una parte del servidor web IIS.

Baja

La extensión ISAPI puede proporcionar aislamiento del sitio en el caso de que se habilite un grupo de aplicaciones IIS dedicado para las suscripciones. Este aislamiento significa que los sitios de los distintos clientes ejecutan sus scripts por separado. Así, si se produce algún error en un script PHP, este no afectará al funcionamiento de los demás scripts. Además, los scripts PHP se ejecutan en nombre de un usuario de sistema asociado con una cuenta de hosting.

Nota: el controlador de la extensión ISAPI no es soportado a partir de PHP 5.3.

Aplicación CGI

Bajo.
Crea un proceso nuevo para cada petición y lo cierra cuando la petición ya ha sido procesada.

Baja

El controlador CGI proporciona ejecución de scripts PHP en nombre de un usuario de sistema asociado con una cuenta de hosting. En Linux, este comportamiento solo es posible si el módulo suEXEC del servidor web Apache está activado (la opción predeterminada). De lo contrario, todos los scripts PHP se ejecutan en nombre del usuarioapache.

Le recomendamos usar el controlador CGI únicamente como fall-back.

Aplicación FastCGI

Alto (cercano al módulo Apache y a la extensión ISAPI).

Conserva los procesos en ejecución para gestionar otras peticiones entrantes.

Alta

El controlador FastCGI ejecuta los scripts PHP en nombre de un usuario de sistema asociado con una cuenta de hosting.

Aplicación PHP-FPM (solo para Linux)

Alta

Baja

PHP-FPM es una versión avanzada de FastCGI que ofrece muchos beneficios en el caso de utilizar aplicaciones web con una carga elevada.

El controlador PHP-FPM solo está disponible si fue instalado por el proveedor de hosting y si la opciónProcesar PHP mediante nginx está activada en la configuración del sitio web (Sitios web y dominios > seleccione un dominio >Configuración del servidor web).

Nota: el hecho de cambiar PHP del módulo Apache a la aplicación FastCGI puede ocasionar la interrupción de la operatividad de los scripts PHP existentes. Asimismo, el hecho de cambiar PHP-FPM seleccionando Procesar PHP mediante nginx en la configuración del servidor web del sitio web puede tener el mismo resultado.

Fuente de información:http://download1.parallels.com/Plesk/PP12/12.0/Doc/es-ES/online/plesk-customer-guide/index.htm?fileName=70742.htm

Ejemplo de como enviar arreglo Multidimensional Para NuSOAP

Hola Colegas!

Gracias a la consulta de una de mis visitantes, les comparto el ejemplo de como enviar un vector ó arreglo multidimensional con nusoap y que nuestro servicio (webService) lo pueda procesar, es muy similar al ejemplo que compartí anteriormente, únicamente con pequeñas variaciones.

Le vamos a enviar lo siguiente ( arreglo multidimensional):

	
$personas = array();
$personas[1] =  array('cedula' => '123A', 'nombre' => 'Juan',	'FechaNacimiento'	=> 1965);
$personas[2] =  array('cedula' => '123B', 'nombre' => 'Marcos',	'FechaNacimiento' 	=> 1980);
$personas[3] =  array('cedula' => '123C', 'nombre' => 'Pedro',	'FechaNacimiento' 	=> 1990);
$personas[4] =  array('cedula' => '123D', 'nombre' => 'Ana',	'FechaNacimiento'	=> 1995);
$personas[5] =  array('cedula' => '123F', 'nombre' => 'Maria',	'FechaNacimiento'	=> 1972);


Del lado del server nuestro código seria el siguiente:

<?php

// incluimos la libreria ó toolkit nusoap que descargamos previamente
require_once('lib/nusoap.php');

$server = new nusoap_server();

$server->configureWSDL('Mi Web Service', 'urn:mi_ws1');

// Parametros de entrada
$server->wsdl->addComplexType(  'datos_persona_entrada', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('cedula'  		 	=> array('name' => 'cedula','type' => 'xsd:string'),
                                      'nombre'    			=> array('name' => 'nombre','type' => 'xsd:string'),
                                      'FechaNacimiento' 	=> array('name' => 'FechaNacimiento','type' => 'xsd:string'))
);
// Parametros de Salida
$server->wsdl->addComplexType(  'datos_persona_salida', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('mensaje'   => array('name' => 'mensaje','type' => 'xsd:string'))
);


$server->register(	'calculo_edades', // nombre del metodo o funcion
					array('datos_persona_entrada' => 'tns:datos_persona_entrada'), // parametros de entrada
					array('return' => 'tns:datos_persona_salida'), // parametros de salida
					'urn:mi_ws1', // namespace
					'urn:hellowsdl2#calculo_edades', // soapaction debe ir asociado al nombre del metodo
					'rpc', // style
					'encoded', // use
					'La siguiente funcion recibe un arreglo multidimensional de personas y calcula las Edades respectivas segun la fecha de nacimiento indicada' // documentation,
					 //$encodingStyle
);


function calculo_edades($datos) {

	$msg = '';	
	// Recorro el arreglo de datos enviados
	foreach ($datos as $key => $value){
		
		$edad_actual = date('Y') - $value['FechaNacimiento'];
		$msg .= 'La edad de '. $value['nombre'] .' es:' . $edad_actual . ' años ==== <br />'; 
	}
	
	return array('mensaje' => $msg);
}

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Para consumir el servicio en PHP el código sería el siguiente:

<?php

	require_once('lib/nusoap.php');
	
	$personas = array();
	$personas[1] =  array('cedula' => '123A', 'nombre' => 'Juan',	'FechaNacimiento'	=> 1965);
	$personas[2] =  array('cedula' => '123B', 'nombre' => 'Marcos',	'FechaNacimiento' 	=> 1980);
	$personas[3] =  array('cedula' => '123C', 'nombre' => 'Pedro',	'FechaNacimiento' 	=> 1990);
	$personas[4] =  array('cedula' => '123D', 'nombre' => 'Ana',	'FechaNacimiento'	=> 1995);
	$personas[5] =  array('cedula' => '123F', 'nombre' => 'Maria',	'FechaNacimiento'	=> 1972);
	
	
	$cliente = new nusoap_client('http://www.mauricioalpizar.com/ejemplos/nusoap/ce_server.php');
	//print_r($cliente);
	
	$datos_persona_entrada = array( "datos_persona_entrada" => $personas);

	$resultado = $cliente->call('calculo_edades',$datos_persona_entrada);
	
    print_r($resultado);
	
?>

URL para probar el resultado del código anterior:

http://www.mauricioalpizar.com/ejemplos/nusoap/ce_cliente.php

WSDL del WebService: http://www.mauricioalpizar.com/ejemplos/nusoap/ce_server.php?WSDL

Buena Suerte!!!.


					
				
	

Ampliar Conocimientos en Android, JavaScript y HTML

Hola Coleg@s.

Les comparto para los que no conocen a NextU, este es un sitio de elearning para ampliar los conocimientos en Android, JavaScript y HTML, y lo más interesante es que al final del curso recibes un certificado, yo personalmente me inscribí en el curso de Android, el curso inicia con un marco conceptual bastante bueno de JAVA, muy comprensible para los que no estan muy familiarizados con la programación, para lo que ya estan inmersos en este campo, pues refrescar conceptos no cae nada mal.

Otra aspecto interesante es que es brindando en lenguaje latino, por lo que puedes comprender y captar algunos aspectos con mayor claridad de los temas que el profesor brinda.

Les adjunto el link http://www.nextuniversity.com/ y  si  tienes las posibilidades económicas de aquirirlo, ni lo pienses!; Pues en este tipo de temas un certificado que le respalde es de suma importancia para su hoja de vida profesional.

Buena Suerte.

Encriptar mi código fuente de PHP.

Hola Colegas!.

Algún tiempo atrás por no decir años, construí/desarré un código en PHP, el software quedó bastante bien, y pues bien! mi cliente quedo satisfecho con la solución. Poco tiempo después me dice, Mau!, voy a vender el software pero necesito que mi código quede codificado/encriptado para que no lo copien, Ah pues bien! no sabía como hacer eso, tuve que investigar y me encontré una solucion llamada ioncube “Buenisima!” dicho sea de paso, trabajo con ella desde la version 4 ó 5, no recuerdo bien, pero ya van por la version PHP Encoder 8 que fue liberada el pasado Mayo; y tiene soporte en la codificación para software que se encuentre en versión de PHP 5.4, incluso  puedes encriptar el código desde el servicio Web que tienen ellos, basicamente el servicio lee tu código fuente, y lo encripta, la licencia no es gratuida tiene un costo base de $199 con soporte en varios arquitecturas ( Win32, FreeBSD, OS X, Linux (x86) 32/64 bit.

Pues bien! les comparto esta herramienta para que sepan que también se puede proteger el código desarrollado en PHP.:

URL: https://www.ioncube.com/

Buena suerte!.

Pruebas automatizadas de Software Web con IMACROS.

Hola!, comparto el siguiente aporte que estoy seguro que será de mucha utilidad para aquellos desarrolladores de software que cuando se encuentran en la etapa de “probar” o “testear” sus propias aplicaciones dicen: pufff! que cansado!, “ahora tengo que probar mi aplicación una y otra vez”, y nos encontramos en una esta etapa repititiva de hacer ciclos de ciclos para verificar si los datos son ingresados correctamente a mi motor de base de datos, o bien el software realiza el proceso correcto entre pantallas o flujo de procesos, o el peor de los casos tengo mi aplicación terminada y me piden un “pequeñito” ajuste/cambio que me afecta gran parte de mi proceso.

Pues bien!, para esto existen herramientas automatizadas ( para los que no sabían), anteriormente utilizada selenium para mis ciclos de prueba, pero me di a la tarea de investigar alguna otra herramienta o plugin para mi navegador FireFox y me encontré con iMACROS para firefox, aunque tiene varios años de haber sido liberado me di a la tarea de probarlo.

iMacros es una herramienta automatizada que le permite grabar y reproducir aquellas tareas repetitivas que usted realiza constantemente en el navegador, como por ejemplo llenar formularios, realizar procesos de login/autenticación. Además que contiene un librería de ejemplos que le pueden guiar para probar su proyecto.

En conclusión me fue de gran utilidad y les comparto el link de cómo usarlo.

Buena Suerte!

 

Script para habilitar un intervalo de Fechas para sistema de Reserva de Citas.

Hola!, comparto el siguiente script de un pequeño algoritmo que puede ser útil para su sistema de citas. Lo que hace en si, es crear un intervalo de fechas de hoy + x cantidad de días disponibles para que el usuario ( cliente) pueda selecciona el día, ahora lo interesante de este script es que puedes realizar bloqueos por

Mes ( puedes bloquear un mes completo)
Dia especifico recurrente ( esto es como por ejemplo que no este disponible un dia determinado de la semana, Ej: Domingo, Lunes.
Un Fecha en especifico ( Por motivos de un feriado, o bien alguna actividad especial la fecha no debe habilitarse al usuario/cliente)

Recuerda que esto son scripts modulo muy sencillos “core” que deben trabajar en forma conjunto con otros, por ejemplo el otro script del intervalo de horas que publiqué anteriormente.

a continuación el código:

<?php
date_default_timezone_set('America/Costa_Rica');
function consulta_mes($mes){
	switch($mes){
		case '01':{ $mes_letra = 'Enero'; return $mes_letra; break;}
		case '02':{ $mes_letra = 'Febrero'; return $mes_letra; break;}
		case '03':{ $mes_letra = 'Marzo'; return $mes_letra; break;}
		case '04':{ $mes_letra = 'Abril'; return $mes_letra; break;}
		case '05':{ $mes_letra = 'Mayo'; return $mes_letra; break;}
		case '06':{ $mes_letra = 'Junio'; return $mes_letra; break;}
		case '07':{ $mes_letra = 'Julio'; return $mes_letra; break;}
		case '08':{ $mes_letra = 'Agosto'; return $mes_letra; break;}
		case '09':{ $mes_letra = 'Septiembre'; return $mes_letra; break;}
		case '10':{ $mes_letra = 'Octubre'; return $mes_letra; break;}
		case '11':{ $mes_letra = 'Noviembre'; return $mes_letra; break;}
		case '12':{ $mes_letra = 'Diciembre'; return $mes_letra; break;}
	}
}

function consulta_dia($dia){
	switch($dia){
		case 0:{ $dia_letra = 'Domingo'; return $dia_letra; break;}
		case 1:{ $dia_letra = 'Lunes'; return $dia_letra; break;}
		case 2:{ $dia_letra = 'Martes'; return $dia_letra; break;}
		case 3:{ $dia_letra = 'Miércoles'; return $dia_letra; break;}
		case 4:{ $dia_letra = 'Jueves'; return $dia_letra; break;}
		case 5:{ $dia_letra = 'Viernes'; return $dia_letra; break;}
		case 6:{ $dia_letra = 'Sábado'; return $dia_letra; break;}
	}
 }


# Para indicar el bloqueo de algun mes en especifico colocar el valor
# '01' para Enero, '02' para Febrero, etc.
# $a_meses_bloqueados = array('01','02','03'); Bloquea Enero, Febrero y Marzo
$a_meses_bloqueados = array('');


################################# 	0 = Domingo Bloquedo
# Bloqueo para dias Especificos	#	1 = Lunes	Bloquedo
# Formato date("w")			 	# 	2 = Martes	Bloquedo
#$a_dias_bloqueados=array('0');	#
							 	# 	3 = Miercoles Bloquedo
			 					# 	4 = Jueves	Bloquedo
							 	# 	5 = Viernes	Bloquedo
								# 	6 = Sabado	Bloquedo
$a_dias_bloqueados=array();
###########################################################


# Especificar una fecha especifica que debe ser bloqueada.
# $fechas_bloqueadas = array('2015-03-31');
$fechas_bloqueadas = array('');



# Fecha de Inicio,equivale al dia de hoy + 1 ( mañana) 
$int_dias_ini	= date('Y-m-d',mktime(0,0,0,date('m'),date('d')+1,date('Y')));

# Fecha de Fin del ciclo,equivale al dia de hoy + 25 dias proximos
$int_dias_fin	= date('Y-m-d',mktime(0,0,0,date('m'),date('d')+90,date('Y')));


while(strtotime($int_dias_ini)<=strtotime($int_dias_fin)) {

	#echo $int_dias_ini ." Formato Legible:";
	
	$dia_int =  date("w", strtotime($int_dias_ini));# Brinda el dia  0 = Domingos hasta 6=Sabados. Utilizado para los dias dias_bloqueados
	$mes_int =  date("m", strtotime($int_dias_ini));# Brinda el Mes en un rango de posicion del 01 al 12.
	$dia_actual =  date("d", strtotime($int_dias_ini));# Brinda el Mes en un rango de posicion del 01 al 12.	


	# Verifica que el mes , no este en el conjunto de meses bloqueados.
	if (!in_array($mes_int,$a_meses_bloqueados)){ 	
	
		# Verifica que el dia , no este en el conjunto de dias especificos bloqueados.
		if (!in_array($dia_int,$a_dias_bloqueados)){
			
			# Verifica que la fecha indicada no este en el conjunto de fechas ESPECIFICAS DE BLOQUEO
			if (!in_array($int_dias_ini,$fechas_bloqueadas)){
			
				echo "" . consulta_dia($dia_int) ." ". $dia_actual ."-". consulta_mes($mes_int)."";
			
			}
			
		} 

	}
	## Incrementa el contador de STRTOTIME en un dia.
	$int_dias_ini = date("Y-m-d", strtotime( "$int_dias_ini + 1 DAY")) ;
	
}//while(strtotime($inicio)<=strtotime($fin)) {

exit();?>

Suerte!.

Script para habilitar un intervalo de horas con minutos para tu sistema de Reserva de Citas.

Les comparto un script básico que tuve que desarrollar para un módulo de citas de un proyecto “x”. La idea que tuve fue crear un pequeño núcleo que fuera reutilizable para otros módulos y/o componentes donde se requiera un mecanismo de horarios, bloqueo de horas, intervalos en minutos con respecto a las citas que los usuarios pueden reservar.

# Domingos
# Feriados.
# Cupos por Horario.
# Horarios y 
# Horarios con BLOQUEO.
  
/* __________  _   ____________________  ______  ___   ______________  _   __
  / ____/ __ \/ | / / ____/  _/ ____/ / / / __ \/   | / ____/  _/ __ \/ | / /
 / /   / / / /  |/ / /_   / // / __/ / / / /_/ / /| |/ /    / // / / /  |/ / 
/ /___/ /_/ / /|  / __/ _/ // /_/ / /_/ / _, _/ ___ / /____/ // /_/ / /|  /  
\____/\____/_/ |_/_/   /___/\____/\____/_/ |_/_/  |_\____/___/\____/_/ |_/   
*/
 define("MINUTOS",60);
 $h_apertura = 7;  	# 7 AM.
 $h_cierre   = 17; 	# 5 PM - 1hrs. Se maneja en 24hrs
 
 # Si exiten Horas con Bloqueos especificos como Horarios de Almuerzo u otras actividades se llena el siguiente arreglo.
 $bloqueos 	 = array("05:00","05:15","05:30","05:45");

 $intervalo_citas = 4; 	# Los intervalos pueden ser:
 					# 1 = Cada Hora.
					# 2 = Cada 30 minutos 
					# 4 = Cada 15 Minutos
					# 5 = Cada 12 Minutos
					# 6 = Cada 10 minutos
					# 10 = Cada 6 minutos					
					# 12 = Cada 5 minutos										
					# 20 = Cada 3 minutos

	
	

 # Estructura JSON de Respuesta
 $a_datos = array("horas_disponibles"=>array()); // Para Estructura JSON.

					


 // Confecciona un set de horarios con el formato 07:00,07:15,07:30,07:45 ...
 $set_horarios = array();
 # Mantiene la posicion del arreglo de horarios.
 $indice = 0;
 
 while ($h_apertura <= $h_cierre){
	 
	 $inter_minutos = MINUTOS / $intervalo_citas;
	 $i = 0;
	 
	 while ($i < MINUTOS){
		 
		# Estructura JSON de Respuesta
		 $a = array();// Para Estructura JSON.


		 $set_horarios[$indice]['horario'] 			= date('H:i',mktime(date($h_apertura),date($i),date('s'),date('m'),date('d'),date('Y')));
		 $set_horarios[$indice]['horario_etiqueta'] = date('h:i A',mktime(date($h_apertura),date($i),date('s'),date('m'),date('d'),date('Y')));
									  

		 # Si existen horas especificas con bloqueos.
		 # se revisa para que ese horario no sea agregado en el nuevo arreglo de horas.
		 if (!in_array($set_horarios[$indice]['horario'],$bloqueos)){
			 	
				 //unset($set_horarios[$indice]);

				 # Validar el tema de los CUPOS para ese horario.
				 # Se debe validar contra base de datos cuantas citas hay para la fecha seleccionada y Hora seleccionada.
				 # Si la cantidad retornada por el SQL es igual al tope/limite de cupos el horario se debe deshabilitar.
				 
				 // Seudocodigo.
				 // $SQL = debes realizar la consulta a la base con fecha y hora y verificar cuantos registros tiene.
				 // if (cantidad_de_citas = cupo_permitido){
						// unset($set_horarios[$indice]);
		
				 // }
				 
		
				# Estructura JSON de Respuesta
				$a['hora_value'] = $set_horarios[$indice]['horario'];
				$a['hora_label'] = $set_horarios[$indice]['horario_etiqueta'];
				$a_datos["horas_disponibles"][] = $a;	
				# Estructura JSON de Respuesta
				 
				 # Incrementa la posicion del arreglo de horarios
				 $indice++; 		
			  
		 }//if (!in_array($set_horarios[$indice]['horario'],$bloqueos))


		 
		 # Incrementa el contador de Minutos
		 $i = $i + $inter_minutos;	
	 }
	 # Incrementa el contador de Horas
 	 $h_apertura++;	
 }





$a_datos['error']				= "200";
$a_datos['msg_error']			= "OK";
header("Content-type: application/json; charset=utf-8");
echo json_encode($a_datos);	
exit();

Cómo construir un archivo de MS-EXCEL con PHP

Comparto un código desarrollado en PHP que es muy útil en aquellos escenarios donde los programadores deben construir reportes en archivos de EXCEL, la librería utilizada es PHPExcel que deben descargar y subir la librería como parte de su proyecto.

Este código suele ser muy provechoso cuando la cantidad de información que debes sacar de la base de datos es mucha, de manera que dejas la escritura del lado del servidor y luego por una petición o link realizas la descarga del archivo construido.

<?php
# Le decimos a nuestro script que no tenga límite de memoria.
ini_set("memory_limit",-1); 

// Habilitamos la directiva de errores, recordar que cuando esta nuestro código listo como buena
// práctica es comentar la siguiente instrucción.
error_reporting(E_ALL & ~E_WARNING);
# -------------------------------

/** PHPExcel */
// Incluimos la librería de PHPExcel
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
// Le decimos que vamos a trabajar con la versión 2007 o mayor.
// También reconoce archivos .xlsx
include 'PHPExcel/Writer/Excel2007.php';


// Creamos la instancia de la clase de PHPExcel
$objPHPExcel = new PHPExcel();

// Configuramos los valores de las propiedades del archivos
// Esta información se visualiza cuando le das clic derecho a su archivo en el tab de properties/propiedades de
// la venta de Windows.
$objPHPExcel->getProperties()->setCreator("NOMBRE DEL CREADOR O PROPIEDARIO");
$objPHPExcel->getProperties()->setLastModifiedBy("Sistema Web");
$objPHPExcel->getProperties()->setTitle("Reporte de Mensajes");
$objPHPExcel->getProperties()->setSubject("TITULO DEL ARRCHIVO de EXCEL");
$objPHPExcel->getProperties()->setDescription("Puedes colocar aqui una breve descripcion del contenido del documento");
 

$rsql= mysql_query("Escribe aqui la sentencia SQL") or die(mysql_error());	
$nrs = mysql_num_rows($rsql);

// Verificamos que nuestro SQL obtenga resultados
if  ($nrs > 0 ){				

	// Indicamos un nombre para nuestro archivo 
	$filename = "Mi_Reporte.xlsx";
	
	
	// Escribimos en la primera linea de nuestro archivo EXCEL lo titulos.
	$objPHPExcel->setActiveSheetIndex(0);
	$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'NOMBRE_CLIENTE');
	$objPHPExcel->getActiveSheet()->SetCellValue('B1', 'TELEFONO');
	$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'EMAIL');
	$objPHPExcel->getActiveSheet()->SetCellValue('D1', 'EDAD');	
	$objPHPExcel->getActiveSheet()->SetCellValue('E1', 'SALARIO');

	// Le decimos a nuestra primera fila que va a tener color desde la columna A1 hasta la E1.
	$objPHPExcel->getActiveSheet()->getStyle('A1:E1')->
														getFill()->
														setFillType(PHPExcel_Style_Fill::FILL_SOLID)->
														getStartColor()->
														setARGB('FFE8E5E5'); // Color de nuestra fila encabezado/titulos
		
	// Inicializamos la variable $i que es la segunda linea del Excel con el valor de 2, porque es 
	// a partir de esa linea de nuestro archivo de EXCEL que contiene el contenido de nuestra base de datos.
	$i = 2; 
	
	// empezamos a recorrer nuestro recordset.
	while ($rs = mysql_fetch_array($rsql)){	

		// Le decimos al Excel que inicie el llenado de cada fila por medio de la variable {$i}
		// que es nuestro contador del ciclo.
		$objPHPExcel->getActiveSheet()->SetCellValue("A{$i}", $rs['noombre_cliente']);
		$objPHPExcel->getActiveSheet()->SetCellValue("B{$i}", $rs['telefono']);
		$objPHPExcel->getActiveSheet()->SetCellValue("C{$i}", $rs['email']);
		$objPHPExcel->getActiveSheet()->SetCellValue("D{$i}", $rs['edad']);	
		$objPHPExcel->getActiveSheet()->SetCellValue("E{$i}", $rs['salario']);	
		$i++;		
		
    }// fin de while
		
	// Le colocamos el título a nuestra hoja electrónica.
	$objPHPExcel->getActiveSheet()->setTitle('Reporte Mensajes');		



	// Le decimos a nuestro objeto de $objWriter que escriba el contenido generado.
	$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
	
	// Le decimos que guarde el archivo en la ruta llamada "cache" en nuestro servidor.
	// Recuerde que el directorio/carpeta debe tener permisos de escritura por el usuario apache.
	$objWriter->save('cache/'.$filename);	
					
}// if  ($nrs > 0 ){
		
?>

Por lo general yo ejecuto el código anterior por medio de un llamado asincrónica con jquery, y cuando el resultado es satisfactorio devuelvo la respuesta en una estructura JSON, donde cierro mi ventana de “esperando”, previa ventana que habilite cuando solicité el reporte, y luego habilito la descarga por medio de un link.

Ya esto último queda a creatividad del programador como lo desee implementar.

Buena Suerte!