Blog de Promineo Studios http://promineostudios.com es Diseño y Desarrollo Web, Tecnologías Web, efectos visuales y mucho más PHPMailer. Enviar correos electrónicos con PHP http://promineostudios.com/blog/articulo/phpmailer-enviar-correos-electronicos-con-php jue, 13 may 2010 12:06:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/phpmailer-enviar-correos-electronicos-con-php Habitualmente, para el envío de correo con PHP se utiliza la función mail(), integrada en el propio lenguaje. Sí bien la función cumple con su cometido, son notorias sus limitaciones.

PHPMailer es una clase que cubre las carencias de mail() y facilita el uso de propiedades avanzadas en el envío de correos. Por ejemplo, permite ficheros adjuntos o utilizar un servidor SMTP con autenticación. Gracias a esta última característica podremos enviar correos desde nuestra cuenta Gmail y evitar la instalación de un servidor de correo.

El primer paso para usar PHPMailer es descargar la clase de sourceforge. Nos encontraremos con dos archivos que debemos instanciar en nuestro código, class.phpmailer.php con la clase y class.smtp.php, opcional para utilizar servidores SMTP.

Empezamos con un ejemplo simple usando Sendmail:

require 'class.phpmailer.php';
 
$mail = new PHPMailer();
 
$mail->IsSendmail();//usamos Sendmail, también podemos usar mail() con isMail()
 
$mail->FromName = 'Juan Palomo';
$mail->From = 'remitente@dominio.com';//email de remitente desde donde se envía el correo.
 
$mail->AddAddress('destinatario@dominio.com', 'Destinatario');//destinatario que va a recibir el correo
 
$mail->AddCC('copia@dominio.com', 'copia');//envía una copia del correo a la dirección especificada
 
$mail->Subject = 'Asunto de email';
 
$mail->AltBody = 'cuerpo del mensaje en texto plano';//cuerpo con texto plano
 
$mail->MsgHTML('Mensaje con HTML');//cuerpo con html
 
$mail->AddAttachment("archivo.zip");//adjuntos un archivo al mensaje
 
if(!$mail->Send()) {//finalmente enviamos el email
   echo $mail->ErrorInfo;//si no se envía correctamente se muestra el error que ocurrió
} else {
   echo 'Correo enviado correctamente';
}
 

Enviar un correo usando Gmail y PHPMailer:

require 'class.phpmailer.php';
require 'class.smtp.php'; //incluimos la clase para envíos por SMTP
$mail = new PHPMailer();
 
 
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com"; //servidor smtp
$mail->Port = 465; //puerto smtp de gmail
$mail->Username = 'email@gmail.com';
$mail->Password = 'tucontraseña';
 
$mail->FromName = 'Juan Palomo';
$mail->From = 'remitente@dominio.com';//email de remitente desde donde se envía el correo.
 
$mail->AddAddress('destinatario@dominio.com', 'Destinatario');//destinatario que va a recibir el correo
 
$mail->AddCC('copia@dominio.com', 'copia');//envía una copia del correo a la dirección especificada
 
$mail->Subject = 'Asunto de email';
 
$mail->AltBody = 'cuerpo del mensaje en texto plano';//cuerpo con texto plano
 
$mail->MsgHTML('Mensaje con HTML');//cuerpo con html
 
$mail->AddAttachment("archivo.zip");//adjuntos un archivo al mensaje
 
if(!$mail->Send()) {//finalmente enviamos el email
   echo $mail->ErrorInfo;//si no se envía correctamente se muestra el error que ocurrió
} else {
   echo 'Correo enviado correctamente';
}
 

 

]]>
Imprimir array - matriz PHP http://promineostudios.com/blog/articulo/imprimir-array-matriz-php vie, 29 ene 2010 11:18:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/imprimir-array-matriz-php Puedes imprimir los valores almacenados en un array con la función print_r(). Nos devolverá los valores de la matriz en una estructura legible.

$equipos = array ('Real Madrid', 'Tenerife', 'Barcelona', 'Valencia'); 
echo <pre>'.print_r ($equipos).'<pre>';

Salida:
Array
(
    [0] => Real Madrid
    [1] => Tenerife
    [2] => Barcelona
   [3] => Valencia

)

También puedes usar la función implode para imprimir los valores en orden de aparición de un array siguiendo un patrón de separación entre elementos, en este ejemplo la coma.

echo implode (",", $equipos);

Salida:

Real Madrid, Tenerife, Barcelona, Valencia

Aclaración: Implode() sólo funciona con matrices unidimensionales.

 

]]>
Cortar una cadena de caracteres sin partir la última palabra http://promineostudios.com/blog/articulo/cortar-una-cadena-de-caracteres-sin-partir-la-ultima-palabra mié, 21 oct 2009 22:50:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/cortar-una-cadena-de-caracteres-sin-partir-la-ultima-palabra En PHP tenemos multitud de funciones para tratar cadenas de caracteres. Una de ellas, substr, nos devuelve un fragmento o porción de la cadena que estamos manipulando. El problema viene cuando queremos que no se  corte la última palabra de la subcadena que obtenemos. Ninguna función de manipulación de cadenas es capaz de identificar una palabra y no cortarla, pero podemos utilizar una combinación de éstas funciones para obtener una subcadena sin cortar palabras por la mitad.

Con el código que describo a continuación podéis cortar una cadena, dado un número de caracteres, sin partir la última palabra de la subcadena resultante.

$texto = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$cantidadCaracteres = 25;
 
//1.- Obtenemos un fragmento de la cadena desde el índice cero hasta la longitud dada por la variable$cantidadCaracteres
$subcadena = substr($texto,0,$cantidadCaracteres);
 
//2.- strrpos encuentra la posición de la ultima aparición de un caracter, en éste caso el último espacio en blanco de la cadena que obtenemos con substr
$indiceUltimoEspacio = strrpos($subcadena," ");
 
//3.- Con substr obtenemos una subcadena de $texto desde la posicion inicial hasta la posición del último espacio que nos interesa
echo substr($texto,0, $indiceUltimoEspacio);
//salida por pantalla-> Lorem ipsum dolor sit

Y ahora el mismo código  en una sola línea:

$texto = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$cantidadCaracteres = 25;
echo substr($texto,0,strrpos(substr($texto,0,$cantidadCaracteres)," "));

Este aporte no es ni mucho menos mío, debemos darle las gracias a Javier Cerezo que dejo  un comentario en un artículo de la página programacionweb.net con este tip. 

]]>
MySQL + PHP: Recuperar valores de un campo ENUM http://promineostudios.com/blog/articulo/mysql-php-recuperar-valores-de-un-campo-enum vie, 18 sep 2009 13:02:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/mysql-php-recuperar-valores-de-un-campo-enum Entre los distintos tipos de datos que puede manejar MySQL se encuentran las enumeraciones, definidas con la palabra clave enum. Una lista de enumeradores, como se denomina un enum, no es más que un conjunto de constantes con nombre que definimos en la estructura de nuestra base de datos.

Si has usado un enum en un campo de una tabla, seguro que has querido extraer todos los valores que componen la lista de enumeradores y, posiblemente, no has sabido como hacerlo. He aquí la solución usando PHP:

//Asumo que ya estamos conectados a la base de datos
//Consultamos todos los posibles valores de la columna ENUM
$consulta = $this->db->prepare('SHOW COLUMNS FROM nombreTabla LIKE "nombreCampoEnum"');
$consulta->execute();
//Obtenemos los resultados de la consulta
$array = $consulta->fetch(PDO::FETCH_ASSOC);
//expresión regular que obtiene los valores de enum
$array = explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\",$array['Type']));
print_r($array);

La clave de todo está en la línea en que llamamos a la función explode(). Mediante una expresión regular analizamos la variable $array y extraemos los valores del enum.

P.D: Para los más despistados... Uso para la consulta a la base de datos PHP Data Objects.

 

 

]]>
¿Cómo contar el número de líneas de código fuente de nuestros proyectos? http://promineostudios.com/blog/articulo/como-contar-el-numero-de-lineas-de-codigo-fuente-de-nuestros-proyectos dom, 30 ago 2009 15:20:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/como-contar-el-numero-de-lineas-de-codigo-fuente-de-nuestros-proyectos La respuesta tiene nombre propio, slccount. Un pequeño programa para GNU/Linux que, como casi siempre, podemos descargar desde los repositorios de Ubuntu. Para eso tenemos que escribir el siguiente comando en la consola:

sudo apt-get install sloccount

Una vez instalado sólo debemos llamar a sloccount pasando la ruta de nuestro proyecto, yo lo he usado en puskasCMS que está escrito en PHP5, pero se puede usar con otros muchos lenguajes de programación.

sloccount /ruta_del_código_fuente

Además, nos proporciona una estimación económica de nuestro proyecto, eso sí, un tanto desorbitada desde mi punto de vista.

Total Physical Source Lines of Code (SLOC) = 57.868

Development Effort Estimate, Person-Years (Person-Months) = 14,18 (170.13)

Estimated Average Number of Developers (Effort/Schedule) = 9,66

Total Estimated Cost to Develop = $ 1.915.147 (average salary = $56.286/year)

¡Mi gestor de contenidos tiene casi 60.000 líneas de código! Tengo que hacer más vida social...

]]>
Include(), include_once() VS require(), require_once() http://promineostudios.com/blog/articulo/include-includeonce-vs-require-requireonce mar, 11 ago 2009 16:59:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/include-includeonce-vs-require-requireonce PHP ofrece cuatro declaraciones para insertar código de un archivo externo en nuestro archivo fuente:

  • include "archivo"
  • include_once "archivo"
  • require "archivo"
  • require_once "archivo"

Cualquiera de estas declaraciones es sustituida por el código del archivo que se invoca. Hasta ahí todos los que están acostumbrados a desarrollar en PHP llegan, el problema viene cuando no sabes donde se debe usar una u otro tipo de declaración, es eso lo que vamos a intentar aclarar en este artículo, las diferencias entre las declaraciones de inclusión.

La declaración require() sustituye el código antes de que se ejecute el script, mientras que con include() la sustitución se realiza en tiempo de ejecución. Una gran diferencia pero no la única. Si usas include() e intentas incluir, valga de redundancia, un archivo que no existe te devolverá un warning y el script se seguirá ejecutando. Con require() en caso de no encontrar el archivo que se requiere te devolverá un error fatal y la ejecución del script se detendrá.

En mis proyectos suelo usar require() para el núcleo de la aplicación que lleva el peso de toda la lógica, así me aseguro que si por alguna razón no se incluye un archivo no se seguirá ejecutando, evitando de esta manera fallos más importantes. Para incluir archivos html como un pie de página si uso include(), ya que si estos archivos no se cargan no impide el correcto funcionamiento de la aplicación.

Tanto require_once() como include_once() funcionan de la misma manera que sus homónimos nombrados anteriormente, con una única salvedad. Aseguran que el código del archivo es agregado una sola vez, evitando redeclaraciones de variables o funciones. Hay que tener en cuenta que require_once e include_once son más pesadas de procesar que require e include, por lo que debemos usarlas con prudencia.

Referencias: Ali Hartono's Diary | nachox

 

]]>
Servidor web en Kubuntu (Apache2 + PHP5 + MySQL) http://promineostudios.com/blog/articulo/servidor-web-en-kubuntu-apache2-php5-mysql mar, 04 ago 2009 17:10:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/servidor-web-en-kubuntu-apache2-php5-mysql Montar un servidor web básico, bajo una distribución basada en Ubuntu, es una tarea realmente sencilla si sabes los pasos que debes seguir. Ejecutando  los comandos de consola que escribiré a continuación no tendrás ningún problema para instalar tu propio servidor local.

lamp

Leer el resto del artículo]]>
PDO: PHP Data objects http://promineostudios.com/blog/articulo/pdo-php-data-objects mar, 28 jul 2009 12:02:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/pdo-php-data-objects PDO es una extensión de acceso a datos para PHP5, la cual nos permite conectar a multitud de sistemas gestores de bases de datos indicando el driver correspondiente.

Sus grandes ventajas radican en que; Es una extensión eficiente que fue desarrollada en C. Sus métodos son independientes del sistema gestor de bases de datos que usemos, permitiendo que una aplicación pueda migrar de un motor de  bd a otro con sólo indicar el driver correspondiente al nuevo motor. Y Previene que en las consultas se inyecte SQL malicioso (SQL Injection) usando consultas parametrizadas.

Comenzamos con unos ejemplos, para los que he tomado MySQL como SGBD:

Leer el resto del artículo]]>
Puskas CMS. Las entrañas de Promineo Studios http://promineostudios.com/blog/articulo/puskas-cms-las-entranas-de-promineo-studios sáb, 18 jul 2009 13:35:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/puskas-cms-las-entranas-de-promineo-studios No sé que sentimientos puede tener un padre hacía un hijo, no soy padre. Pero soy hijo y por lo tanto podría ponerme en la piel de Puskas CMS para experimentar los sentimientos, si los tuviese, hacia su creador, el mismo que aquí escribe.

Después de meses de gestación, Puskas existe. Crece y se enriquece con la única pretensión de sustentar lo que hoy podéis ver como promineostudios.com.

Cuando comencé el desarrollo tuve que tomar decisiones que afectarían a cualquier evolución posterior de la aplicación. Decidí replantear todo el trabajo que había realizado hasta el momento. Como base usé el patrón de diseño MVC, hasta ahora usaba un híbrido entre OOP PHP5 y un sistema de plantillas con el que podía tener el código más o menos limpio y sencillo de mantener, pero que no era suficiente. No para lo que yo quería que fuese el CMS de Promineo Studios.

El anterior sistema de plantillas, Smarty, era bastante correcto en su funcionamiento pero requería demasiados recursos, además de obligar a aprender un pseudo-lenguaje nuevo, muy sencillo eso sí. Smarty se hizo prescindible, ya que desarrollé mi propio motor de plantillas valiéndome del propio PHP y las QuickTags. El aumento de rendimiento fue significativo, aún cuando smarty cachea las plantillas, ya no era necesario tener un motor tan pesado para generar las vistas de una página.

El segundo paso fue programar el núcleo de la aplicación con todas las funcionalidades básicas que incorporaría el CMS. Como por ejemplo, controladores base, modelos base, configuración, autentificación de usuarios, filtros de entrada de datos, manejador de conexión a base de datos, multilenguaje, sesiones y demás hierbas.

Como funcionalidades más 'revolucionarias' del núcleo puedo nombrar el uso PHP Data Objects, Gettext o manejo de Sesiones desde una base de datos. De PHP Data Object, escribiré e instruiré en próximos artículos en los que transmitiré todo lo que he aprendido de esta interfase de acceso a datos que me tiene enamorado ;-p. Sobre Gettext, que puedo decir... Es el pilar de toda aplicación multilenguaje que se precie. Y el manejo de sesiones desde una base de datos da para otro artículo.

Dejando de lado el núcleo, Puskas ofrece un completo sistema de blog, videoblog y creación de cualquier contenido para una web. Debo reseñar la incorporación de trackback y pingback en el blog, una característica muy interesante para comunicar contenido referenciado entre blogs. Comentarios enriquecidos con Ajax, votación de artículos

Aún queda mucho que madurar y para próximas versiones incorparé un sistema de caché para contenido estático, comentarios para el videoblog y cualquier cosa que se me vaya ocurriendo. txp4zuaybj

Puskas CMS 1.5

]]>
php_flag con PHP corriendo como CGI http://promineostudios.com/blog/articulo/phpflag-con-php-corriendo-como-cgi mar, 14 jul 2009 23:12:00 GMT Yoné Rocha http://promineostudios.com/blog/articulo/phpflag-con-php-corriendo-como-cgi Los php_flag son parámetros de seguridad que habitualmente se configuran desde el php.ini para todo el servidor o desde el .htaccess para una aplicación en particular. En caso de tener PHP instalado como un módulo de apache podrás configurar los php_flag desde el .htaccess de la siguiente manera:

php_flag magic_quotes_gpc Off
php_flag safe_mode on
php_flag expose_php off
php_flag display_errors off

En cambio, si tu instalación PHP corre como CGI esta forma sólo hará que tu web muestre un error interno del servidor. Para evitar esto podemos crear un php.ini para la aplicación web. Es tan sencillo como crear un archivo de texto con el nombre 'php.ini' en el directorio raíz de la web e introducir los flags que necesitas, como puedes observar en el siguiente ejemplo:

magic_quotes_gpc = Off
display_errors = Off
register_globals = Off 
]]>