Contexto


Anteriormente se habló de las bases de datos y cómo acceder a ellas con PHP, sin embargo no fueron definidas propiamente. Una base de datos es una colección estructurada de registros almacenados digitalmente y organizados de tal manera que pueden recuperarse y ser accedidos de manera rápida. Una base de datos MySQL contiene una o más tablas, cada una de ellas contiene registros o filas. Dentro de estas filas existen diversas columnas o campos que contienen la información.

El lenguaje SQL con el cual se realizan las consultas a las bases de datos está basado en el idioma inglés y también se utiliza en otras bases de datos como Oracle y Microsoft SQL Server.

Está diseñado para permitir solicitudes simples de una base de datos a través de comandos tales como:

SELECT nombre FROM db_peliculas WHERE id = '2';

¿Qué es lo que ocurre en este comando? En este ejemplo se solicita a la base de datos el nombre de la película que tiene el id=2 de la tabla db_peliculas.

En este tema utilizaremos los términos en inglés para que en tus investigaciones futuras no tengas problemas relacionando los nombres. Recuerda que el uso de PHP y bases de datos MySQL sólo funciona cuando el servidor local y sus componentes están en ejecución, y que solamente estamos aplicando técnicas en computadoras PC-Windows.

Explicación


7.1 Uso de PHP con comandos MySQL

Antes de iniciar con el tema, es importante que conozcas los comandos básicos SQL, estos pueden ser ejecutados a través de la interfaz de phpMyAdmin o desde la consola de Windows. Para consultar una lista de los comandos más usados, haz clic aquí.








    Ahora bien para aprender cómo acceder a través de línea de comando desde Windows, por favor observa el siguiente video.



Haz clic en el botón para acceder a la práctica.


Ahora que tienes conocimiento básico de comandos SQL probemos su aplicación con PHP. Para ello utilizarás el pequeño catálogo de películas que creaste previamente, ¿lo recuerdas? Si no lo recuerdas, se muestra de nuevo enseguida:

<html>
     <head><title>Catalogo de Peliculas </title> </head>    
  <body>
	 <?php
  	      require_once 'login.php'; //ya sabemos que es esto :)
		$conn = new mysqli($hn, $un, $pw, $db);
     if ($conn->connect_error){//revisamos errores
  		 die($conn->connect_error);
	     }
	     $_query = "SELECT * FROM db_peliculas";//query de SQL
	     $result = $conn->query($_query); //objeto nuevo
           if (!$result){ //revisamos errores
  	        die($conn->error);
           }	
           $rows = $result->num_rows; //checamos los rows de informacion
           for ($j = 0 ; $j < $rows ; ++$j) { //un loop, lo recuerdas?
  	        $result->data_seek($j);//buscamos la informacion del renglon seleccionando
  	        $row = $result->fetch_array(MYSQLI_ASSOC);//regresa la información foramateada   	
		 //codigo que repetimos
  	        echo 'Folio: ' . $row['id'] . ' <br>';
             echo 'Nombre pelicula: ' . $row['nombre'] . ' <br>';
  	        echo 'Tipo de pelicula: ' . $row['tipo_pelicula'] . ' <br>';
  	        echo 'Clasificacion: ' . $row['clasificacion'] . ' <br>';
  	        echo "_____________________ <br> <br>";
          }
         $result->close();
         $conn->close();
	?>
	 </body>
 </html>

Dicho ejemplo funciona a la perfección, ¿pero que tal si queremos capturar un nuevo título? Esto se logra añadiendo este código heredoc debajo de <body>:

<body> 
  <h1>INSERTA NUEVAS PELICULAS </h1>
   <?php
echo <<<_END
   <form method='post' action='add_record.php'>
     Captura todos los campos:<br>
     <input type='text' name='movie_name' size='30'>
     <input type='text' name='movie_type' size='30'>
     <input type='text' name='movie_rate' size='1'>
     <input type='submit' value='Grabar'>
   </form>
   <hr>
_END;
... el demas código …

Luego de esta anexión, debes obtener esta pantalla:

Una vez que la forma está lista para recibir archivos, es necesario crear el archivo que procesa la inserción de los datos que el usuario quiere grabar. Escribe el siguiente código en un nuevo archivo que se llamará add_record.php.

<html>
     <head><title>Catalogo de Peliculas </title> </head>    
  <body>
	 <?php
  	    require_once 'login.php';
  		 $con = new mysqli($hn, $un, $pw, $db);   		 
  		 if ($con->connect_error){ //revisamos errores
			die($con->connect_error);
  		 }   		 
  		 $_query = "INSERT INTO db_peliculas (id,nombre,tipo_pelicula,clasificacion) VALUES ('','$_POST[movie_name]','$_POST[movie_type]','$_POST[movie_rate]')";//query de SQL
  		 $result = $con->query($_query); //objeto nuevo   		 
  		 if (!$result){ //revisamos errores
  			 die($con->error);
  		 }
  	   // Si todo sale bien, hay que avisarle al usuario  		 
  		 echo "1 record has sido grabado.";
  		 echo "<br>En 3 segundos volverás a la página anterior.";
		mysqli_close($con);	 
  		 header( "refresh:3;url=peliculas.php" );
		//refresca la página en 3 segundos y redirige a la URL indicada
	?>
	 </body>
 </html>

Recuerda que todos estos archivos deben de estar juntos. Si quieres guardar copias de seguridad, puedes copiar el folder y cambiar su nombre.

En este momento ya debes comprender la mayor parte del código, así que pon atención al proceso que sucede y a lo nuevo que aparece.

$_query = "INSERT INTO db_peliculas (id,nombre,tipo_pelicula,clasificacion) VALUES ('','$_POST[movie_name]','$_POST[movie_type]','$_POST[movie_rate]')";

Al crear la consulta SQL le pedimos a la base de datos que use la tabla db_peliculas para insertar la información y le pasamos los campos y sus respectivos valores. Nota que el valor de id es un campo vacío, pues este tiene la propiedad de AUTO-INCREMENT activa.

'$_POST[movie_name]'...

En la parte que pasa los parámetros observa que está esperando los datos que se le envían vía $_POST. En este caso es la información del nombre del campo que se envía.

header( "refresh:3;url=peliculas.php" );

Esta función interna le pide al navegador que refresque la página en tres segundos y luego vaya hacia la URL que se le indica.

¡Listo! Ahora ya tienes una forma de capturar tus películas favoritas. Pero, ¿y si quieres cambiar algo?

7.2 Modificando campos

Continuemos creando la función de actualización de campos. A tu archivo peliculas.php le añadirás un enlace para editar el récord. Entonces, ¿qué te parece si lo colocamos en el heredoc que construye la forma?

echo <<<_END
   <form method='post' action='add_record.php'>
     Captura todos los campos:<br>
     <input type='text' name='movie_name' size='30'>
     <input type='text' name='movie_type' size='30'>
     <input type='text' name='movie_rate' size='1'>
     <input type='submit' value='Grabar'>
     echo "<br>";
	echo '<p><a href="edit_record.php?id=' . $row['id'] . '">Editar este record</a></p>';
    	echo "_____________________<br>";
_END;
... el demas código ...

Bastante simple hasta el momento, ¿no lo crees?

Desde el enlace <a href="edit_record.php?id=' . $row['id'] . '"> estamos enviando en el URL el valor de id hacia el archivo edit_record.php el cual tomará esa información para llenar los campos que se requieran. Ahora prepara un nuevo documento y nómbralo edit_record.php, este archivo es el que se encarga de hacer las modificaciones en el récord seleccionado.

Escribe lo siguiente:

<?php //edit_record.php   
 // primero creamos la forma mediante una función renderForm() para que sea altamente reusable, observa que envolvemos el HTML desde este punto

  function renderForm($id, $movie_name, $movie_type, $movie_rate, $error) {
?>
<html>
   <head> <title>Editar Record</title> </head>
<body>
   <h4>Quieres editar este record?</h4>
<?php
    // si existe algún error lo desplegamos con estilo 
    if ($error != '') {
  	  echo '<div style="padding:4px; border:3px solid red; color:red;">'.$error.'</div>';
    }
    ?> 
   <form action="" method="post"> //la forma empieza
	// escondemos este valor por estética
  	 <input type="hidden" name="id" value="<?php echo $id; ?>"/>
	// el siguiente es un div al cual podemos darle estilo con CSS
  	 <div>
	// cada input tiene el valor original
        <p><strong>ID:</strong> <?php echo $id; ?></p>
	  <strong>Nombre de la película: *</strong> <input type="text" name="movie_name" value="<?php echo $movie_name; ?>"/><br>
	  <strong>Tipo de película: *</strong> <input type="text" name="movie_type" value="<?php echo $movie_type; ?>"/><br>
	  <strong>Clasificación: *</strong> <input type="text" name="movie_rate" value="<?php echo $movie_rate; ?>"/><br/>
        <p>*Requerido</p>
  	 <input type="submit" name="submit" value="Submit">
  	 </div>
   </form>
</body>
</html>
<?php
}
   //la conexión
   require_once 'loginB.php';
  // modificamos este archivo para que sea más reusable, puedes ver el código más adelante. Se llama loginB.php

   // revisamos si la forma fue procesada. Si no ha sido procesada, entonces lo hacemos y guardamos los cambios en la base de datos
    if (isset($_POST['submit'])) {
    // confirmamos que 'id' es un número INT valido antes de tomar los datos de la forma
    if (is_numeric($_POST['id'])) {
  	  // tomamos la información de la forma, asegurándonos de que sea válida   	  $id = $_POST['id']; // asignamos el valor de la variable por el que enviamos por el URL
  	  $movie_name = mysql_real_escape_string(htmlspecialchars($_POST['movie_name']));   	  $movie_type = mysql_real_escape_string(htmlspecialchars($_POST['movie_type']));   	  $movie_rate = mysql_real_escape_string(htmlspecialchars($_POST['movie_rate']));    
    // revisamos que los campos de la forma tengan información, no pueden estar vacios!
    if ($movie_name == '' || $movie_type == '' || $movie_rate == '') {   	  // generamos un mensaje de error
  	  $error = 'ERROR: LLena todos los campos!';
    //desplegamos la forma invocando la función que creamos
  	 renderForm($id, $movie_name, $movie_type, $movie_rate, $error);
    } else {
  	  // grabamos los cambios en la base de datos
	  mysql_query("UPDATE db_peliculas SET nombre='$movie_name', tipo_pelicula='$movie_type', clasificacion='$movie_rate' WHERE id='$id'")
  	  or die(mysql_error());
  	 //ya que los grabamos, redireccionamos a la pantalla anterior
  header("Location:peliculas.php");
    }
    } else  {
    // si 'id' no es válida, desplegamos un error
       echo 'Error!';
      }
    }  else {
    // si la forma no ha sido enviada, desplegamos la información de la base de datos en los campos de la forma, para que el usuario pueda ver que cambiar 
   
   
    // tomamos el valor de 'id' del URL y nos aseguramos de que sea valido (revisamos que sea un valor numérico mayor a 0)
    if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0)     {     // consultamos la base de datos
    $id = $_GET['id'];
    $result = mysql_query("SELECT * FROM db_peliculas WHERE id=$id")
    or die(mysql_error());
    $row = mysql_fetch_array($result);
    // verifica que el'id' sea igual que en el renglón de la base de datos
    if($row) {    
    // obtén la información de la base de datos
    $movie_name = $row['nombre'];
    $movie_type = $row['tipo_pelicula'];
    $movie_rate = $row['clasificacion'];    
    // mostramos  la forma
    renderForm($id, $movie_name, $movie_type, $movie_rate, '');
    }   else /* no hay resultados? avisa al usuario! */ {
    echo "No hay resultados!";

    }
    }  else
// si el valor de 'id' en el URL no es válido o no hay un valor, desplegamos el error
    {     echo 'Error!';     }

    }
?>

Este fue un ejemplo bastante largo, pero es momento de explicar algunas de las nuevas funciones que viste en él.

En primera instancia observa la expresión if(isset($_POST['submit'])). En ella puedes ver que isset() es una función que determina si una variable existe y no tiene valor null. En este caso revisa si los datos enviados al presionar el botón de la forma están completos.

De igual manera en el código está la expresión if (is_numeric($_POST['id'])), aquí se encuentra la función is_numeric(). Ésta es otra función interna de PHP que verifica que el valor de la variable que estamos pasando para procesar sea realmente un número.

Luego $movie_name = mysql_real_escape_string(htmlspecialchars($_POST['movie_name'])); mysql_real_escape_string() Es una función que escapa los caracteres que estamos procesando para utilizarlos con SQL.

htmlspecialchars() Convierte los caracteres especiales que pueden estar en el campo a entidades HTML.


Ahora observa el código de loginB.php para que lo uses en este ejercicio:

<?php  //loginB.php  
$hn = 'localhost'; //o puede ser 127.0.0.1, da igual 
  $db = 'enguezco_test'; //aqui pon el nombre de tu base de datos
  $un = 'enguezco_f65'; //tu usuario en caso de que sea otro
  $pw = 'eUV65-f3'; //contraseña en caso de que la hayas configurado   
  // Connect to Database, aqui nos ahorramos algo de tecleo
    $conn = mysql_connect($hn, $un, $pw)
    or die ("Could not connect to server ... \n" . mysql_error ());
    mysql_select_db($db)
    or die ("Could not connect to database ... \n" . mysql_error ());
?>

Para borrar algún record sólo tenemos que agregar al heredoc de peliculas.php un enlace similar al que tenemos para editar. Manos a la obra.

echo <<<_END
   <form method='post' action='add_record.php'>
     Captura todos los campos:<br>
     <input type='text' name='movie_name' size='30'>
     <input type='text' name='movie_type' size='30'>
     <input type='text' name='movie_rate' size='1'>
     <input type='submit' value='Grabar'>
     echo "<br>";
	echo '<p><a href="edit_record.php?id=' . $row['id'] . '">Editar este record</a></p>';
	echo '<p><a href="delete_record.php?id=' . $row['id'] . '">Borrar este record</a></p>';
    	echo "_____________________<br>";
_END;
... el demas código ...

Ahora en un nuevo documento que llamaremos delete_record.php escribamos el código que borra la información que seleccionamos.

<?php  //DELETE.PHP  
  //connection
   require_once 'loginB.php';
   $conn = new mysqli($hn, $un, $pw, $db);
	if ($conn->connect_error){//revisamos errores
		die($conn->connect_error);
   	}    
    // verificamos que la variable 'id' exista en el URL y verificamos que sea valida
    if (isset($_GET['id']) && is_numeric($_GET['id']))     {
    // tomamos su valor
    $id = $_GET['id'];    
    // le pedimos a la base de datos que borre el registro
    $result = mysql_query("DELETE FROM db_peliculas WHERE id=$id")
    or die(mysql_error());    
    // redireccionamos de regreso a peliculas.php
    header("Location:peliculas.php");
    } else
    // si no era válido, vamos de regreso de todas maneras
    {
    header("Location:peliculas.php");
    } 
?>

El código es bastante explicativo, son expresiones y técnicas que ya hemos vistos antes. Lo único distinto es el SQL donde se pide a la base de datos que borre el registro que tiene el id indicado. Hemos visto las técnicas básicas más usadas para el manejo de información de una base datos. Con estas técnicas debes ser capaz de hacer relaciones de información y páginas que se comuniquen entre ellas.

Puedes descargar todos los códigos desarrollados en el tema, desde esta liga.

 

Recuerda crear una carpeta dentro del directorio C:\xampp\htdocs\ y ahí bajar cada uno de estos códigos para que puedas probar la aplicación. Para correr la aplicación es necesario que en la barra de navegación ingreses lo siguiente:
http://localhost:90/PeliculasCap7/Peliculas.php

Donde:

  • 90: Es el puerto que se usó para el servidor web apache, es necesario que lo sustituyas por el que hayas utilizado.
  • PeliculasCap7: Es la carpeta que creaste y donde copiaste los archivos de la aplicación.
  • Peliculas.php: Es el programa principal de la aplicación y es el que manda llamar a todos los demás programas.

Cierre


En el tema pudiste ver las partes básicas que conforman a una base de datos, así como la forma en que pueden ser gestionadas desde la consola de Windows. También aprendiste algunos de los comandos para consultar una base de datos MySQL. Por último se mostró cómo insertar, editar y eliminar registros en una tabla.

Hasta ahora ya has explorado cómo desplegar y ordenar la información y aunque esto es útil, no será atractivo para un usuario. Es por ello que el siguiente paso es mostrarla de manera que sea apetecible.

Checkpoint


Asegúrate de poder:

  • Distinguir los elementos básicos que conforman una base de datos.
  • Identificar los comandos básicos de SQL.
  • Insertar, editar y eliminar registros de una tabla.

Referencias


  • Boronczyk, T., Naramore, E., Gerner, J., Le Scouarnec, Y. y Stolz, J. (2009). Beginning PHP 6, Apache, MySQL 6 Web Development. EE. UU.: Wiley.
  • Nixon, R. (2014). Learning PHP, MySQL & JavaScript With jQuery, CSS & HTML5. EE. UU.: O’Reilly Media.