Posts Tagged ‘bases de datos’

abril 13, 2010 0

Cheat sheets para todos los gustos

By in General

Navegando por estos mundos de Internet he encontrado una colección de cheat sheets muy interesante. Podemos verlas todas en el siguiente enlace: Cheat Sheets.

Me han parecido muy interesantes las siguientes:

Por supuesto hay muchas más que pueden ser de mucha utilidad mientras se desarrolla.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , ,

febrero 26, 2010 0

Tutorial de ADOdb: Parte II

By in Librerías, PHP

En el anterior tutorial vimos como conectarnos a una base de datos. Hoy veremos como realizar consultas a la base de datos. Para ello vamos a ver un ejemplo donde nos conectaremos a una base de datos, MySQL en nuestro caso, y mediante el método Execute realizaremos una consulta a la base de datos (el ejemplo es muy parecido al de la anterior parte).

<?php

include('adodb.inc.php');

$conexion = NewADOConnection('mysqli');
$conexion->Connect('localhost', 'user', 'password', 'db');

$recordSet = $conexion->Execute('SELECT user_id, user_name FROM users');

if($recordSet != false)
{
 while(!$recordSet->EOF)
 {
  echo $recordSet->fields[0].':'.$recordSet->fields[1].'<br>';
  $recordSet->MoveNext();
 }
}

?>

Lo que hacemos es conectarnos a la base de datos, como vimos en la primera parte, y después ejecutamos una consulta con el método Execute. Este método nos devuelve una instancia de la clase ADORecordSet o false si ha ocurrido algún error. Esta clase nos provee de una serie de métodos y propiedades para manejar los datos devueltos por la consulta.

Una vez hecha la consulta comprobamos si se ha ejecutado correctamente la consulta. Acto seguido realizamos un bucle while siempre que no se haya llegado al final del recordset. Para ello comprobamos la propiedad EOF que nos indica si hemos llegado o no al final.

Luego imprimimos los datos. Para acceder a los datos de cada registro hacemos uso de la propiedad fields. Esta propiedad es un array que contiene cada uno de los campos de nuestro registro. Una vez que ya hemos hecho lo que queríamos, en este caso simplemente mostrar los datos, nos desplazamos al siguiente registro con el método MoveNext de la clase ADORecordSet.

Pero también podemos realizar otro tipo de consultas, por ejemplo de inserción o de modificación de registros. Para ello hacemos uso también del método Execute de la clase ADOConnection. Veamos un ejemplo:

<?php

include('adodb.inc.php');

$conexion = NewADOConnection('mysqli');
$conexion->Connect('localhost', 'user', 'password', 'db');

if($conexion->Execute('UPDATE user_name FROM users WHERE user_id = 1'))
{
 echo "Actualización realizada.";
}
else
{
 echo "Error al actualizar";
}

?>

En este caso el método devuelve true si la consulta se realiza satisfactoriamente y false si ocurre algún error.

Paso de parámetros a las consultas

Una de las cosas que podemos hacer con el método Execute es añadirle parámetros a las consultas. Para ello tenemos que construir la consulta de una forma especial, para indicar donde están los parámetros, y pasarle al método Execute un array con el valor de dichos parámetros. Veamos como hacerlo:

$rs = $conexion->Execute('SELECT user_name FROM users WHERE user_id=?', array($user_id));

Se puede apreciar que en la consulta se ha usado el símbolo ? para indicar donde va el parámetro. Como segundo parámetro del método execute se le pasa un array con los valores, en este caso es uno solo, de los parámetros.

Se puede usar este método con más de un parámetro:

$rs = $conexion->Execute('SELECT user_name FROM users WHERE user_id=? AND user_login =?', array($user_id, $user_login));

Podemos ver también que las cadenas no deben ir entre comillas en los parámetros, pues las comillas se le añaden a posteriori.

Otros métodos de la clase ADORecordSet

Métodos que devuelven una sola fila
Método: Descripción:
FetchRow() Devuelve una fila como un array y se desplaza al siguiente registro implícitamente.  No es necesario llamar después al método MoveNext.
FetchObject($toupper=true) Devuelve una fila como un objeto, siendo cada miembro un campo del registro. Si $toupper es igual a true los nombres de los campos irán en mayúsucula. Se recomienda usar el método FetchNextObject.
FetchNextObject($toupper=true) Igual que FetchObject pero mueve el puntero de posición al siguiente registro.
FetchObj() Igual que FetchObject(false)
FetchNextObject() Igual que FetchNectObject(false)
Métodos que devuelven todas las filas
Método: Descripción:
GetArray([$numRows]) Devuelve un array bidimensional con las filas desde la posición 0 a la $numRows -1. Si no se define $numRows devuelve toda la fila.

La clase RecordSet tiene muchos más métodos que nos pueden ser útiles, pero de momento con esto es suficiente. Si se quiere ver el resto de métodos se puede ver la documentación de la clase.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , , ,

febrero 2, 2010 0

Tutorial de ADOdb: parte I

By in Librerías, PHP

Hola de nuevo. Después de más de un mes de vacaciones blogueras, al trabajo si que he tenido que ir, volvemos a la carga con un nuevo tutorial, en este caso de ADOdb.

ADOdb es una librería para PHP para acceder a bases de datos. La ventaja de usar esta librería está en que si se cambia de base de datos, por ejemplo de MySQL a PostgreSQL, no es necesario reescribir todo el código.

Lo primero que vamos a hacer es descargar la librería de la sección de descargas. Una vez tengamos la librería vamos a ver como conectarnos a una base de datos.

Para ello vamos a ver un pequeño ejemplo:

<?php

include('adodb/adodb.inc.php'); //Incluimos la librería

$conexion = ADONewConnection('mysqli'); // Creamos una conexión con el Driver MySQLi
$conexion->connect('host', 'user', 'password', 'database_name'); //Nos conectamos a la base dedatos

$recordSet = $conexion->Execute('SELECT * FROM tabla'); //Realizamos una consulta

if(!$recordSet) //Si ha habido algun error
{
  echo $conexion->ErrorMsg(); //Mostramos el mensaje de error
}
else
{
  while(!$recordSet->EOF) //Mientras no estemos al final de RecordSet
  {
    echo $recordSet->fields[0].' - '.$recordSet->fields[1].'<br>'; //Imprimimos los datos
    $recordSet->MoveNext(); //Nos movemos al siguiente registro
  }
  $recordSet->Close(); //Cerramos el RecordSet, esto es opcional
}

$conexion->Close(); //Cerramos la conexión. Opcional.
?>

Como podemos ver lo primero que hacemos es crear una conexión. Para eso llamamos a la función ADONewConnection indicándole el driver de base de datos que queremos usar. Esta función nos devuelve un objeto ADOConnection, mediante el cual realizaremos las consultas y otras operaciones a la base de datos. Aquí podemos ver el listado de bases de datos soportadas por ADOdb.

Una vez que hemos creado nuestra conexión lo siguiente es realizar la conexión en si. El método que hemos usado es el Connect. En este caso le pasamos el host de la base de datos, el usuario, el password y el nombre de la base de datos. Además de este método de conexión hay otros dos:

  • PConnect: Crea una conexión persistente.
  • NConnect: Fuerza a realizar una nueva conexión.

Una vez que nos hemos conectado ejecutamos una consulta con el método Execute, que nos devuelve un objeto ADORecordSet, y mostramos los datos devueltos.

Con esto queda concluida esta primera parte del tutorial. En las siguientes partes hablaremos más detenidamente de la clase RecordSet y de como realizar distintas consultas a la base de datos.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , , ,

noviembre 11, 2009 0

Consultas parametrizadas en PHP. Parte III.

By in PHP

En el anterior artículo vimos como parametrizar una consulta SQL usando el cierre de interrogante. En este vamos a usar el símbolo de dos puntos (:) seguido del nombre del parámetro para indicar estos. Al igual que en la entrada anterior vamos a ver primero 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())
{
  // Recorremos los parametros
  foreach($parametros as $nombre => $parametro)
  {
    // Juntamos cada parte con el parametro correspondiente preparado.
    $consulta = str_replace(":".$nombre, prepararParametro($parametro), $consulta);
  }

  // Devolvemos la consulta preparada
  return $consulta;
}
?>

Volvemos a tener las funciones escapar y prepararParametro, que funcionan exactamente igual que en la versión del interrogante (?). La novedad viene ahora en la función prepararConsulta, que se ha simplificado bastante. Ahora lo que hacemos es recorrer el array de parámetros con un bucle foreach, almacenando en la variable $nombre el nombre del párametro y en la variable $parametro el valor de este. Luego con la función str_replace reemplazamos las apariciones de :nombre por el parámetro preparado. Bastante sencillo.

Ahora, cuando llamemos a la función prepararConsulta, tendremos que pasarle un array con los valores indexados mediante un literal. Por ejemplo:

$parametros = array('user_id' => 'manuel', 'user_password => 'password');
$consultaPreparada = prepararConsulta($consulta, $parametros);

De nuevo, como en el artículo anterior, la función es mejorable pero es una buena aproximación al problema de las consultas parametrizadas.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,

septiembre 23, 2009 1

Consultas parametrizadas en PHP. Parte II.

By in PHP

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.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,