Método getVar() para recibir un valor único y parametrización de consultas SQL

  • Por
  • PHP
Explicamos el método getVar() y además mostramos las reglas básicas para parametrización de las consultas en las librerías Spoon.
En el pasado artículo comenzamos a explicar cómo trabajar con bases de datos a través de Spoon. Ya comentamos que la principal ventaja que nos ofrece es la de crear de manera sencilla una capa de abstracción de la base de datos, pero además existen algunas funcionalidades adicionales por las que nos puede resultar útil trabajar con la clase de acceso a base de datos que nos ofrecen: SpoonDatabase.

Si no lo has leído, conviene que pases antes por el artículo anterior, donde explicamos cómo conectar con una base de datos utilizando Spoon. No obstante, te refrescamos la memoria. Fíjate que hacemos una llamada a un constructor y le pasamos una serie de datos. El objeto que recibimos como respuesta (almacenado en la variable $db) es el que vamos a utilizar para invocar métodos como el que explicaremos en este artículo, getVar().

$db = new SpoonDatabase('mysql', 'localhost', 'root', '', 'probando');

Método getVar() para recibir un dato simple

Con el método getVar() de la clase SpoonDatabase podemos acceder de una manera rápida a un valor simple de nuestra base de datos. Esta función resultará bastante cómoda cuando queremos acceder desde PHP a un dato que haya en algún registro de alguna tabla, por ejemplo el precio de un producto.

En PHP para obtener un dato simple tenemos que realizar varias llamadas a funciones de base de datos, como extraer el registro por medio de una consulta, generar un array o un objeto con los datos de ese registro y finalmente acceder al campo que deseamos. Todo eso se puede hacer en una única acción con getVar() desde Spoon.

$precio = $db->getVar('SELECT precio FROM producto WHERE id= 1');

Esto nos recuperaría lo que hay en el campo precio del producto con id=1. En caso que no se encuetre ese producto, simplemente nos devolverá null.

Es una función realmente básica, pero que se nos antoja bastante útil en el día a día. Pero además tenemos que mostraros cómo parametrizar esas consultas con Spoon, lo que nos puede dar todavía algunas ventajas adicionales a la hora de escribir código fuente.

Nota: la manera de parametrizar consultas (osea, enviar parámetros sin necesidad de hacer concatenaciones en el código SQL) que veremos a continuación para el método getVar() la podemos utilizar para otros métodos disponibles en la clase SpoonDatabase.

Parametrizar un dato en una consulta SQL

Al escribir consultas SQL que queremos enviar al método getVar(), y a otros métodos de la clase Database de Spoon, podemos utilizar el carácter interrogación "?" para indicar que se debe sustituir por un valor indicado aparte.

En el siguiente ejemplo veremos cómo hacer que en una consulta SQL donde el identificador del usuario que queremos acceder se encuentra parametrizado.

$nombre_del_usuario = $db->getVar('SELECT nombre_completo FROM usuario WHERE id_usuario = ?', 956);

Como hemos visto, en el código SQL el valor del id_usuario está asignado a "?". Eso quiere decir que ese valor es un parámetro que enviaremos en la llamada a getVar(). Ese valor se debe indicar como segundo parámetro en la llamada al método.

En ese caso estamos enviando el valor 956, por lo que getVar() nos devolverá el nombre completo del usuario que tiene el identificador 956. Resulta obvio que ese dato literal lo podemos indicar con una variable para que, dependiendo del valor de la variable, se busque el nombre completo de uno u otro usuario.

$id_usuario_consultar = 340;
$nombre_del_usuario = $db->getVar('SELECT nombre_completo FROM usuario WHERE id_usuario = ?', $id_usuario_consultar);

Parametrizar varios datos en una consulta SQL

De una manera muy similar podemos parametrizar varios datos en una consulta SQL. Para ello colocaremos varios caracteres interrogación "?" y luego pasaremos un array con los valores que se deben sustituir. Es bien simple, como se puede ver a continuación.

$ssql = "select nombre_completo from usuario where email=? and password=?";
$nombre_del_usuario = $db->getVar($ssql, array("pepe@desarrolloweb.com", "clavepepe"));

Así estamos recibiendo el nombre_completo de un usuario con el campo email "pepe@desarrolloweb.com" y el campo password "clavepepe".

Nota: Lógicamente, en el array enviado a getVar() debemos colocar los valores en el mismo orden en el que aparecieron los "?" en la consulta.

Parametrizar varios datos con identificadores de texto

En determinadas situaciones en los que coloquemos varios valores como parámetro, puede resultar poco claro a primera vista qué es cada "?" y quizás para una lectura de código más rápida por las personas sea útil colocar textos de variables en lugar de interrogaciones. Para ello colocaremos los nombres de variables que queramos precedidos de ":", por ejemplo ":email" o ":clave". Luego indicaremos esos valores en un array asociativo, con los índices que hayamos elegido.

Veamos el siguiente ejemplo que utiliza identificadores con palabras sencillas de entender a primera vista.

$ssql = "select log from log_acceso_usuario where id_usuario=:identificador_usuario and fecha=:fecha_log";
$log = $db->getVar($ssql, array("identificador_usuario"=>1, "fecha_log"=>"2011-07-04"));

En este caso estamos indicando dos variables que se han parametrizado. La primera un identificador de usuario, con el texto ":identificador_usuario" y la segunda una fecha con el texto ":fecha_log". Luego, en la llamada al método getVar() indicamos esos dos valores en un array asociativo, utilizando índices con los mismos textos escogidos, pero sin colocar los ":".

Nota: En ese caso, al utilizar un array asociativo, no se requiere que los índices estén en el mismo orden en el que aparecen los parámetros en la consulta, lo que puede ser una excelente ayuda por si más adelante modificamos la consulta y alteramos el orden en el que aparecen los parámetros.

Si hubiéramos utilizado el método de los "?" y se altera la consulta cambiando el orden de los "?", también deberíamos cambiar el orden del array de valores enviado a getVar(), por lo que el uso del array de valores asociativos resulta más ventajoso.

En este artículo hemos podido mostrar algunas de las ventajas de utilizar la clase de SpoonDatabase, pero nos hemos limitado a explicar cómo trabajar con el método getVar(). Como se puede ver en la documentación, hay mucho más detrás de esa útil clase para el acceso a bases de datos, por lo que en el próximo artículo continuaremos mostrando nuevas funcionalidades, como el acceso a todos los datos de un registro o a varios registros a la vez.