Hoy vamos a hacer la parte que se encarga de parametrizar las consultas usando el cierre de interrogación (?) como indicador de parámetro. Lo primero que vamos a ver es el código y después una explicación del mismo.
<?php function escapar($valor) { // Retornamos la cadena escapada. Está solo como ejemplo. return mysql_escape_string($valor); } function prepararParametro($param) { if(is_string($param)) { // Si el parámetro es una cadena retornamos el valor // de la cadena escapado entre ' '. return "'".escapar($param)."'"; } else if(is_array($param)) { // Si es un array devolvemos una lista de los parametros // separados por comas. Cada elemento del array es procesado // por esta función para que tenga el formato correcto. $retorno = ''; foreach($param as $p) { // Cuando retorno es vacio ('') quiere decir que no // Tenemos que añadir la coma. if($retorno == '') { $retorno .= prepararParametro($p); } else { $retorno .= ','.prepararParametro($p); } } return $retorno; } else if($param == NULL) { // Si es NULL devolvemos la cadena 'NULL' return 'NULL'; } else { // Devolvemos el parametro. return $param; } } function prepararConsulta($consulta, $parametros = array()) { // Partimos la consulta por los simbolos de interrogacion $partes = explode("?", $consulta); $resultado = ''; $num_parametros = count($parametros); // Recorremos los parametros for($i = 0; $i < $num_parametros; $i++) { // Juntamos cada parte con el parametro correspondiente preparado. $resultado .= $partes[$i].prepararParametro($parametros[$i]); } $num_partes = count($partes); // Si hay más partes que parametros quiere decir que hay una parte final que hay que concatenar if($num_partes > $num_parametros) { $resultado.= $partes[$num_partes -1]; } // Devolvemos la consulta preparada return $resultado; } ?>
En este código hemos definido tres funciones:
- escapar: Simplemente llama a mysql_escape_string para escapar las cadenas.
- prepararParametro: prepara los parámetros en función de su tipo de dato.
- prepararConsulta: esta es la que se encarga de parametrizar la consulta.
La función prepararParametro va comprobando el tipo de dato del parámetro, si es cadena, array, null o ninguno de estos. Cuando es cadena devuelve el parámetro entre apóstrofos y después de haber llamado a escapar, para escapar caracteres especiales. Cuando es un array devuelve cada uno de los elementos de este, después de procesarlos, concatenados y separados por comas, algo útil para usar el operado IN. Si el valor del parámetro es NULL devuelve la cadena NULL. Si no es de ninguno de los tipos anteriores simplemente devuelve el parámetro tal cual, asumiendo que es un número.
La función prepararConsulta parte la consulta pasada por el caracter ?. Luego va concatenando una de estas partes con el correspondiente parámetro. Si al final hay más partes que parámetros concatena la última parte al final y devuelve la consulta con los parámetros sustituidos.
Hay que tener en cuenta que no se realizan comprobaciones como que el número de parámetros pasado sea igual al número de parámetros que aparecen en la consulta. También se podría mejorar de varias formas, pero esta es una buena primera aproximación al problema.
Al final el código, o al menos eso me parece a mí, es mucho más claro que la propia explicación de como funciona. Si hay algo que no entendéis lo podéis preguntar en los comentarios. Por su puesto cualquier mejora que se pueda hacer se agradece.
En el próximo artículo de la serie veremos como usar parámetros con la forma :nombre_parámetro.
Artículos relacionados:
Tags: bases de datos, consultas, PHP