En línea a lo que veníamos trabajando, hemos mejorado nuestra propuesta, simplificando y aclarando algunas ideas.

El siguiente artículo es una actualización de lo publicado en Un framework para consultas preparadas a la Base de Datos. Sin embargo, para no liarnos demasiado, lo haremos a un lado y empezaremos aquí desde cero.

 

Un solo método para ejecutar sentencias que no devuelven datos

En principio, en sql existen dos tipos de consultas, las que devuelven y las que no devuelven datos. El primer grupo, ejecuta sentencias SELECT. El segundo grupo, ejecuta sentencias como: INSERT, UPDATE y DELETE. Para todas estas últimas, proponemos un único método: safeExec.

public db::safeExec(string $query, …$params);
query

La consulta sql

params

Los valores de relleno de la consulta. Puede ser un único array con todos los valores de relleno, o un nuevo argumento por cada valor. Esto le confiere mucha flexibilidad. Veamos dos ejemplos con el mismo resultado:

$db->safeExec("UPDATE `tbl_name` SET `name` = ? WHERE id = ?", [$name, $id]);
$db->safeExec("UPDATE `tbl_name` SET `name` = ? WHERE id = ?", $name, $id);

El método safeExec devuelve el número de filas afectadas, en mysqli será la propiedad: affected_rows.

 

Los conjuntos

Tanto para insertar como editar una fila, se parte de un array asociativo con el nombre del campo a editar y el valor correspondiente.

$set = ['field1' => $value1, 'field2' => $value2];

A continuación, mostraremos un ejemplo por cada sentencia.

$db->safeExec("INSERT INTO `tbl_name` (??) VALUES (??)", $set);
$db->safeExec("UPDATE `tbl_name` SET ?? WHERE id = ?", $set, $id);

El uso de los parámetros sigue siendo el mismo, solo que el doble signo de interrogación corresponde a un conjunto. Por lo tanto, los siguientes ejemplos son válido:

$db->safeExec("INSERT INTO `tbl_name` (`name`, ??) VALUES (?, ??)", $name, $set);
$db->safeExec("UPDATE `tbl_name` SET `name` = ?, ?? WHERE id = ?", [$name, $set, $id]);

 

Los marcadores de posición

En las consultas, es posible crear marcadores de posición o placeholder, es decir, valores de relleno flexibles. Veamos un ejemplo:

$db->safeExec("DELETE FROM `tbl_name` WHERE id IN (?..)", $ids);

En este caso, el parámetro será un array con todas las ids a eliminar.

Los placeholders, tienen el mismo comportamiento que los conjuntos. El siguiente ejemplo es válido:

$db->safeExec("DELETE FROM `tbl_name` WHERE `id` IN (?..) AND `created_at` > ? AND `status` IN (?..)", $ids, $date, $statuses);

Los placeholder deben ser un array numérico. Por lo tanto, en el ejemplo anterior, serán arrays numéricos las variables $ids y $statuses.

 

Conclusión

En principio, seguimos sosteniendo los principios que trazamos en el artículo original, queremos una librería mysqli que:

  • no pierda su caracter declarativo,
  • no quede oculta detrás de php.

En este artículo no abordamos las consultas que devuelven datos, esperamos hacerlo en un próximo artículo.