martes, 24 de julio de 2012

Enviar un Email desde PHP

Hoy vamos a enviar un email desde PHP.
Lo primero que vamos a hacer es realizar los cambios necesarios en el php.ini

Vamos a buscar donde dice:

[mail function]
; For Win32 only.
SMTP = localhost //aquí vamos a quitar el ;  y vamos a poner el nombre del servidor de salida.

; For Win32 only.
sendmail_from = mi_email@localhost.com  //aquí vamos a poner la dirección desde la que queremos
                                                                   //enviar el correo, podemos fijarla también en las cabeceras
                                                                  //como verás en el ejemplo.

Importante: Reiniciar el servicio de Apache después de realizar el cambio para que funcione.

Ahora vamos al código

Para enviar email php tiene la función: mail($destino,$asunto,$mensaje,$cabeceras) que permite enviar texto simple sin formato o en formato html, también se pueden enviar adjuntos, lo vamos a ver en la próxima entrada del blog.

Mejor mostramos un ejemplo para que quede más claro

Vamos a definir las cabeceras

//aqui defino para poder utilizar caracteres especiales y enviar texto html
 $cabeceras  = 'MIME-Version: 1.0' . "\r\n";
 $cabeceras .= 'Content-type: text/html; charset=ISO-8859-1' . "\r\n";
 $cabeceras .= 'From: Grupo de Operaciones <yeny@ejemplo.com>' . "\r\n";

Ahora las variables $destino,$asunto y $mensaje las puedo recoger por un formulario o definirlas directamente en el código, según lo necesite.

El cuerpo del correo lo recojo en la variable $mensaje.

Si solo quiero enviar texto simple basta con asignar la cadena de texto a la variable mensaje, por ejemplo:
$mensaje ="este es mi menssaje";
//o si lo recojo por formulario
$mensaje =$_REQUEST["texto"];//donde texto es el nombre que asignamos en el formulatio al
                                                        //textbox donde se introduce el texto.

Ahora, si quiero enviar texto con formato html debo pasar en la variable mensaje todos los tags de mi página html.

Un ejemplo sería.

$mensaje .= "  <tr>";
$mensaje .= "<td width=\"621\" class=\"letra_negrita\">";
$mensaje .= "<div align=\"center\">";
$mensaje .= " Titulo de mi página&nbsp;";
$mensaje .= "</div>";
$mensaje .= "</td>";
$mensaje .= "</tr>";
$mensaje .= " <tr>";
$mensaje .= "<td width=\"621\" class=\"letra_normal_verde_claro\">";
$mensaje .= "<div align=\"center\">";
$mensaje .= " Texto blablabla....."; //aqui puedo incluir resultados de consultas ect.
$mensaje .= "</div>";
$mensaje .= "</td>";
$mensaje .= "</tr>";

Para incluir en el cuerpo del correo resultados de consultas solo introduzco en la cadena mensaje las variables que quiero mostrar, no la consulta en sí.

Un ejemplo:

//aquí recojo las variables del formulario y realizo la consulta
$mes = $_REQUEST["mes"];
$anno = $_REQUEST["anno"];
$resultf = mysql_query("select meses.Mes, anno.anno from anno, meses
where (meses.CodMes='$mes') and (anno.codanno='$anno')",$conexion);
$fecha = mysql_fetch_object($resultf);

$mensaje .= "  <tr>";
$mensaje .= "<td width=\"621\" class=\"letra_normal_verde_claro_negrita\">";
$mensaje .= "<div align=\"center\">";
$mensaje .= "$fecha->Mes/$fecha->anno"; //Aquí muestro en el cuerpo del email el resultado de la
                                                                       // que me interesa de la consulta.
$mensaje .= "</div>";
$mensaje .= "</td>";
$mensaje .= "</tr>";

Una vez definidas todas las variables envío el email.

 mail($destino,$asunto,$mensaje,$cabeceras)

Espero les sea útil, hasta la próxima.





viernes, 22 de junio de 2012

Autenticación PHP con LDAP (Directorio Activo)

Muchas veces cuando realizamos alguna aplicación para una empresa gastamos mucho tiempo creando nuestra base de datos con la estructura de la empresa, los datos de los usuarios (nombres, nicks , contraseñas, datos de contacto),  certificados, permisos y olvidamos una fuente valiosa de información q tenemos a la mano, donde toda esta información puede aparecer organizada de manera lógica y jerárquica: "El Directorio Activo (LDAP)". Por supuesto estamos hablando de empresas con su propia red.

Pero antes de comenzar con el código vamos a definir un poquito q es el Directorio Activo y cómo se encuentra organizada la información en él.
"LDAP son las siglas de Lightweight Directory Access Protocol (Protocolo Ligero de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación el cual permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red." (Esta definición la encontré en Wikipedia y creo da una idea bastante exacta de lo q es LDAP).

Así que mi consejo de hoy es: "si te encuentras haciendo una aplicación empresarial comiences por revizar qué tienes ya en el directorio activo", creéme si está bien estructurado puedes ahorrar mucho tiempo.

¿Cómo se estructura el Directorio Activo?
Simplemente en forma de árbol donde los DNS se utilizan para estructurar los niveles más altos de la jerarquía y conforme se desciende en el directorio pueden aparecer entradas que representan personas, unidades organizacionales o cualquier cosa que representa una entrada dada en el árbol (o múltiples entradas).

Bueno ya podemos comenzar a programar. Por ejemplo vamos a utilizar los datos del Directorio Activo en la autenticación de nuestra Web.

 Algo más que debes saber antes de comenzar: "Nombres y Atributos de LDAP"

  DN: se utiliza en el directorio activo para nombrar la entrada (Distinguished Name)
  CN: common name (nombre completo tiene givenName(nombre propio) y sn(surname o apellido))
  DC: domain component (componentes de dominios)
  OU: organizacional unit (unidades organizacionales)

Ejemplo de estructura de LDAP:
dn: cn="Yeny Firvida" ou="Unidad de Desarrollo de Software" ou="Sucursal Puebla" dc="ejemplo" dc="com" dc="mx"
Como pueden ver los atributos se pueden repetir o no, se debe consultar al administrador de red para ver el diseño específico de su directorio activo.
otros atributos pueden ser:
mail: dirección de correo.
telephoneNumber: número telefónico

Ahora si vamos al código

<?php
//vamos a comenzar conectándonos al directorio activo
 $ds=ldap_connect("hercules.ejemplo.com.mx");  // este es el host donde se encuentra el directorio  
if ($ds) {

    //ldap_ bind: función que permite autenticarse en el directorio.
    //declaro las variables user y pass para recoger los datos q se entraron en el formulario.
    $user =  $_Post[usuario];
    $pass  =$_Post[password];
    if(ldap_bind($ds, $user, $pass)) {

    //existe la combinación de usuario y contraseña
     // abro la sessión (el trabajo con sessiones lo voy a tartar en otra entrega)
     session.start();
     $_SESSION["usuario"] = $user;
    } else {
        //si no se pudo autenticar es q no existe esa combinación de usuario y contraseña
       //imprimo mensaje de error
        echo "Acceso denegado. Verifique usuario y contraseña";
    }
          

    ldap_close($ds);
} else {
    echo "Error al conectarse con el servidor LDAP";

  //vale señalar que el error más común  aqui es que el camino al directorio activo no sea correcto
}
?>

No solo puede utilizarse el directorio activo para la autenticación, se puede obtener cualquier otro dato que se encuentre registrado en el con la funcion ldap_search pero eso lo trataremos en otra entrada.

Espero les sea de utilidad y ya saben, cualquier duda pueden escribirme. Hasta pronto.

sábado, 29 de octubre de 2011

Sumar los resultados de una consulta (PHP y MySQL)

Hola: Hoy vamos a compartir algo sencillo, hacemos una consulta a una base de datos Mysql  y sumamos los resultados que nos devuelve la consulta, todo desde PHP. Sin utilizar el Count() de MySQL.

Este es el código.

<?php
    include('conexion.php');
   
    $consulta = mysql_query("SELECT * FROM tabla");
    $total = 0;
    while($row = mysql_fetch_array($consulta))
    {
      $total = $total + $row['valor que recibí de la consulta'];
    }
    echo $total;
?>

Este mismo código se puede utilizar con MySQL, Interbase, etc. solo se deben sustituir las funciones.

Espero les sirva.

sábado, 17 de septiembre de 2011

Calcular tiempo transcurrido entre dos valores de hora (PHP, MySQL)

Hola:
Hoy voy a publicar cómo calcular el tiempo transcurrido entre dos valores de hora. Digamos por ejemplo que estuve realizando una acción desde las 11:59pm hasta las 4:01am y quiero saber el tiempo transcurrido.
Básicamente MySQL tiene una función para eso TIMEDIFF(expr1,expr2) que devuelve el resultado de la expr1-expr2 en un valor de tiempo (Importante: Ambas expresiones debes ser del mismo tipo).
Se puede utilizar asi:
SELECT TIMEDIFF('2011-12-31 04:01:00 ',   '2011-12-30 23:59:00 ');
Ahora, otra forma sencilla de hacerlo desde PHP, sin utilizar la función MySQL:

<?
function calcular_tiempo_trasnc($hora1,$hora2)
{
//divido la hora en horas, min y seg porque viene en formato hh:mm:ss
list( $h1, $m1, $s1 ) = split( '[:]', $hora1 );
list( $h2, $m2, $s2 ) = split( '[:]', $hora2 );
//resto los segundos
$st=$s2-$s1;
//si me da negativo resto el resultado a 60 y quito 1 a los minutos
if($st<0){
$st=60+$st;
$m2=$m2-1;
}
//resto los minutos
$mt=$m2-$m1;
//si me da negativo resto el resultado a 60 y quito 1 a las horas
if($mt<0){
$mt=60+$mt;
$h2=$h2-1;
}
//resto las horas
$ht=$h2-$h1;
//para que me de hh:mm:ss le agrego 0 alante del # si es menor que 10 sino me queda h:m:s para los menores que 10
$c=0;
if ($ht<10){
$ht=$c.$ht;
}
if ($mt<10){
$mt=$c.$mt;
}
if ($st<10){
$st=$c.$st;
}
//devuelvo el tiempo transcurrido en formato hh:mm:ss
return($ht.":".$mt.":".$st);
} //aquí termina la función
//imprimo el resultado de la función
echo calcular_tiempo_trasnc($hora1,$hora2);
?>

Bueno espero les sea de utilidad. Nos vemos luego para seguir hablando de programación.

lunes, 12 de septiembre de 2011

Conectarse a Interbase(Firebird) desde PHP

Hoy vamos a probar el acceso a datos con otro gestor: Interbase de Firebird.

Como en el caso de MSSQL vamos a comenzar con la configuración para evitarnos un error muy común : Fatal error: Call to Undefined function...

Lo primero es tener la dll. Vamos a comenzar buscando en el directorio dlls donde tengamos instalado el php para verificar si está allí la dll  php_interbase.dll. Si no se encuentra debes descargarla de internet y copiarla en el directorio antes mencionado.
Una vez que tienes la dll hay que modificar el php.ini. Lo puedes hacer con el notepad. Las modificaciones son muy sencillas.

Buscar la linea 
;extension=php_interbase.dll
Se les quita el ; que tiene delante. Guardas los cambios. Reinicias el Apache y listo.

Importante: Si la dll no estaba en la instalación y te las tuviste que descargar de internet debes cambiar también la linea
extension_dir =  Para poner la dirección donde se encuentran las dlls.

Una vez configurado todo vamos al código.

Existen las funciones especificas para conectarnos:


ibase_connect(BD, login, password)
ibase_pconnect(BD, login, password)

Las diferencias son básicamente las mismas que están explicadas en la entrada Conexión a MySQL desde PHP  para las funciones similares de MySQL.

Vamos entonces el ejemplo para la conexión.
<?

//ver que en estas funciones se da la ruta hasta la base de datos y no el nombre del servidor por lo
// que no hay que utilizar select_db. En el ejemplo la base de datos se llama Prueba y está en el
//servidor  remoto APPS

$DB="APPS\CIENCIAYTECNICA\BaseDatos\Prueba.GDB";
//Voy a utilizar el login y el password que trae Interbase por defecto.
$User="sysdba";
$Pass="masterkey";

@ibase_pconnect($DB,$User,$Pass) or die("Error al conectarse a la base de datos") ;

?>
Mi Recomedación: Reitero la recomendación que di en la entrada anterior. Creo que es mejor tener el código de conexión en un archivo aparte y referenciarlo de cada una de las páginas donde se necesite luego. De esta forma ante cualquier cambio en los datos de conexión como nombre del servidor, login o password, solo hay que realizar los cambios en un archivo.

Una vez conectados podemos realizar las consultas a la base de datos, ya sea INSERT, UPDATE, SELECT, DELETE. Para todas se utiliza la misma sentencia ibase_query($conexion, $cadenaconsulta) solo cambia la cadena de la consulta. Fíjese que a diferencia de las funciones similares de MSSQL y MySQL aquí el identificador de conexión se pasa primero y luego la cadena de consulta. Si no se pasa ningún identificador de conexión por defecto toma la última conexión abierta.

Veamos un ejemplo de consultas a la base de datos:
<?
/* Si como recomendé pusiste tu código de conexión en un archivo aparte lo primero es referenciarlo. Puedes hacerlo con require() o include().*/
include(''../conexion.php'');
//consulto la base de datos
$resultcliente = ibase_query($conexion ,"select NCliente, NombreCliente from clientes"); 
//muestro los resultados
while ($c=ibase_fetch_object($resultcliente)) //como hay varias filas lo pongo dentro de un ciclo
{
     echo $c->NombreCliente; //imprimo los resultados
 }//cierro el while
 //los resultados se pueden mostrar en algún elemento html como listbox, checkbox, etc..
?>

Bueno hasta aquí la entrada de hoy, espero sus comentarios y preguntas al respecto.

Nos vemos mañana para seguir hablando de programación.

jueves, 8 de septiembre de 2011

Conexión a MSSQL desde PHP

Bueno, ya sabemos conectarnos a MYSQL por la entrada anterior, vamos a probar ahora con otro gestor: MSSQL.

Vamos a comenzar con la configuración para evitarnos un error muy común : Fatal error: Call to Undefined function...

Lo primero es tener la dll. Vamos a comenzar buscando en el directorio dlls donde tengamos instalado el php para verificar si está allí la dll  php_mssql.dll. Si no se encuentra debes descargarla de internet y copiarla en el directorio antes mencionado.
Una vez que tienes la dll hay que modificar el php.ini. Lo puedes hacer con el notepad. Las modificaciones son muy sencillas.

Buscar la linea 
;extension=php_mssql.dll
Se les quita el ; que tiene delante. Guardas los cambios. Reinicias el Apache y listo.

Importante: Si la dll no estaba en la instalación y te las tuviste que descargar de internet debes cambiar también la linea
extension_dir =  Para poner la dirección donde se encuentran las dlls.

Una vez configurado todo vamos al código.

Como en el caso de MySQL existen las funciones especificas para conectarnos:

mssql_connect(servername, login, password)
mssql_pconnect(servername, login, password)

Las diferencias son básicamente las mismas que están explicadas en la entrada Conexión a MySQL desde PHP para las funciones similares de MySQL.

Vamos entonces el ejemplo para la conexión.
<?
$conexion = mssql_pconnect("NombreServidor","SA","passSA");
mssql_select_db("Prueba");
?>
Mi Recomedación: Reitero la recomendación que di en la entrada anterior. Creo que es mejor tener el código de conexión en un archivo aparte y referenciarlo de cada una de las páginas donde se necesite luego. De esta forma ante cualquier cambio en los datos de conexión como nombre del servidor, login o password, solo hay que realizar los cambios en un archivo.

Una vez conectados podemos realizar las consultas a la base de datos, ya sea INSERT, UPDATE, SELECT, DELETE. Para todas se utiliza la misma sentencia mssql_query($cadenaconsulta, $conexion) solo cambia la cadena de la consulta.

Veamos un ejemplo de consultas a la base de datos:
<?
/* Si como recomendé pusiste tu código de conexión en un archivo aparte lo primero es referenciarlo. Puedes hacerlo con require() o include().*/
include(''../conexion.php'');
//consulto la base de datos
$resultcliente = mssql_query("select NCliente, NombreCliente from clientes",$conexion); 
//muestro los resultados
while ($c=mysql_fetch_object($resultcliente)) //como hay varias filas lo pongo dentro de un ciclo
{
     echo $c->NombreCliente; //imprimo los resultados
 }//cierro el while
 //los resultados se pueden mostrar en algún elemento html como listbox, checkbox, etc..
?>

Bueno hasta aquí la entrada de hoy, espero sus comentarios y preguntas al respecto.

Nos vemos mañana para seguir hablando de programación.

miércoles, 7 de septiembre de 2011

Conexión a MySQL desde PHP

En muchas de las aplicaciones que realicemos vamos a necesitar acceso a datos. Hoy voy a comenzar una serie de tres entradas para hablar de las conexiones a diferentes gestores de bases de datos desde PHP. Estaremos hablando de MSSQL, Interbase de Firebird y MySQL que por ser el más comunmente utilizado es el que le da inicio a la serie.

Empezamos entonces...

Para conectarse a una base de datos MySQL PHP cuenta con dos funciones:

mysql_connect(server_name, login, password)
mysql_pconnect(server_name, login, password): Esta función abre una conexión persistente a la base de datos.

La diferencia fundamental entre las dos es que durante la conexión la función mysql_pconnect() chequea primero si ya existe algún enlace persistente abierto con los  mismos parámetros, y si es así, utiliza ese que ya existe, en vez de abrir una nueva conexión.
Otra diferencia es que como es persistente, la conexión no se cierra, permanece siempre abierta para ser utilizada en el futuro. En el caso de mysql_connect() la conexión debe cerrase cuando se termina de trabajar con ella utilizando la función mysql_close($conexion).

Vale aclarar que todos los parámetros son opcionales, si se deja alguno vacío asume los parámetros por defecto: server_name = localhost , login = nombre del usuario propietario del proceso y password vacía.

Bueno, dadas las explicaciones previas veamos un ejemplo.

<?
// yo he decidido declarar variables para los parámetros pero se pueden pasar directamente.
$server_name="miservidor";  // puede ponerse el nombre o el IP, si fuera local sería localhost
$login="root"; // el nombre de usuario para conectarse a la base de datos
$password="rootpass"; //la contraseña de ese usuario

$conexion=@mysql_pconnect($server_name,$login,$password) or die("Error al conectarse al servidor");

//luego seleccionas la BD que vas a utilizar de ese servidor. En este caso se llama Prueba
 @mysql_select_db("Prueba ",$conexion) or die("Error al conectarse a la base de datos");
   
?>

Mi recomendación: Tener la conexión aparte para que pueda ser utilizada en las diferentes páginas y en caso de alguna modificación en los datos de acceso tengas que modificar un solo archivo.

Una vez conectados podemos realizar las operaciones fundamentales sobre nuestra base de datos: Actualización y Consultas para lo que PHP cuenta con la función mysql_query("cadena SQL",$conexion);

Pero veamos un ejemplo:
Si como te sugerí pusiste tu conexión en un archivo aparte lo primero que debes hacer es referenciar ese archivo en la página actual donde vas a hacer tus consultas.
Lo puedes hacer utilizando require("../conexion.php") o include("../conexion.php")  donde ../conexion.php es la ruta completa al archivo conexion.php.

La consulta:
<?
//en este caso seleccionamos el Número y Nombre de los clientes de una Tabla Clientes.
$resultcliente = mysql_query("select NCliente, NombreCliente from clientes",$conexion);
?>

Mostrar los Resultados
Se pueden mostrar los resultados de muchas formas. Yo particularmente prefiero llevar el resultado de la consulta a objetos con la función mysql_fetch_object(''resultado de consulta'') porque creo que es mucho más fácil para trabajar, ya que podemos referirnos a los resultados con $variableobjeto->nombrecolumna.
<?
while ($c=mysql_fetch_object($resultcliente)) //como hay varias filas lo pongo dentro de un ciclo
{
echo $c->NombreCliente; //imprimo los resultados
 }//cierro el while
?>
Nota: Dentro del ciclo puedo asignar el resultado de la consulta a cualquier elemento HTML como listbox, checkbox u otros es tan sencillo como asignarle al elemento el resultado de la consulta.
Ej.
<?
echo (''<select name=\"cliente\" size=\"1\"  id=\"cliente\">");
while ($c=mysql_fetch_object($resultcliente))
            {           
               echo "<option value=\"$c->NCliente\" > $c->NombreCliente</option>";
            }//cierro el while
echo ("</select>'');
?>
Actualizaciones
Para actualizar los registros de la base de datos (entiéndase insertar, actualizar o eliminar registros) se utiliza la misma función mysql_query lo que cambia la cadena sql que le pasamos.
Por ejemplo insertamos un Cliente
<?  mysql_query ('' Insert into Clientes ($textboxNombre); ?>
Donde TextBoxNombre es la variable que me recoge por Post o Get el valor de un textbox donde entro el nombre que deseo insertar.

Bueno hasta aquí mi granito de arena, espero les sirva de ayuda, cualquier duda o sugerencia pueden comentarla aquí.