May 19, 2007

Reading data from a MySQL database with PHP

Notice: article only available in Spanish!

Ya he explicado en otro post cómo conectar a una base de datos mysql desde php. Ahora voy a explicar cómo trabajar con esta base de datos, en concreto mostrar los datos de una tabla.

Parto de la premisa de que se ha aprendido a utilizar el script anteriormente citado para la conexión y selección de base de datos, y que se ha configurado correctamente para acceder a una BD donde existe la tabla ‘superheroes’, con los campos ‘id’, ‘name’, ‘special_powers’.

Vamos allá : leemos los datos de la tabla. Para ello, usamos la función php mysql_query(); para ejecutar código sql en el servidor de bases de datos. Vamos a leer los campos importantes (en este caso, los tres) de la tabla superheroes.

$query = "SELECT id, name, special_powers FROM superheroes";
$resultset = @mysql_query($query,$identifier);
if (@mysql_num_rows($resultset) > 0)
{
  while ($result = mysql_fetch_array($resultset))
  {
    echo $result['id'] . ' | ' . $result['name'] . ' | ' . $result['special_powers'] . '
' ; } }

Una vez hemos leído los datos podemos inmediatamente mostrarlos por pantalla, o almacenarlos en una matriz asociativa para emplearlos más adelante. Por ejemplo, cambiando el código

 
while ($result = mysql_fetch_array($resultset))
{
  echo $result['id'] . ' | ' . $result['name'] . ' | ' . $result['special_powers'] . '
' ; }

por

$i = 0;
while ($result = mysql_fetch_array($resultset))
{
  $resultsArray[$i] = $result  ;
  $i++;
}

de modo que más adelante podremos mostrar estos datos como mejor nos convenga.

Hay que tener en cuenta que el script de conexión a base de datos que ya vimos, abre y cierra la conexión en un mismo paso. Por tanto, ahora tendremos que integrarlo con la parte de lectura de datos que acabamos de ver. El código resultante quedará así­:

/** 
 * script to connect to a database and read tables
 * @author Jorge Albaladejo Pomares [correo@jorgealbaladejo.com]
 * @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
 */

//variables
$host = "localhost";
$user = "john_smith";
$pass = "h01y_GRail";
$db   = "pastafarian_food";

//connection
$identifier = @mysql_connect ($host,$user,$pass);
if (!$identifier)
{
  die("Error connecting to database: ".mysql_error());
}

//selecting the database
$db_selected = mysql_select_db ( $db, $identifier );
if (!$db_selected)
{
  die ("Cannot select database: " . mysql_error());
}

$query     = "SELECT id, name, special_powers FROM superheroes";
$resultset = @mysql_query($query,$identifier);

if (@mysql_num_rows($resultset) > 0)
{
  while ($result = mysql_fetch_array($resultset))
  {
    echo $result['id'] . ' | ' . $result['name'] . ' | ' . $result['special_powers'] . '
' ; } } //close connection mysql_close($identifier);

Como vemos, el código queda un poco sucio, así que lo vamos a organizar un poquito creando tres funciones: la primera, conectará con la base de datos, la segunda, leerá la tabla, y la tercera realizará la conexión. Vamos allá.

/** 
 * script to connect to a database and read from tables, organized with functions
 * @author Jorge Albaladejo Pomares [correo@jorgealbaladejo.com]
 * @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
 */

/**
 * Connect to a database with default parameters
 * @return the connection identifier
 */
function connect()
{
  //variables
  $host = "localhost";
  $user = "john_smith";
  $pass = "h01y_GRail";
  $db   = "pastafarian_food";
  //

  //connection
  $identifier = @mysql_connect ($host,$user,$pass);
  if (!$identifier)
  {
    die("Error connecting to database: ".mysql_error());
  }

  //selecting database
  $db_selected = mysql_select_db ( $db, $identifier );
  if (!$db_selected)
  {
    die ("Cannot select database: " . mysql_error());
  }
  
  return($identifier);
}

/** 
 * retrieves the selected fields from a certain table in a database
 * @param table to retrieve from
 * @param fields to retrieve
 */
function readTable($table,$fields,$identifier)
{
  //variables
  $resultsArray = array();
  
  //fields
  $fieldsList = "";
  foreach($fields as $key=>$value)
  {
    $fieldsList .= $value . ",";
  }
  
  //remove last comma
  $fieldsList = substr($fieldsList,0,strlen($fieldsList)-1);

  //query
  $query = "SELECT " . $fieldsList . " FROM " . $table;
  $resultset = @mysql_query($query,$identifier);
  if (@mysql_num_rows($resultset) > 0)
  {
    $i = 0;
    while ($result = mysql_fetch_array($resultset))
    {
      $resultsArray[$i] = $result  ;
      $i++;
    }
  }

  return($resultsArray);
}

/** 
 * closes connection and frees resources
 * @param identifier of the connection to close
 */
function disconnect($identifier)
{
  //TODO: some routines to clean resources, data, variables, etc.
  mysql_close($identifier);
}

/**
 * main script 
 */
$token   = connect();
$fields  = array('id', 'name', 'special_powers');
$results = readTable('superheroes',$fields,$token);

foreach($results as $result)
{
  foreach($fields as $key)
  {
    echo $key . " => " . $result[$key] . "
"; } echo "
"; } disconnect($token);

Hecho esto, lo más práctico es almacenar las funciones que acabamos de crear en un archivo externo de librerías y funciones útiles, y así reducir al mínimo el tamaño de nuestro script. En este ejemplo, las funciones connect(), readTable() y disconnect() han sido movidas a un archivo llamado functions.php en el mismo directorio que el script principal. El código finalmente queda como sigue­:

/** 
 * script to connect to a database and read from tables, organized with functions
 * @author Jorge Albaladejo Pomares [correo@jorgealbaladejo.com]
 * @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
 */

//main functions
include('functions.php');

// main script
$token   = connect();
$fields  = array('id', 'name', 'special_powers');
$results = readTable('superheroes',$fields,$token);

foreach($results as $result)
{
  foreach($fields as $key)
  {
    echo $key . " => " . $result[$key] . "
"; } echo "
"; } disconnect($token);

Hay que tener en cuenta que este script puede ser inseguro si se le ataca con sql injection, de esto hablaré más adelante en otras publicaciones.