Continuamos con la idea de crear una librería para generar consultas a la base de datos de forma rápida y segura.
Lo que proponemos aquí, es una implementación "enriquecida" del lenguaje sql
, a través de una librería de nuestro framework
, que pretende dar flexibilidad y claridad, sin perder de vista la rapidez y la seguridad.
Para ello, vamos a proponer y a analizar dos conceptos: los Valores de relleno y las Sentencias flexibles.
Antes, para entender los ejemplos, vamos a centrarnos en las declaraciones sql, dando por sobreentendido que tenemos una instancia de nuestra librería en la variable $db
, y que esa librería posee los métodos safeFind
y safeExec
para las consultas que, respectivamente, devuelven o no valores.
Valores de relleno
El valor de relleno o placeholder
por defecto en mysqli
es el símbolo de pregunta (?
). A continuación proponemos otros tres valores de relleno.
Valores de relleno flexibles ( ?.. )
Un valor de relleno flexible, simbolizado como ?..
, permite variar el número de valores de relleno según el número de valores que se pasan como parámetro.
En el siguiente ejemplo, se consulta los datos de los usuarios que se pasan a través de un arreglo.
$users = [1, 2, 5, 8];
$db->safeFind("SELECT * FROM `users` WHERE id IN (?..)", $users);
Valores de relleno de conjunto ( ?? )
Un valor de relleno de conjunto genera los valores de relleno a partir de arreglos que poseen el par field => value
. Se pueden utilizar en sentencias INSERT
, UPDATE
y INSERT .. ON DUPLICATE KEY
.
Por ejemplo, si tenemos un conjunto:
$data = ['username' => 'user123', 'email' => 'user123@example.com'];
Podemos hacer las siguientes consultas:
$db->safeExec("INSERT INTO `users` ( ?? ) VALUES ( ?? )", $data) ;
$db->safeExec("UPDATE `users` SET ?? WHERE id = ?", $data, $user_id) ;
$db->safeExec("INSERT INTO `users` ( ?? ) VALUES ( ?? ) ON DUPLICATE KEY UPDATE ??", $data) ;
Valores de relleno de búsqueda de texto ( %? )
Este tipo de valores de relleno modifica (y prepara) el valor pasado como parámetro, para ser utilizado de manera más efectiva en las sentencias LIKE ?
.
Actualmente, lo que hace nuestra librería es:
- si el al texto de búsqueda tiene un carácter, le agregará un comodín
%
al final, por lo que filtrará todos los valores que comienzan con dicho caracter. - si el texto de búsqueda tiene más de un caracter, agregará en ambos extremos el comodín
%
, por lo que filtrará los valores que contengan dicho texto.
En el siguiente ejemplo, devolverá los usuarios cuyo username
comiencen con la letra m
.
$username = 'm';
$db->safeFind("SELECT * FROM `users` WHERE `username` LIKE %?", $username) ;
Sentencias flexibles
Las sentencias flexibles permiten al framework
interactuar con la declaración sql
. Para declarar una sentencia flexible hemos optado por los corchetes. La sentencia flexible más importante es la de WHERE
. Pasemos a un ejemplo:
if ($search) {
$db->where("username LIKE ?", $search) ;
}
$db->safeFind("SELECT * FROM `users` [WHERE]") ;
En el código, si hay un texto de búsqueda, insertará la sentencia y filtrará los resultados, de lo contrario, devolverá todos los usuarios.
Conclusión
Comenzamos hablando de "enriquecer" las consultas sql
porque esperamos que no pierdan su espiritu declarativo. En consecuencia, proponemos valores de relleno que se parecen al estandar, y que intentan dar cuenta de la tarea que realizan. En lo referido a las sentencias flexibles, la idea es conservar las sentencias sql, delimitándolas con corchetes para que sean intervenidas.