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

jueves, 12 de febrero de 2015

Cargar el resultado de un fichero PHP dentro de un DIV con jQuery

Esta entrada muestra como podemos, dentro de una etiqueta DIV de nuestra página, colocar el resultado obtenido al hacer una llamada a una página php. Para poder hacer esto, lo primero que necesitamos es definir el DIV donde vamos a introducir el contenido:
<div class="contentWrapper" id="contenido"></div>
A cotinuación, con jQuery, en el lugar donde nos interese, haremos lo siguiente:
$("#contenido").load('url_al_archivo.php');
Paso de parámetros GET
Si queremos además pasar algún parametro por GET, se puede hacer de la siguiente forma:
$("#contenido").load('url_al_archivo.php?var1=x&var2=y&var3=z');
Paso de parámetros POST
En el caso de que los parámetros sean por POST, utilizaremos el siguiente formato.
$("#contenido").load('url_al_archivo.php', {var1:x, var2:y, var3:z});
Es todo, así de sencillo.

viernes, 6 de febrero de 2015

Crear un WebService con PHP

Si trabajamos con PHP, una tarea con la casi seguro que nos encontraremos habitualmente es con la de construir un servicio web que exponga una serie de datos. Esto es muy sencillo de hacer en PHP, y vamos a ver como se hace.

Antecedentes
Supongamos que vamos a realizar un webservice que se conecte a una base de datos MySQL para lanzarle consultas y devolver los resultados. Esto será válido para la mayoría de casos con que nos encontramos, independientemente de que después debamos ampliar el servicio con otros métodos (como por ejemplo incluir seguridad, encriptación, etc).

Lo primero que se nos puede ocurrir, es crear una serie de métodos en el WebService de forma que cada uno reciba sus parámetros, monte las consultas, y las lance contra la base de datos para terminar devolviendo los resultados. Esto es correcto, pero vamos a crear una técnica más potente.

En vez de hacer un método por cada consulta a lanzar, vamos a tener un sólo método. Este, recibirá un nombre de opción a ejecutar, y según esa opción, lanzará una u otra consulta. Es más, no tendremos que tener las consultas dentro del propio WebService, sino que nos basaremos para configurarlas en un fichero XML. Esto nos va a permitir disponer de un código muy limpio y claro, con muy poco mantenimiento posterior, y configuraremos las posibles opciones y sus consultas relacionadas en un fichero XML, de forma que para crear, modificar, o eliminar nuevos métodos, no modificaremos el servicio web, sino únicamente el XML. Veamos cómo.

Fichero de configuración
Vamos a crear un fichero XML de configuración que contendrá los métodos de que dispondrá el servicio web. Posteriormente, dicho servicio recibirá el método a ejecutar, su lista de parámetros, y devolverá los resultados.

El fichero podría ser el siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<OpcionesDisponibles>
  <opcion>
    <nombre>GetPaises</nombre>
    <SQL>SELECT cod_pais,pais FROM paises order by pais</SQL>
  </opcion>
  <opcion>
    <nombre>GetPais</nombre>
    <SQL>SELECT cod_pais,pais FROM paises WHERE cod_pais='#PARAMETRO_1#'</SQL>
  </opcion>
</OpcionesDisponibles>
Como se puede ver, es extremadamente simple, y nos permitirá ampliar, modificar, o reducir el servicio web sin tener que modificarlo.

El WebService
Una vez que sabemos lo que queremos, y que tenemos nuestro fichero de configuración de métodos definido, sólo nos queda crear el servicio web.

Nuestro servicio recibirá tres parámetros: la opción a ejecutar, la lista de parámetros relativas a esa función, y el formato de resultado que deseamos. Así pues, manos a la obra:
<?php
  // Recoger parámetros de entrada. Se permite GET y POST
  $paramOpcion = $_REQUEST['opcion'];
  $paramLista = $_REQUEST['listaParametros'];
  $formato = strtolower($_REQUEST['format']) == 'xml' ? 'xml' : 'json';

  // Obtener consulta SQL a ejecutar
  $sql = getSQL($paramOpcion);
  $sql = aplicarParametrosSQL($sql,$paramLista);

  // Lanzar consulta a la base de datos
  if ($sql == '')
    die ('Opcion incorrecta');
  else
  {    
    $datos = getArrayDatos($sql);
    echo formatData($datos,$formato); 
  }


  // Dado un nombre de opción, buscar en el xml su SQL correspondiente
  function getSQL($nombreOpcion)
  {
    $xmlOpciones = simplexml_load_file('opciones.xml');
    $sql = ""; 
    foreach ($xmlOpciones->opcion as $opcion)
    {
      $nombre = $opcion->nombre;
      if ($nombre == $nombreOpcion)
      {
        $sql = $opcion->SQL;
        break;
      }
    }
    return $sql;
  }

  // Aplicar parámetros de la sentencia SQL
  function aplicarParametrosSQL($sql, $listaPametros)
  {    
    if ($listaPametros != '')
    {
      $arrParam = explode('#',$listaPametros);
      for ($i=0; $i<count($arrParam); $i++)
      {
        $nomParam = '#PARAMETRO_'.($i+1).'#';
        $valor = $arrParam[$i];
        $sql = str_replace($nomParam, $valor, $sql);
      }
    }
    return $sql;
  }

  function getArrayDatos($sql)
  {
    $db = mysql_connect('servidor_base_datos','usuario','clave') or die('No se pudo conectar con la base de datos');
    mysql_select_db('base_de_datos',$db) or die('No se pudo seleccionar la base de datos.');
    $resul = mysql_query($sql,$db) or die('Consulta incorrecta:  '.$sql);

    /* create one master array of the records */
    $datos = array();
    if(mysql_num_rows($resul)) 
    {
     while($row = mysql_fetch_assoc($resul)) 
     {
      $datos[] = $row;
     }
    }

    /* disconnect from the db */
    @mysql_close($db);    

    /* Return data array */
    return $datos;        
  }

  function formatData($data,$format='json')
 {
    if($format == 'json' || $format == 'jsonp') 
    {
      header('Content-type: application/json');
      if (isset($_REQUEST['callback']))   // Peticiones ajax
        return $_REQUEST['callback'].'('.json_encode($data).')';
      else
        return json_encode($data);
    }
    else
    {
      header('Content-type: text/xml');
      $xml = new SimpleXMLElement('<response/>');
      return array2xml($data, $xml);
    }
  }

  function array2xml($array, $xml = false)
  {
    if($xml === false)
    {
      $xml = new SimpleXMLElement('<root/>');
    }
    foreach($array as $key => $value)
    {
      if(is_array($value))
      {
        //array2xml($value, $xml->addChild($key));
        array2xml($value, $xml->addChild('item'));
      }
      else
      {
        $xml->addChild($key, htmlspecialchars($value));
      }
    }
    return $xml->asXML();
  }

?>
Y eso es todo. Potente, ¿verdad?. Ahora sólo debemos modificar el fichero XML a nuestro gusto para adaptarlo a nuestras necesidades (ojo, recordar introducir algún sistema de seguridad, y a ser posible, excluir el fichero XML en el fichero robots.txt de nuestro servidor para que no sea indexado).

En otra entrada veremos como consumir un webservice.

Lectura de XML con PHP

Con PHP es sumamente sencillo leer y parsear ficheros XML. Para ver como se hace, lo mejor es hacerlo con un ejemplo.

Supongamos el siguiente fichero XML, que puede ser utilizado por un WebService, y que contiene nombres de método para el WebService y la sentencia SQL que debe ejecutar en cada uno de ellos:
<?xml version="1.0" encoding="utf-8" ?>
<OpcionesDisponibles>
  <opcion>
    <nombre>GetPaises</nombre>
    <SQL>SELECT cod_pais,pais FROM paises order by pais</SQL>
  </opcion>
  <opcion>
    <nombre>GetPais</nombre>
    <SQL>SELECT cod_pais,pais FROM paises WHERE cod_pais='#PARAMETRO_1#'</SQL>
  </opcion>
</OpcionesDisponibles>
Ahora, supongamos que desde PHP deseamos tener una función que dado el nombre del método, nos devuelva la SQL a ejecutar. La solución es tan simple como la siguiente:
// Dado un nombre de opción, buscar en el xml su SQL correspondiente
function getSQL($nombreOpcion)
{
  $xmlOpciones = simplexml_load_file('opciones.xml');
  $sql = ""; 
  foreach ($xmlOpciones->opcion as $opcion)
  {
    $nombre = $opcion->nombre;
    if ($nombre == $nombreOpcion)
    {
      $sql = $opcion->SQL;
      break;
    }
  }
  return $sql;
}
Así de sencillo.

Enviar email con PHP

En esta entrada se muestra una sencilla forma para enviar un email desde PHP. Para ello, se recibirán por parámetro (normalmente desde la llamada de un formulario html) el nombre del usuario, su dirección de email y el mensaje. Con estos datos, nuestro archivo php para enviar correo podría ser el siguiente:
<?php
  // Validar parametros
  if ($_REQUEST['nombre'] == '' || $_REQUEST['email'] == '' || $_REQUEST['mensaje'] == '')
    die ('Parámetros incorrectos');
    
  // Email
  $to = 'tu_direccion_de_email_de_destino';
  $subject = '[tu_asunto_por_defecto]';   
  $header = 'From:tu_email_de_origen';
  // Mensaje   
  $message = 'Mensaje de '.$_REQUEST['nombre'].'('.$_REQUEST['email'].')';
  $message .= $_REQUEST['mensaje'];
  // Enviar
  $retval = mail ($to,$subject,$message,$header);
  if( $retval == true )  
  {
     echo "Mensaje enviado correctamente...";
  }
  else
  {
     echo "El mensaje no se pudo enviar...";
  }
?>
Este método es muy simple, y nos puede servir para empezar, pero a partir de el pueden hacerse cosas más complejas (copias ocultas, ficheros adjuntos, etc). Eso ya queda a las necesidades de cada situación.

Consumir un webservice desde PHP (XML/JSON)

Cuando trabajamos con PHP, es muy habitual encontrarnos con la necesidad de realizar la llamada a un webservice para obtener una serie de resultados para después trabajar con ellos. Existen múltiples formas de conseguir esto, y en este post vamos a mostrar dos posibilidades muy sencillas para conseguirlo. Mostraremos dos ejemplos, uno que recibe los resultados en formato XML y otro en formato JSON. Una vez recibidos los resultados, recorremos la información obtenida para mostrarla por pantalla.

Si el webservice devuelve resultados en XML
<?php
  // Llamada al WebService
  $client = new SoapClient("http://www.webservicex.net/country.asmx?WSDL");
  $result = $client->GetCountries();
  $xml = $result->GetCountriesResult;

  // procesar xml
  $xml = simplexml_load_string($xml);
  foreach($xml->Table as $table) 
  {
    $output .= "<p>$table->Name</p>";
  }
  print_r($output);
?>

Si el webservice devuelve resultados en JSON
<?php
// Función para llamar al webservice y devolver el resultado en un array
function callWebService($method)
{
  $url ='http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo';
  $json = file_get_contents($url);
  $array = json_decode($json,true);
  return $array;
}
Esa misma función puede optimizarse en una sóla línea:
function callWebService($method)
{
  return json_decode(file_get_contents('http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo'),true);;
}
La llamada podría se la siguiente:
$resul = callWebService();
foreach($resul['geonames'] as $city)
{
    $cities .= '<p>'.$city['name'].'</p>';    
}
print_r ($cities);

Espero os sea de utilidad. Si deseas obtener más información, puedes consultar la documentación de php.

domingo, 1 de febrero de 2015

Plugins para Sublime Text

Si trabajos con SublimeText, éste puede extenderse con plugins para hacernos la vida más fácil. En este post hablaremos de dos plugins muy interesantes.

Para poder instalar estos plugins, haremos uso de "Package control". Tenemos las instrucciones de instalación en esta página. Básicamente abrimos la consola de SublimeText (View-Show console) y pegamos el texto que se nos indica en la página de instalación. Reiniciamos SublimeText y ya tenemos instalado este plugin.

SublimeCodeIntel (intellisense)
Este plugin sirve para que cuando vamos escribiendo (según el lenguaje en el que estemos programando), SublimeText nos vaya mostrando las distintas posibilidades existentes (digamos que es un auto-completar para nuestro código fuente, al estilo de VisualStudio). Por ejemplo, si estamos editando un CSS, y dentro de body escribimos b, se nos sugiere una lista de posibles valores que empiezan por la letra b (background,bottom, border,...). Conforme vayamos escribiendo, se nos irá filtrando la lista a las posibilidades que tenemos. De esta manera, además de ahorrar tiempo, evitaremos errores de escritura y nos evita tener que aprender de memoria todas las posibilidades.


El plugin se llama SublimeCodeIntel,y su instalación es muy sencilla:
  • Abrir SublimeText y ejecutar la paleta de comandos (Ctrl+Mayus+P).
  • Seleccionar "Package control: Install Package"
  • En la lista resultante, seleccionar SublimeCodeIntel. Esperamos a que se instale y reiniciamos SublimeText.
La ventaja de este método es que siempre obtendremos la última versión del plugin. Más información sobre este plugin se puede encontrar en su página oficial.

Emmet
Emmet es un plugin para crear estructuras html con muy pocas pulsaciones de teclado. Para ello se siguen una serie de reglas que se pueden consultar en la página oficial.

Su instalación se consigue, una vez instalado Package Control como se indica más arriba, mediante los siguientes sencillos pasos:
  • Abrir SublimeText y ejecutar la paleta de comandos (Ctrl+Mayus+P).
  • Seleccionar "Package control: Install Package"
  • En la lista resultante, seleccionar Emmet. Esperamos a que se instale y reiniciamos SublimeText.
Esto es todo.

 

Copyright @ 2015 Tosblama