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.

1
2
3
4
5
6
7
8
9
$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'] . '<br />'  ;
  }
}

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

1
2
3
4
while ($result = mysql_fetch_array($resultset))
{
  echo $result['id'] . ' | ' . $result['name'] . ' | ' . $result['special_powers'] . '<br />'  ;
}

por

1
2
3
4
5
6
$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í­:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/** 
 * 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'] . '<br />' ;
  }
}
 
//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á.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/** 
 * 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] . "<br />";
  }
  echo "<br />";
}
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­:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** 
 * 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] . "<br />";
  }
  echo "<br />";
}
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.

Leave a Reply

Your email address will not be published. Required fields are marked *