Preparar consultas en mysqli no necesariamente debe ser tedioso, con unos pocos métodos puede facilitarse enormemente la tarea sin demasiada carga en la ejecución.
A continuación analizaremos algunos métodos de la librería «DB» de nuestro CMS.
Realizar consultas seguras
Para realizar consultas seguras basta el siguiente código.
$db->safeExec("DELETE FROM tbl_name WHERE id = ?", $params);
En donde $db es la variable que contiene una instancia de conexión, y el método safeExec tiene 2 parámetros: la cadena con la consulta y un array con los valores de relleno.
Por otra parte, si se desea que la consulta devuelva resultados, el código será:
$res = $db->safeQuery("SELECT * FROM tbl_name WHERE id = ?", $params);
$row = $res->fetch_assoc();
Insertar y editar una fila
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];
Si queremos insertar una fila, el método será:
$db->insert("INSERT INTO tbl_name (??) VALUES (??)", $set);
Si queremos actualizar una fila, el método será:
$db->update("UPDATE tbl_name SET ?? WHERE id = ?", $set, $id);
Nótese que el método acepta más de 2 parámetros, los sobrantes se utilizan para seguir rellenando la consulta.
Insertar y editar varias filas
Los métodos serán similares:
$db->insertAll("INSERT INTO tbl_name (??) VALUES (??)", $sets);
$db->updateAll("UPDATE tbl_name SET ?? WHERE id = ?", $sets, $id);
La variable $sets es un array multidimensional, que contiene todos los conjuntos de array asociativos.
Algunos tips
Los métodos safeExec y safeQuery aceptan un objeto mysqli_statement, eso posibilita consultas del estilo:
$stmt = $db->prepare("INSERT INTO tbl_name (field1, field2) VALUES (?, ?)");
foreach ($sets as $set) {
$db->safeExec($stmt, $set);
}
Un placeholder permite rellenar consultas:
$db->safeExec("DELETE FROM tbl_name WHERE id IN (?..)", $ids);
Nótese que todos los parámetro serán tomados para el relleno.
Otro modo de utilizar el placeholder puede ser desde el método de igual nombre:
$query = $db->placeholder("DELETE FROM tbl_name WHERE id IN (?..)", $ids);
$db->safeExec($query, $ids);
Los parámetros son los mismos que en la consulta.
Conclusión
A la hora de construir la librería, nos propusimos que mysqli:
- no pierda su caracter declarativo,
- no quede oculto detrás del php.
En los resultados, las consultas siguen siendo una cadena declarativa y, en este sentido, se ha cumplido con los requisitos.
Como punto de revisión para un futuro, quizás sea necesario tener métodos que devuelvan resultados de manera más sencilla.
Última actualización 19/12/2019.
Importante: Este artículo se reescribió en Un framework para consultas preparadas a la Base de Datos (2).