jueves, 4 de junio de 2009

Notas para iniciarse en PHP, Parte 8 (Final): La funcionalidad


Manos a la obra


Y si ya dominamos todas las bases entonces ¿qué podemos hacer con PHP?

Cómo mencionamos antes, PHP nos ofrece un gran grupo de funciones internas para realizar diferentes trabajos, así como algunas clases complementarias que se han venido incorporando. Entre las funcionalidades cubiertas encontramos el manejo de archivos de texto, manipulación de bases de datos, envío de correos electrónicos, funciones matemáticas, operaciones con cadenas de texto, uso de los puertos físicos del equipo, manejo de archivos XML, compresión de archivos, creación de imágenes, y eso no es todo, al revisar el manual encontramos muchas opciones más, ya que las funcionalidades que no se encuentran dentro de PHP se pueden incorporar por medio de extensiones, lo cual se ha venido haciendo con varias de las funciones antes mencionadas, como es el caso de el manejo de las bases de datos, gracias a lo que ahora PHP cuenta con una colección de APIs que le permiten acceder a las gran mayoría de los sistemas de bases de datos existente, incluyendo los más importantes de la actualidad como son:
Junto con un grupo de funciones para una capa de abstracción de datos, que nos permiten acceder a diferentes fuentes de datos desde una misma interface:
  • DBA — Database (dbm-style) Abstraction Layer
  • dbx
  • ODBC — ODBC (Unified)
  • PDO — PHP Data Objects
Aquellas extensiones que no estén incorporadas dentro de las opciones del PHP con el que estemos trabajando, pueden incluir fácilmente de diferentes maneras. En Windows basta con copiar los archivos binarios (DLL) en el directorio de extensiones de PHP, normalmente ubicado en el directorio /ext dentro del directorio principal de PHP, y modificar el archivo de configuración php.ini agregando en la sección de extensiones dinámicas la línea extension=nombre_de_la_extension.dll, por ejemplo, para agregar la extensión de acceso a bases de datos de MS SQLServer, bastaría con agregar extension=msql.dll, entonces solo tendríamos que reiniciar el servidor Web para que el cambio surtiera efecto.

En GNU/Linux en cambio, en lugar de archivos DLL se utilizan los archivos Shared Object o de objetos compartidos, que funcionan de manera similar a los DLL ya que nos permiten agregar funcionalidades adicionales a nuestras aplicaciones desde un componente independiente. Para el ejemplo anterior, primero tendríamos que haber incorporado a PHP el archivo binario .so de la extensión, y después incluir en el archivo de configuración la línea extension=msql.so, el primer paso se puede hacer de diferentes formas, como con los asistentes de actualización de software que nos brinda la distribución del sistema operativo que estemos utilizando, algunos de los cuales nos liberan del segundo paso de modificar el archivo php.ini, otra opción más es utilizar el módulo php-dev, que desde la consola de comandos nos permite compilar e instalar extensiones dinámicas para PHP sin la necesidad de tocar el archivo de configuración, gracias a que incorpora a nuestro sistema la instrucción phpize.


Algunas funciones interesantes

Ahora mostraré algunos ejemplos de las diferentes funciones trabajando, como una muestra de los que se puede hacer con PHP, veamos:

Manejo de archivos de texto

Entre las funciones para manipulación de archivos de texto, encontramos las funciones fread() y fwrite(), que nos permiten leer y escribir en archivos respectivamente. En el siguiente ejemplo se muestra una de los usos que podemos darle a estas funciones implementado un contador de vistas:

contador.php
<?php
$total = 0;
$archivo = "contador.txt"; //Nombre del archivo de texto
if(!file_exists($archivo)) { //Comprobamos la existencia del archivo contador.txt
$abre = fopen($archivo, "w"); //De no existir el archivo
$grabar = fwrite($abre, "0"); //lo creamos guardando el valor de 0 dentro
fclose($abre);
}
else {
$grabar = true;
}
if($grabar) {
// Abrimos el archivo para solamente leerlo ("r" para "read")
$abre = fopen($archivo, "r");
// Leemos todo el contenido del archivo
$total = fread($abre, filesize($archivo));
// Cerramos el archivo
fclose($abre);

// Abrimos nuevamente el archivo pero ahora para escribir
$abre = fopen($archivo, "w");
// Sumamos 1 nueva visita
$total = $total + 1;
// Y reemplazamos el contenido por la nueva cantidad de visitas
$grabar = fwrite($abre, $total);
// Cerramos la conexión al archivo
fclose($abre);
}
?>
<html>
<head><title>Contador de visitas</title></head>
<body>
<div align="center">
Eres el visitante número <?php echo $total?> de esta página.
</div>
</body>
</html>


El programa PHP implementa nuestro contador, el cual va llevando dentro de un archivo de texto la cuenta de las ocasiones en que la página es cargada por los usuarios, para posteriormente desplegar la información dentro de la misma.

Si lo que queremos en cambio es acceder únicamente al texto de un archivo para usarlo como una cadena, es más eficiente utilizar la función file_get_contents(), que recibe el nombre o la URL de un archivo y devuelve su contendido como una cadena de texto para que la podamos manipular.

Funciones para cadenas de texto

Entre la gran cantidad de funciones existentes para el manejo de cadenas de texto, encontramos un interesante conjunto contenido en por las funciones POSIX Regex y PCRE, ya que en ambos grupos encontramos que podemos utilizar expresiones regulares para el trabajo de cadenas, así como para la transformación de arreglos a cadenas y viceversa.

Una muestra interesante de esto es la función split que encontramos entre las funciones POSIX:
<?php
$cadena = "En ese camino lago\nQué un día me vio caminar\nNació esta ciega herida";
$arreglo = split("\n", $cadena); //Separamos la cadena por los saltos de línea que contenga
print_r($arreglo);
?>


La cual permite crear un arreglo a partir de una cadena de texto, dividiendo en partes la cadena según el texto que proporcionamos como segundo parámetro a la función. El ejemplo anterior arrojaría un resultado como el siguiente en el navegador:
Array ( [0] => En ese camino lago [1] => Qué un día me vio caminar [2] => Nació esta ciega herida )


Las funciones PCRE son extensiones tipo PERL, que utilizan en todo momento expresiones regulares para trabajar, las cuales resulta muy útiles al momento de validar cadenas de texto, por ejemplo si queremos saber si una cadena cumple con un determinado formato podemos evaluarla con la función preg_match:

validarCadena.php
<?php
$er_nombre = "/^([a-zA-Z]|[ÁÉÍÓÚáéíóúÑñÜü]|[\s,\.'\-])+$/"; //Expresión regular que será utilizada
if(isset($_GET['txtNombre'])) {
$nombre = stripslashes($_GET['txtNombre']); //Eliminamos el caracter de diagonal invertida que PHP agrega automaticamente para los caracteres de comilla simple (')
if(preg_match($er_nombre,$nombre)) //Evaluamos el contenido del texto recibido
$respuesta = "Nombre correcto :)";
else
$respuesta = "Nombre no válido :(";
}
?>
<html>
<head><title>Validador</title></head>
<body>
<form method="get">
Escribe un nombre <input type="text" name="txtNombre" /> <input type="submit" name="enviar" value="Validar" />
</form>
<p><?php echo $respuesta?></p>
</body>
</html>


En el ejemplo anterior se creó una expresión contenida en $er_nombre que sirvió para validar el texto capturado en el formulario de la página, al ser utilizada por la función preg_match(), la cual devuelve un valor booleano dependiendo de si el texto cumple o no con la expresión regular. Puede verse entonces que estas expresiones son herramientas muy útiles al momento de validar los datos capturados por los usuarios en nuestras páginas.

Sin embargo es recomendable utilizar las expresiones regulares solo cuando la situación lo amerita, ya que el tiempo de procesamiento que consumen es superior al de otras instrucciones de procesamiento de texto, que cuales utilizan cadenas simples como parámetros para manipular cadenas.

Manipulación de bases de datos

Como un ejemplo de la funcionalidad ofrecida, vamos probar la extensión mysql par el manejo de bases de datos MySQL, con la cual ya trabajamos en algunos de los artículos antiguos, convendría que revisaran el tema de Introducción al uso de MySQL que tratamos en este blog hace un tiempo para poder seguir este ejemplo, ya que aquí trabajaremos con la misma base de datos. En el siguiente código podemos ver el programa PHP en acción:

consultaMySQL.php
<?php
//Parámetros para la conexión a la base de datos
$servidor = "localhost";
$usuario = "root";
$contrasenia = "[TuConstraseña]";
$baseDeDatos = "obras_literarias";
$conexion = @mysql_connect($servidor,$usuario,$contrasenia); //Abrimos la conexión con MySQL
if(mysql_select_db($baseDeDatos,$conexion)) { //Accedemos a la base de datos
//Establecemos que la información que se intermabiará estará codificada en utf-8
mysql_query("SET NAMES 'utf8'",$conexion);
//Comprobamos que se recibieron correctamente
if(isset($_GET['txtNombre']) && ($nombre = stripslashes(trim($_GET['txtNombre'])))!="") {
$consulta = "SELECT * FROM autores WHERE Nombre LIKE '%".addslashes($nombre)."%'";
$resultado = mysql_query($consulta,$conexion); //Realizamos la consulta
if($resultado) { //Si no hubo error
if(mysql_num_rows($resultado) > 0){//Comprobamos si se encontraron registros
//Almacenamos en una matriz de arreglos asociativos los registros que resultaron
$matriz = array();
while($renglon = mysql_fetch_assoc($resultado)) {//Extrae un renglon del resultado como un arreglo asosciativo
$matriz[] = $renglon;
}
}
else{
$mensajeDeError = "Autor no encontrado";
}
}
else {
$mensajeDeError = mysql_error();
}
}
else {
$mensajeDeError = "Datos imcompletos";
}
}
else{
$mensajeDeError = mysql_error();
}
?>
<head>
<title>Consulta a MySQL</title>
</head>
<body>
<form method="get">
Escribe un nombre <input type="text" name="txtNombre" /> <input type="submit" name="enviar" value="Validar" />
</form>
<? if($mensajeDeError != "") :?>
<p><?php echo $mensajeDeError?></p>
<? else :?>
<table>
<tr><td>Id</td><td>Nombre</td><td>Nacionalidad</td><td>Profesion</td></tr>
<? foreach($matriz as $autor):?>
<tr><td><?=$autor['Id']?></td><td><?=$autor['Nombre']?></td><td><?=$autor['Nacionalidad']?></td><td><?=$autor['Profesion']?></td></tr>
<? endforeach;?>
</table>
<? endif;?>
</body>
</html>

*Nota: Si desean probar el programa recuerden reemplazar el valor de la contraseña en el texto señalado por [tuContraseña].

En este ejemplo, vemos la forma en la que podemos acceder a una base de datos de MySQL y realizar una consulta sobre una tabla, para posteriormente desplegar la información obtenida dentro de una página HTML, lo cual puede parecer algo muy sencillo pero nos permite darnos una idea del potencial de PHP para trabajar son sistemas manejadores de bases de datos. Para ampliar un poco más el ejemplo anteriorla es también pueden revisar el post de este blog titulado Otra forma de acceder a la base de datos con PHP, donde se describe la creación de una clase para abstracción del acceso a datos, es decir que creamos una clase que encapsulará todas las funcionalidades de la extensión mysql dentro de sus métodos, para facilitar el trabajo con la base de datos y el mantenimiento de nuestros programas.

Espero que con este breve artículo hayan podido hacerse una idea general de la funcionalidad de PHP para la creación de proyectos profesionales, como siempre hay que recordar que estos documentos son un compendio de los contenidos de PHP pero no una guía definitiva, por lo que de estarse iniciando en el aprendizaje del lenguaje conviene que revisen los enlaces que fuí colocando como referencias en cada tema. Ahora dependerá de cada desarrollador decidir si PHP es la herramienta que necesitan para resolver sus problemas y de ser así, qué funciones del lenguajes les serán útiles. Y con esta conclusión es que finaliza la serie de post sobre el aprendizaje de PHP que he venido realizando, espero que más de un programador encuentre útil alguna de mis notas y de ser posible me envíen algún comentario.

Hasta la próxima.

0 comentarios:

Publicar un comentario