domingo, 30 de junio de 2013

Extensión MySQLi - Parte 3: Consultas preparadas y escapado

Las consultas que se realizan a la base de datos, en un sistema real, contendrán datos aportados por el usuario. Estos datos habrán sido enviados al servidor ya se mediante peticiones POST o peticiones GET.
La recuperación de estos datos es muy sencilla. Para ello solo tendremos que acceder al array superglobal asociativo correspondiente. Buscaremos en el array $_POST o $_GET dependiendo de como el servidor espere la recepción de información.

Para la comprobación de la existencia de una variable o elemento de array existe una función muy útil llamada isset()

 if (isset($_POST['userName'],$_POST['password'])) {  
   $user = $_POST['userName'];  
   $pass = $_POST['password'];  
   ...  
 }  

Ahora podríamos utilizar estos datos para crear una consulta:

  if (isset($_POST['userName'],$_POST['password'])) {   
   $user = $_POST['userName'];   
   $pass = sha1($_POST['password']);   
   //podriamos comprobar si los campos estan vacios para mostrar error al usuario  
   ...  
   $resultado = $mysqli->query("SELECT idUsuario FROM usuario WHERE nomUsuario='$user' AND  password='$pass'";  
   ...  
  }   

Una regla importante en el desarrollo de aplicaciones web es que nunca hay que fiarse de lo que va a introducir el usuario y siempre hay que adelantarse a posibles datos de carácter malicioso.

Extensión MySQLi - Parte 2: Consultas de selección

En la anterior parte del tutorial hemos hablado de las consultas que no devuelven resultado almacenado en la base de datos; osea las consultas de creación, borrado, inserción y actualización. Pero además de estas, tenemos otro tipo de consultas muy importantes y son las encargadas de mostrar los datos almacenados en la base de datos.

Consultas que devuelven resultado

Este tipo de consultas ejecutarán una sentencia de tipo "SELECT" sobre la base de datos devolviendo un conjunto de resultados en caso de que la consulta sea correcta y haya resultados que mostrar. Y false en caso de error en dicha consulta.

A) Interfaz orientada a objetos

 $sql = "SELECT cliente.id as id, cliente.nombre as nombre, cliente.cantidad as cant, producto.nombre as producto FROM cliente LEFT JOIN producto ON cliente.id=producto.id";  
 $resultado = $mysqli->query($sql);  
 if($mysqli->errno) die($mysqli->error);  

Perfecto, ahora ya hemos ejecutado una consulta que nos va a devolver datos de la base de datos. Los resultados de la ejecución de dicha consulta los tenemos en $resultado. Así que veamos los tres métodos más comunes de mostrar los datos.

Extensión MySQLi - Parte 1: Consultas de modificación

Hasta la versión 5.5 de PHP se podían usar tres extensiones para interactuar con mysql. La extensión MySQL, la extensión MySQLi y PDO. Sin embargo la primera de ella ha quedado obsoleta y ya no se debe de usar (PHP >=5.5). De hecho si la usamos se generará error de tipo E_DEPRECATED.

Las principales ventajas que proporciona MySQLi respecto el uso de la extensión MySQL son:

- Interfaz orientada a objetos. Aunque también podemos usar la interfaz procedimental.
- Soporte para declaraciones preparadas 
- Posibilidad de usar transacciones.

Errores 

Antes de pasar a interactuar con MySQL, hay que comentar ciertas funciones que nos proporcionaran información de los errores que se pueden producir en las diferentes etapas de dicha interacción.

La extensión MySQLi nos proporciona procedimientos y propiedades de objeto que nos informa del último error producido en la base de datos. El uso de cada uno depende de si se está usando la interfaz orientada a objetos o la interfaz procedimental.

Reglas de reescritura - Parte 3: Ejemplos completos

Vamos a ver varios ejemplos que combinan las distintas directivas vistas:

- Ejemplo 1: Permitir el acceso al area de administración solo desde la red local.

 RewriteEngine On  
 RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$  
 RewriteRule /admin - [F]  

De esta manera si la dirección que hace la petición al servidor, no coincide con el patrón, y la URI a la que intentamos acceder es /admin (área de administración) no redireccionaremos y mostraremos la página de error 403 (acceso prohibido).

- Ejemplo 2: Mostrar una página distinta dependiendo del navegador que estemos usando para realizar las peticiones al servidor.

 RewriteEngine On  
 RewriteCond %{HTTP_USER_AGENT} ^Mozilla  
 RewriteRule ^/$ /index.max.html [L]  
 RewriteCond %{HTTP_USER_AGENT} ^Lynx  
 RewriteRule ^/$ /index.min.html [L]  
 RewriteRule ^/$ /index.html [L]  

Reglas de reescritura - Parte 2: Directivas

RewriteEngine

Lo primero que tenemos que hacer para empezar a escribir reglas de reescritura es indicar a Apache que vamos a utilizar el módulo mod_rewrite . Y para ello utilizaremos la siguiente directiva en el archivo .htaccess

 RewriteEngine on   

Para desactivarlo, y así el servidor ignore el resto de la configuración, sólo tendríamos que poner

  RewriteEngine off  

RewriteBase 

Esta directiva se utiliza para indicar la URL base para la reescritura.

 RewriteBase /    

Esta directiva no es obligatoria pero si que es útil. Por defecto la ruta al contenido que usamos para la reescritura es relativa al directorio raíz  del host (por ejemplo public_html/). Por lo que con esta directiva podemos especificar el directorio (ruta) base para las reglas.

Reglas de reescritura - Parte 1: Introducción

Vamos a ver a lo largo del tutorial como podemos realizar numerosas acciones y tareas gracias a las reglas de reescritura. Sin embargo tres de los mayores propósitos son:
  • Ocultar la funcionalidad de PHP y por lo tanto exponer menos las partes internas del sitio. 
  • Restringir el acceso.
  • Crear URLs limpias y legibles que son más fáciles de recordar. Y ayudar de esta manera a los motores de búsqueda. 
Considerando estos dos ejemplos

http://ejemplo.com/index.php?product_id=7
http://ejemplo.com/7/

Podemos ver como la segunda URL es más fácil de entender, ya que es más amigable tanto para el usuario como para los motores de búsqueda. Además en esta segunda URL se ha escondido que el sitio web utiliza PHP. Lo que no nos va a proporcionar ningún tipo de seguridad pero deja menos pistas.