PHP: ejemplo de lectura desde fichero de texto e inserción en base de datos

En este ejemplo vamos a mostrar una manera simple de leer datos desde un fichero de texto e insertarlos en una base de datos mediante PHP.

PHP: ejemplo de lectura desde fichero de texto e inserción en base de datos

Letrero mostrando mensaje de error.
Letrero mostrando mensaje de error.

Aquí tenéis los ficheros necesarios.

01_Ejercicio_Ficheros.zip

Script de la base de datos

Incluye el script para crear la base de datos. Es muy sencilla, ya que tiene sólo tres campos y no he incluido clave primaria para que podáis probar a insertar los datos más de una vez sin que dé error.

Fichero de texto con los datos a insertar

También incluye el fichero de texto donde están los datos a leer. Como podéis ver, los conjuntos de datos están separados por líneas. Dentro de cada línea, los datos están separados por punto y coma.

El código en sí consta de dos ficheros, por simplificar. Se podría hacer en uno solo si el formulario hace un autoenvío a sí mismo, pero el código resultante es algo más complejo.

 

Formulario de subida de fichero

En el primer fichero tenemos un formulario desde el que subimos el fichero de texto y lo enviamos al fichero tramitar_acta.php mediante POST. Los ficheros se deben enviar mediante este método, entre otras cosas, por razones de tamaño.

La única particularidad de este formulario está en que debemos especificar mediante el atributo enctype que vamos a subir un fichero, dando el valor “multipart/form-data”.

En el fichero restante, tramitar_acta.php, es donde está la lógica de programación.

 

Lógica del programa

Vamos a ver el fichero al completo.

Primero nos encontramos un if que comprueba en la línea 2 si se ha producido un error al subir el fichero. Para ello hace uso del array asociativo bidimensional que se crea al subir el fichero. Más adelante utilizamos dicho array para acceder a otros datos del fichero.

 

Información sobre el fichero subido

En caso de que la subida haya sido correcta, informamos mediante dos mensajes. He dejado comentados otros datos que pueden ser interesantes.

Como se puede ver, mediante el acceso a las posiciones del array asociativo bidimensional creado por PHP ($_FILES), se puede acceder a:

  • [“name”] -> El nombre del fichero que hemos subido.
  • [“size”] -> El tamaño en bytes. Como véis habría que dividir entre 1024 para calcular los kilobytes.
  • [“tmp_name”] -> El nombre del fichero en el servidor, es decir, el nombre temporal del mismo, que no coincide con el nombre del fichero original.
  • [“type”] -> El tipo de fichero que hemos subido.
  • [“error”] -> El código de error que se haya producido durante la subida del mismo (si procede).

 

Apertura del fichero

Abrimos el fichero mediante el uso de la función fopen(), usando su nombre temporal y pasando el parámetro “r”, ya que en este caso sólo vamos a hacer una lectura del mismo.

Creación de la conexión a la base de datos

Creamos la conexión a la base de datos. Vamos a utilizar la nomenclatura relativa a objetos.

 

Inicio de la transacción

En este caso vamos a utilizar una transacción. Es decir, o se insertan todos los registros que se han leído, o no se inserta ninguno en caso de que haya un solo error en alguna de las operaciones con cada registro. Esta característica de las transacciones se llama atomicidad.

El ejemplo más claro de esta característica de un sistema de gestión de bases de datos lo tenemos en los cajeros automáticos cuando sacamos dinero. La transacción completa contemplaría al menos los siguientes pasos:

  1. Se identifica la cuenta desde la que se saca dinero
  2. Se marca una cantidad a sacar
  3. Se resta la cantidad de la cuenta
  4. Se entrega el dinero al usuario

En caso de que alguno de ellos falle, como que no se pueda restar la cantidad de la cuenta o no se pueda entregar el dinero al usuario, la transacción se anula y la base de datos vuelve al estado original. No se entrega el dinero pero tampoco se resta ninguna cantidad de la cuenta.

En nuestro ejemplo indicamos que iniciamos la transacción mediante la función autocommit().

Con esta función estamos diciendo al sistema que no ejecute cada instrucción de MySQL por separado y de forma inmediata, sino que sólo lo haga al llamar a la función commit(), como veremos más adelante.

Además creamos una variable booleana para comprobar si ha habido algún error durante las transacciones. La inicializamos a false. En caso de que haya al menos un error quedaría con el valor true.

 

Bucle de lectura de líneas

Mediante un bucle while() leemos todas las líneas del fichero.

Con la función fgets() leemos las líneas de manera independiente. Mientras haya líneas, se guardan en la variable $linea y entramos al while().

 

Extracción de los datos desde las líneas

Para la extracción de los datos dentro de las líneas, utilizamos la función explode(), a la que le pasamos como parámetro el carácter que hace de separador y la cadena donde están los datos a tratar. El resultado lo metemos en la variable $arrayDatos.

Como podéis ver, me parece muy importante utilizar nombres descriptivos para las variables. Recordemos que los programas deben ser hechos para que lo entiendan otras personas.

La instrucción var_dump() muestra el contenido de la variable que le pasamos en forma legible por humanos. Es muy práctica para comprobar si hemos guardado lo que queremos guardar de forma correcta.

La función explode() mete los campos que encuentra en posiciones consecutivas de un array. Sabiendo el orden de los datos originales metemos los datos en variables con nombres descriptivos por claridad del código, aunque se podrían utilizar directamente.

 

Inserción de los datos en la base de datos

Ahora creamos una cadena para la sentencia SQL de inserción de datos en la base de datos.

Un error muy común es olvidar algunas comillas en la consulta SQL, por lo que es muy recomendable sacarla por pantalla mediante un echo y probarla directamente en la base de datos. Nos ahorraremos mucho tiempo.

En la consulta simplemente le decimos a la base de datos que vamos a insertar en la tabla con nombre equipos_acb y en los campos que le indicamos (y en ese orden) los valores que le pasamos.

En este punto es interesante tener en cuenta que la operación de consulta mediante la función query() se ejecuta al mismo tiempo que comprobamos si devuelve true o false.

Si la operación no ha ido como debiera (porque ya existe un registro con esa clave duplicada, por ejemplo), nos devolvería false, con lo que la variable booleana $errorEnTransaccion quedaría con el valor true hasta el final del programa.

 

Realizar la transacción o volver atrás en caso de error

Ahora comprobamos si ha existido error en alguna de las operaciones de inserción.

En caso de que haya habido un error, hacemos un rollback mediante su correspondiente función, con lo que la base de datos vuelve a su estado original y no se inserta ninguno de los datos.

Si no ha habido error en ninguna de las operaciones de inserción individuales, invocamos a la función commit(), que da por válidas todas las operaciones realizadas, con lo que los datos quedan insertados.

En ambos casos mostramos un mensaje por pantalla.

 

Cierre de conexión a base de datos y fichero

Finalmente cerramos la conexión a la base de datos y el fichero.

 

¿Felicitaciones o quejas? ¡Comenta y comparte!

Si te ha gustado o has detectado un error, te agradezco tus comentarios, y puedes compartirlo mediante los enlaces habilitados.

¡Gracias por tu visita!

CategoríasPHP

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *