Carga tu base de datos Contact Form DB desde un fichero CSV

El truco de hoy viene por un proyecto que he hecho hace poco, la web para la Plataforma Garanticemos las pensiones. Tenian un formulario de Google para hacer el registro de socios, pero se les quedaba corto.  Solicitaron mi ayuda y construimos una pequeña web en wordpress para dar información de la plataforma y lo más importante recoger con un formulario las solicitudes para ser socio.

Para el formulario se utilizó el plugin Contact Form 7, muy conocido, potente y sobradamente probado. Para guardar los datos en base de datos usamos la extensión Contact Form DB que permite almacenar la información de los formularios una vez enviado el mail.

El problema viene porque ya había unos cuantos socios, así que, o se cargaban en el sistema o estarían en más de un sitio, lo que no es muy práctico.

Contact Form DB tiene un módulo de pago que permite hacer la carga desde un fichero CSV. Es una solución, pero si quieres hacerlo gratis, esto que te propongo te interesa.

El módulo crea dos tablas en nuestra base de datos de WordPress donde almacena los datos. Estas tablas son cf7dbplugin_st y cf7dbplugin_submits puedes verlas conectándote a la base de datos con phpmyadmin.

cf7dbplugin_st tiene un solo campo submit_time que es la fecha y hora en que se graba cada entrada y que sirve como índice (aunque no es un índice)

cf7dbplugin_submits es donde realmente están los campos de nuestro formulario. El plugin graba una línea por cada campo, todas con el mismo dato de fecha y hora en el campo  submit_time.

La estructura de esta tabla es;

submit_time
form_name
field_name
field_value
field_order
file

submit_time ya sabemos lo que contiene, form_name es el nombre del formulario desde el que llegan los datos, field_name, el nombre de cada campo de ese formulario, field_value el valor, field_order el orden que le damos y en el que aparecerá en la lista  y file donde guarda el attach o adjunto si lo hubiera (no busques las fotos en los directorios, los guarda en la base de datos en un fichero tipo longblob).

Bueno, con esto ya sabemos cómo se lo curra Contact Form DB para almacenar la información. Lo único que necesitamos es tener los datos que vamos a cargar en un fichero CSV separado por comas, un programita HTML que nos solicite la carga del CSV y un PHP que lea el fichero y grabe en estas tablas.

Imaginemos que queremos cargar el fichero CSV con esta estructura

numerosocio nombre apellidos nif
1 pablo fernandez 11111111y
2 laura perez 222222u
3 josé jimenez 3333333i

El código del HTML es muy sencillo

cargadatos.html
<!DOCTYPE html>
<body>
<h1>Importando archivo CSV</h1>
<form action=’cargadatos.php’ method=’post’ enctype=»multipart/form-data»>
Importar Archivo : <input type=’file’ name=’sel_file’ size=’20’>
<input type=’submit’ name=’submit’ value=’submit’>
</form>
</body>
</html>

Se trata de un formulario que nos permite seleccionar de nuestro ordenador el CSV a cargar (En UTF8 genial) y se lo pasa a cargadatos.php que es el que va a hacer el trabajo duro.

Después creamos un fichero PHP con este código;

cargadatos.php

<?php

//conexiones, conexiones everywhere
ini_set(‘display_errors’, 1);
error_reporting(E_ALL);
$db_host = ‘localhost’;
$db_user = ‘usuario de tu base de datos’; // cambiar

$db_pass = ‘clave de tu base de datos’; // cambiar

$database = ‘nombre de tu base de datos’; // cambiar
$table = ‘xxx_cf7dbplugin_submits’; // donde pone xxx pon el prefijo de tu tabla
$tablest = ‘xxx_cf7dbplugin_st’; // donde pone xxx pon el prefijo de tu tabla
if (!@mysql_connect($db_host, $db_user, $db_pass))
die(«No se pudo establecer conexión a la base de datos»);

if (!@mysql_select_db($database))
die(«base de datos no existe»);
if(isset($_POST[‘submit’]))
{
//Aquí es donde seleccionamos nuestro csv
$fname = $_FILES[‘sel_file’][‘name’];
echo ‘Cargando nombre del archivo: ‘.$fname.’ <br>’;
$chk_ext = explode(«.»,$fname);

if(strtolower(end($chk_ext)) == «csv»)
{
//si es correcto, entonces damos permisos de lectura para subir
$filename = $_FILES[‘sel_file’][‘tmp_name’];
$handle = fopen($filename, «r»);
// ponemos el nombre del formulario, debe coincidir con el de contact form 7
$formulario = «Nombre de nuestro formulario»; // cambiar
// calculamos submit time
$time = number_format(time(), 4, ‘.’, »);
while (($data = fgetcsv($handle, 1000, «,»)) !== FALSE)
{
// sumamos 1 a $time
$time++;

// grabamos submit time en la tabla st
$sql0 = «INSERT into «. $tablest . » (submit_time) VALUES (‘$time’);»;
mysql_query($sql0) or die(‘Error: ‘.mysql_error());

// Grabamos un registro por cada campo del formulario mas uno de la ip
$sql1 = «INSERT into «. $table . » (submit_time, form_name, field_name, field_value, field_order, file) VALUES (‘$time’,’$formulario’,’numerosocio’,’$data[0]’,’0′,NULL);»;
mysql_query($sql1) or die(‘Error: ‘.mysql_error().’query-> ‘.$sql1);

$sql2 = «INSERT into «. $table . » (submit_time, form_name, field_name, field_value, field_order, file) VALUES (‘$time’,’$formulario’,’nombre’,’$data[1]’,’1′,NULL);»;
mysql_query($sql2) or die(‘Error: ‘.mysql_error().’query-> ‘.$sql2);

$sql3 = «INSERT into «. $table . » (submit_time, form_name, field_name, field_value, field_order, file) VALUES (‘$time’,’$formulario’,’apellidos’,’$data[2]’,’2′,NULL);»;
mysql_query($sql3) or die(‘Error: ‘.mysql_error().’query-> ‘.$sql3);

$sql4 = «INSERT into «. $table . » (submit_time, form_name, field_name, field_value, field_order, file) VALUES (‘$time’,’$formulario’,’nif’,’$data[3]’,’3′,NULL);»;
mysql_query($sql4) or die(‘Error: ‘.mysql_error().’query-> ‘.$sql4);

$sql5 = «INSERT into «. $table . » (submit_time, form_name, field_name, field_value, field_order, file) VALUES (‘$time’,’$formulario’,’Submitted From’,’11.111.111.111′,’1000′,NULL);»; // cambiar 11.111.111.111 por la ip que quieras poner
mysql_query($sql5) or die(‘Error: ‘.mysql_error().’query-> ‘.$sql5);

}
//cerramos la lectura del archivo «abrir archivo» con un «cerrar archivo»
fclose($handle);
echo «LOS DATOS SE HAN IMPORTADO CORRECTAMENTE!»;
}
else
{
//si aparece esto es posible que el archivo no tenga el formato adecuado, inclusive cuando es cvs, revisarlo para
//ver si esta separado por » , »
echo «Archivo invalido!»;
}
}

?>

El código es sencillo, primero cargamos unas variables con los datos de la base de datos, nombre, usuario y clave y los de las tablas que vamos a usar y hacemos la conexión a la base de datos.

Luego cargamos y validamos el CSV que nos ha mandado el HTML

Cargamos una variable con el nombre del formulario al que vamos a subir los datos y calculamos en la variable $time el valor de submit_time con la hora del momento en que hacemos la carga.

con un bucle while vamos leyendo el CSV hasta el final y por cada registro que leemos hacemos lo siguiente;

sumamos 1 al $time para que no sea igual al submit_time del registro anterior

Grabamos en la tabla cf7dbplugin_st un registro con este valor

Grabamos en la tabla cf7dbplugin_submits un registro por cada campo del registro leido en el CSV, en este caso 3 más otro con la ip desde la que hacemos la carga. (O la que queramos que tampoco importa mucho, siempre la misma). Los datos que cargamos son $data[0] a $data[n] donde $data[0] será el primer campo del CSV y $data[n] el último.

Bien, con esto hecho, subimos los dos ficheros html y php con un cliente FTP  a nuestro servidor y llamamos desde nuestro navegador al html.

Nos solicita el CSV, se lo damos desde nuestro ordenador y a correr. 🙂

Espero que os solucione la vida.

Ver tambien

Llegar a tus clientes por el corazón, mapas de empatía.

Es mas viejo que la cuchara de palo, la mejor forma de mantener a tus …

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.