5.1. Conectividad con bases de datos procedimental

PHP puede conectarse con bases de datos de dos formas: mediante el uso directo de funciones propias del intérprete que dependen del gestor de base de datos usadas o a tráves del estándar ODBC (Open Data Base Connectivity).

En PHP el trabajo con la base de datos se basa en tres etapas fundamentales:

  1. Establecer contacto con la base de datos
  2. Realizar las operaciones necesarias
  3. Cerrar los recursos empleados

Conectar con una base de datos MySQL - PHP

Para conectarse con una base de datos es necesario crear una conexión con el servidor. Esto se logra en PHP mediante el uso de la función mysql_connect() . Sintaxis

mysql_connect($ruta, $usuario, $password);

Parámetro Descripción
$ruta Opcional. Específica el servidor al cual se conecta. El valor por defecto es "localhost:3306".
$usuario Opcional. Identifica el usuario. El valor por defecto es el nombre de usuario propietario del proceso.
$password Opcional. El valor por defecto es "". No recomendado

$ruta: invariablemente en un servidor de paga o remoto sera LOCALHOST

Ejemplo de conexión de una base de datos MySQL desde PHP


<?php
  $ruta      = "localhost";
  $login     = "mi_login";
  $password  = "mi_password";
  $db        = "miBaseDatos";
  $conexion  = mysql_connect( $ruta, $login, $password)
               or die(mysql_error());
  mysql_select_db( $db, $conexion ) or die(mysql_error());
  echo "conectado bravo!!!!!!";
  mysql_close($conexion);
  ?>

Crear una base de datos en MySQL - PHP

La sentencia CREATE DATABASE es usada para crear una base de datos en MySQL. Su sintaxis es la siguiente:

CREATE DATABASE nombre

Para generar esta sentencia desde PHP usaremos las siguiente funciones:

Ejemplo de creación de una base de datos MySQL desde PHP

<?php
   include('db.php');
   $conexion = mysql_connect($ruta,$usuario, $password);
   if(!$conexion) {
      die('Imposible conexión al servidor: '. mysql_error());
   }
   $sentencia = 'CREATE DATABASE IF NOT EXISTS prograwe_miBD';
   if (mysql_query($sentencia, $conexion)) {
       echo 'Base de datos creada';
   } else {
       echo 'Error al crear la base de datos: '.mysql_error();
  }
  mysql_close($conexion); 
?>

Crear una tabla en MySQL - PHP

El componente principal de una base de datos son las tablas, MySQL tiene varios tipos de tablas, nosotros usaremos en este sitio las InnoDB, por razones de integridad referencial y concurrencia.

Ejemplo: El Campeonato Mundial de Pilotos es otorgado por la Federación Internacional de Automovilismo al piloto de Fórmula 1 más exitoso de la temporada, determinado por el sistema de puntuación en relación con los resultados de los Grandes Premios. El primer Campeonato Mundial de Pilotos fue otorgado en la temporada 1950 a Giuseppe Farina. Considere la siguiente tabla de datos correspondientes a los campeones de Formula 1 (2000 - 2015) y sus escuderias.


Año Campeón Escudería
2015 Lewis Hamilton Mercedes AMG F1 Team
2014 Lewis Hamilton Mercedes AMG F1 Team
2013 Sebastian Vettel Red Bull Racing
2012 Sebastian Vettel Red Bull Racing
2010 Sebastian Vettel Red Bull Racing
2009 Jenson Button Brawn GP
2008 Lewis Hamilton McLaren
2007 Kimi Raikkonen Ferrari
2006 Fernando Alonso Renault
2005 Fernando Alonso Renault
2004 Michael Schumacher Ferrari
2003 Michael Schumacher Ferrari
2002 Michael Schumacher Ferrari
2001 Michael Schumacher Ferrari
2000 Michael Schumacher Ferrari

A continuación se presenta el código MySQL necesario para crear una tabla con dicha estructura

CREATE TABLE f1 (
  year      INT,
  campeon   CHAR( 35 ) NOT NULL,
  escuderia CHAR( 35 ) NOT NULL,
  PRIMARY   KEY ( year )
) ENGINE = InnoDB;

A continuación se presenta el correspondiente código PHP


<?php
   $query = "CREATE TABLE IF NOT EXISTS f1 (";
   $query .= "year INT NOT NULL , ";
   $query .= "campeon CHAR( 35 ) NOT NULL,";
   $query .= " escuderia CHAR( 35 ) NOT NULL , ";
   $query .= "PRIMARY KEY ( year ) ) ";
   $query .= "ENGINE = InnoDB;";
   include('db.php');
   $conexion = mysql_connect($ruta,$login,$password) or die(mysql_error());
   mysql_select_db( $db, $conexion ) or die(mysql_error());
  
   if (mysql_query($query, $conexion)){
      echo "Tabla creada con éxito <br>";
   } else die(mysql_error());
   mysql_close($conexion);
?>

Insertar registros en una tabla.

La sentencia INSERT INTO es usada para agregar registros en una tabla de base de datos.

La sentencia tiene dos sintaxis genericas validas


INSERT INTO nombre_tabla
      VALUES (valor1, valor2, valor3,...)
INSERT INTO nombre_tabla (columna1, columna2, columna3,...)
      VALUES (valor1, valor2, valor3,...)

Ejemplo: Inserción de registros en MySQL con PHP usaremos el caso de Formula 1

<?php
   include("db.php");
   $conexion = mysql_connect( $ruta, $login, $password)
                or die(mysql_error());
   mysql_select_db( $db, $conexion ) or die(mysql_error());
   mysql_query("INSERT INTO f1 VALUES (2011,'Sebastian Vettel',
               'Red Bull Racing')",$conexion) or die(mysql_error());
   mysql_query("INSERT INTO f1 VALUES (2010,'Sebastian Vettel',
               'Red Bull Racing')",$conexion) or die(mysql_error());
   mysql_query("INSERT INTO f1 VALUES (2009,'Jenson Button Brawn','GP')",
                 $conexion) or die(mysql_error());
   mysql_query("INSERT INTO f1 VALUES (2008,'Lewis Hamilton','McLaren')",
                $conexion) or die(mysql_error());
   echo "Operación exitosa"; 
   mysql_close($conexion);
?>

Insertar registros en una tabla desde un formulario

Observe que el código hace validaciones del lado del cliente y del lado del servidor


<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>BD</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <link href='../formValidation/css/formValidation.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form class='form-horizontal' id='pacheco' method='post' name='pacheco' >
  <fieldset>
    <legend class='text-center'>Campeones Formula 1</legend>
    
    <div class='form-group'>
      <label class='control-label col-sm-2' for='year'>Año</label>
      <div class='col-sm-2'>
          <input id='year' class='form-control' name='year'>
      </div>
    </div>
      
    <div class='form-group'>
      <label class='control-label col-sm-2' for='campeon'>Campeón</label>
      <div class='col-sm-5'>
          <input id='campeon' class='form-control' name='campeon' placeholder="Nombre del Piloto">
      </div>
    </div>

    <div class='form-group'>
      <label class='control-label col-sm-2' for='escuderia'>Escuderia</label>
      <div class='col-sm-5'>
          <input id='escuderia' class='form-control' name='escuderia' placeholder='Nombre'>
      </div>
    </div>


    <div class='form-group'> 
      <div class='col-xs-9 col-xs-offset-3'>
        <button type='submit' class='btn btn-primary'>Validar</button>
      </div>  
    </div>
  </fieldset>
  </form>
  <div class='row'>     
     <div class='col-sm-offset-2 col-sm-6' id='message'></div>
  </div>
</div>
<-- Script jQuery -->

</body>
</html>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
<script src='../formValidation/js/formValidation.js'></script>
<script src='../formValidation/js/framework/bootstrap.min.js'></script>
<script>
$(document).ready(function() {
  $('#pacheco') .formValidation({
    err: {
      container: 'tooltip'
    },
	icon: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    fields: {
      yer: {
        validators: {
          between: {
            min: 1950, max: 2050,
            message: 'Periodo de 1950 a 2050'
          }
        }
      },
      campeom: {
        validators: {
		  notEmpty: { message: 'El nombre del piloto no puede ser nulo'},
        }
      },
      escuderia: {
        validators: {
		  notEmpty: { message: 'El nombre de la escuderia no puede ser nulo'},
        }
      }	  
    }
  })
  .on('err.field.fv', function(e, data) {
    // Get the tooltip
    var $icon = data.element.data('fv.icon'), title = $icon.data('bs.tooltip').getTitle();
   
    // Destroy the old tooltip and crete a new one positioned to the right
    $icon.tooltip('destroy').tooltip({
      html: true,
      placement: 'right',
      title: title,
      container: 'body'
    });
  })
  
  .on('success.form.fv', function(e) {
      // Prevent form submission
      e.preventDefault();

      // Get the form instance
      var $form = $(e.target);
        
      $.post('index.php', $("#pacheco").serializeArray(),
	          function(data) { $('#message').html(data); }
      );
    });
  });
  </script>
<?php
  if( $_SERVER["REQUEST_METHOD"] == "POST") {
	$year      = $_POST['year'];
    $campeon   = $_POST['campeon'];
    $escuderia = $_POST['escuderia'];
    if(!(isset($year) && !empty($year) && isset($campeon) && !empty($campeon)
		 && isset($escuderia) && !empty($escuderia))) {
       echo "<p align='center'>Todos los campos son necesarios</p><br />";
    } else {
      $n = date("Y");
	  if ($year >= 1950 and $year <= $n) {
         include("db.php");        
         $conexion  = mysql_connect( $ruta, $login, $password)
                      or die(mysql_error());
         mysql_select_db( $db, $conexion ) or die(mysql_error());
		 $query = "SELECT * FROM f1 WHERE year = $year";
         $registros = mysql_query($query, $conexion)
                      or die(mysql_error());
         $n         = mysql_num_rows($registros);
		 if($n == 0) {
            $resultado = mysql_query("INSERT INTO f1 VALUES ($year,'$campeon','$escuderia')", $conexion);
            if(!$resultado) {
               echo "<p align='text-center'>Ocurrio un error al insertar</p> <br>". mysql_error();
            } else echo '<p align="text-center">Operación realizada con éxito</p><br>';
		 } else echo '<p align="text-center">Ya existe información para ese año</p><br>';
         mysql_close($conexion);
	  } else echo "<p align='text-center'>Año fuera de rango";
    }
  }
?>

Mostrar el contenido de una tabla

La sentencia SELECT nos permite recuperar los registros de una tabla. La sintaxis básica es:

SELECT * FROM nombre_tabla WHERE condición

Si requiere conocer más sobre esta sentencia visite nuestro sitio

En caso de una consulta usaremos básicamente las siguientes funciones

Ejemplo: Muestra los campeones de Formula 1 desde 1950 hasta la fecha.


<?php
  $ruta      = 'localhost';
  $login     = 'usuario';
  $key       = 'clave';
  $db        = 'base_datos';
  $conexion  = mysql_connect( $ruta, $login, $key) or die(mysql_error());
  mysql_select_db( $db, $conexion ) or die(mysql_error());   
  mysql_query("SET NAMES 'utf8'");
?>
<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Base datos en PHP</title>
  <meta name='Author' content='M.C. Jose Evaristo Pacheco Velasco' /> 
  <meta name='date' content='Marzo 28, 2016' />
  <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>   
</head>
<body>
<?php
  include('db.php'); 
  $query     = 'SELECT * FROM f1 ORDER BY year DESC';
  $registros = mysql_query($query, $conexion) or die(mysql_error());
  $n         = mysql_num_rows($registros);
  mysql_close($conexion);
  if ($n > 0) { // si hay registros
     $html  = '<div class="container">';
     $html .= '<h3 class="text-center">Campeones de Formula 1</h3>';
     $html .= '<table class="table table-bordered table-condensed table-condensed">';
	 $html .= '<thead><tr><th>Año</th>';
	 $html .= '<th class="text-center">Campeón</th>';
	 $html .= '<th class="text-center">Escudería</th>';
	 $html .= '</tr></thead>';
	 $html.= '<tbody>';
     while ($registro = mysql_fetch_assoc($registros)) {
 	    $html .= '<tr>';
        $html .= '<td>'. $registro['year'].'</td>';
        $html .= '<td>'. $registro['campeon'].'</td>';
        $html .= '<td>'. $registro['escuderia'].'</td></tr>';
     }
	 $html.= '</tbody>';
	 $html .= '</table>';
	 echo $html;
  }
?>
</body>
</html>

Ejemplo: Muestra los paises por continente con su capital, superficie, población, densidad (población/superficie) y su bandera. Así mismo presenta la suma de superficie, población y densidad promedio. El programa genera una página html como resultado.

<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Paises por continente</title>
  <meta name='Author' content='M.C. Jose Evaristo Pacheco Velasco' /> 
  <meta name='date' content='Marzo 29, 2016'/>
  <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <style>
    .banderas {
		border: 0;
		width: 70px;
	}
  </style>
</head>
<body>
  <div class='container'>  
    <form class='form-horizontal' id='forma' name='forma' method='post'>
    <fieldset>
      <legend>Selecciona el continente</legend>
      
      <div class='form-group'>
        <label class='control-label col-sm-2' for='year'>Año</label>
        <div class='col-sm-2'>
          <select name='continente' id='continente'>
            <option value='1'  selected>África</option>
            <option value='2'>América</option>
            <option value='3'>Asia</option>
	        <option value='4'>Europa</option>
	        <option value='5'>Oceanía</option>
	        <option value='6'>Todos los países</option>
          </select>
        </div>
      </div>

    </fieldset>
    </form>
    <div class='row'>     
      <div class='col-sm-offset-2 col-sm-8' id='message'></div>
    </div>    
  </div>
<!-- Script jQuery -->
</body>
</html>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script>
$(document).ready(function() { 
  var  idContinente = $('#continente').val();  
  var url  = '0510paises.php?continente='+idContinente;
  $('#message').load( url );
  $('#continente').change(function(event){
	var idContinente = $('#continente').val();
    var url  = '0510paises.php?continente='+idContinente;
    $('#message').load( url );
  });
});
</script>
<?php
  include('db.php');
  function consultas( $continente ) {
    switch ($continente) {
	  case 1: $continent = "África"; break;
	  case 2: $continent = "América";  break;
	  case 3: $continent = "Asia";  break;
	  case 4: $continent = "Europa";  break;
	  case 5: $continent = "Oceanía";  break;
	  case 6: $continent = "Los países del Mundo";  break;
	}
    $queryT = 'SELECT COUNT(*) paises, SUM(superficie) superficie,';
	$queryT.= 'SUM(poblacion) poblacion, poblacion/superficie densidad FROM pais';
	if($continente == 6) {
	    $query = 'SELECT * FROM pais ORDER BY densidad DESC, nombre';
	} else {
	    $query = "SELECT * FROM pais WHERE idContinente = $continente ORDER BY densidad DESC, nombre";
		$queryT .= " WHERE idContinente = $continente";
	}
	return array($query, $queryT, $continent);	  
  }// Consultas	 

  if( $_SERVER['REQUEST_METHOD'] == 'GET') {  
	 $continente = $_REQUEST['continente'];
	 list($query, $queryT, $continent) = consultas( $continente ); 
     $registros  = mysql_query($query, $conexion) or die(mysql_error());
     $registrosT = mysql_query($queryT, $conexion) or die(mysql_error());
     $n          = mysql_num_rows($registros);
     mysql_close($conexion);
     if ($n > 0) { // si hay registros
	   $html = '<h3 class="text-center">'.$continent.'</h3>';
       $html.= '<table class="table table-bordered table-condensed table-hover">';
       $html.= '<thead><tr>';
	   $html.= '<th>Nombre</th>';
	   $html.= '<th>Capital</th>';
	   $html.= '<th>Superficie<br>Km<sup>2</sup></th>';
	   $html.= '<th>Población</th>';
	   $html.= '<th>Densidad<br>Hab/Km<sup>2</sup></th>';
	   $html.= '<th>Bandera</th>';
	   $html.= '</tr></thead>';
	   $html.= '<tbody>';
       while ($registro = mysql_fetch_assoc($registros)) {
         $html .=  '<tr>';
         $html .= '<td><b>'. $registro['nombre'].'</b></td>';
         $html .= '<td>'. $registro['capital'].'</td>';
         $html .= '<td class="text-right">'. number_format($registro['superficie']).'</td>';
         $html .= '<td class="text-right">'. number_format($registro['poblacion']).'</td>';
         $html .= '<td class="text-right">'. number_format($registro['densidad'],2,'.',',').'</td>';
         $html.= '<td class="text-center">';
		 $html.= '<img alt="" class="banderas center-block" src="banderas/';
         $html.= $registro['nombre'].'.jpg" ></td></tr>';
       }
	   $html.= '</tbody>';
       $html.= '</table><br>';
	   $html.= '<table class="table table-bordered table-condensed table-hover">';
	   $html.= '<thead><tr>';
	   $html.= '<th>Continente</th>';
	   $html.= '<th>Países</th>';
	   $html.= '<th>Superficie<br>Km<sup>2</sup></th>';
	   $html.= '<th>Población<br>Habitantes</th>';
	   $html.= '<th>Densidad<br>Hab/Km<sup>2</sup></th>';
	   $html.= '</tr></thead>';
	   $html .= '<tbody>';
       while ( $registro = mysql_fetch_assoc($registrosT) ) {
         $html .= '<tr><td>'. $continent.'</td>';
         $html .= '<td class="text-right">'. $registro['paises'].'</td>';
         $html .= '<td class="text-right">'. number_format($registro['superficie']).' </td>';
         $html .= '<td class="text-right">'. number_format($registro['poblacion']).'</td>';
         $html .= '<td class="text-right">'. number_format($registro['densidad'],2,'.',',').'</td></tr>';
       }
       $html .= '</tbody></table><br>';
       echo $html;
     }
  }
?>