0

Tengo un código ya hecho que lee un archivo CSV separado por TAB y sube datos a MySQL.

Los datos vienen de un CSV de este link: http://localhost/products.csv.

Este archivo products.csv por dentro tiene esta forma:

Este es el código:

<?php
    # conectare la base de datos
    $con = @mysqli_connect("localhost", "root", "", "base");
    if(!$con){
        die("imposible conectarse: ".mysqli_error($con));
    }

    if (@mysqli_connect_errno()) {
        die("Connect failed: ".mysqli_connect_errno()." : ". mysqli_connect_error());
    }

// Leer todo el archivo, eliminando comillas
    $tabla = str_replace('"', '', file_get_contents("http://localhost/products.csv"));

    // Separar por líneas
    $lineas = explode("\n", $tabla);

    // Recorrer cada línea
    foreach($lineas as $tmp) {
        // Eliminar posibles espacios y retorno de carro; separar por tabulador
        $datos = explode("\t", trim($tmp));
        $modelo = $datos[0];
        $nombre = $datos[1];
        $descripcion = $datos[2];

        // Crear cadena y mostrar en pantalla
        $insertar = "insert into tabla (nombre, descripcion, modelo) values ('$nombre','$descripcion','$modelo')";
        echo $insertar;

        if(mysqli_query($con, $insertar)) {
            echo ' - insertado<br>';
        } else {
            echo ' - Error insertando: ' . mysqli_error($con) . '<br>';
        }
    }

?>

He impreso en pantalla lo que lee el código y me muestra esto:

Pero en BD me sube esto:

Como se puede ver, hay datos en las 3 columnas MODELO, NOMBRE, DESCRIPCION ocupando algún espacio en Bytes. Se ve, pero si entro está vacío.

Hay una curiosidad, que el primer campo llamado MODELO tiene la inicial del campo modelo que viene del archivo CSV

Las columnas son campos de TEXT, la estructura de la tabla es esta:

Que me falta en el código para que la Base de datos no me suba estos caracteres vacíos ya que en pantalla si se leen los datos y el resultado sea este:

David E. Luna M.
  • 2,687
  • 4
  • 11
  • 28
Ivan Diaz Perez
  • 853
  • 1
  • 9
  • 24
  • Hay un problema de codificación y debería ser resuelto. Si observas la primera línea, aparece el carácter inspector en algunos datos. Si tienes un problema de codificación puede pasar cualquier cosa en la inserción. Creo que ese es el primer problema a resolver. Te recomendaría que establezcas codificación utf8 en todo: en tu archivo, en la conexión a la base de datos, en el entorno PHP y en la tabla. – A. Cedano Feb 17 '21 at 18:52
  • Por otra parte, los datos no parecen ser los mismos. En la primera captura los encabezados serían: `Modelo, Nombre, Descripción` pero en la captura de los `insert into` que se producen, si analizas la primera línea los encabezados son: `Modelo raíz, Nombre, Modelo` y además en los datos aparecen unos `;` que no se reflejan en la primera captura. Verifica que estás accediendo al archivo correcto. No parece ser el caso aquí. – A. Cedano Feb 17 '21 at 18:59
  • bueno si quizas las columnas no son las que corresponden pero todas tienen data de tipo text. en la imagen tienes razon no son las mismas pero en el archivo asi aparecen, he revisado y todo esta en utf8, los datos como la tabla, si ese caracter de inspeccion YP no importa ya que la primera linea se borra por que es la cabecera. de hecho en la pantalla de resultado no se ve el ID=1, esta pantalla la hice pasado con excel de tab a csv el archivo original – Ivan Diaz Perez Feb 17 '21 at 19:31
  • Yo me refiero al carácter inspector � que aparece en la captura de los `insert` . Si tienes un problema de codificación la consulta podría romperse o podría insertar datos disparatados. La codificación no es una cosa despreciable, es fundamental para estos casos. Sugiero que revises [esta respuesta](https://es.stackoverflow.com/a/59510/29967), donde se aborda el tema con más detalles y se indican los métodos necesarios para tener la codificación controlada. Mientras ese carácter inspector aparezca en tus datos, muy mal, no deberías estar tranquilo. Luego podremos ver otros posibles errores. – A. Cedano Feb 17 '21 at 19:37
  • vale si lo he corregido con un utf8_encode pero sigue insertando la primera letra nada mas. ahora por que en pantalla si se ve bien y el bd no... que puedo colocar a la pantalla para ver lo que inserta en BD – Ivan Diaz Perez Feb 17 '21 at 19:43
  • Lo que inserta en la BD es lo que ves en pantalla. ¿Podrías [edit] la pregunta para mostrar el código actual y una muestra de lo que imprimen los `insert` ahora? Se agradece texto en vez de capturas de pantalla. Convendría que establezcas utf-8 también en la conexión a MySQLi (el modo de hacerlo se explica en la respuesta que te enlacé en mi anterior comentario). Los problemas serios de codificación no se resuelven con `utf8_encode`. Repito de nuevo, tómate en serio los problemas de codificación o te podrás llevar sorpresas muy desagradables o perder días depurando código sin sentido. – A. Cedano Feb 17 '21 at 19:46
  • Gracias Padre pero no entiendo no se que hacer en vez de imprimir todo, necesitas es imprimir campo a campo en pantalla??? lo he seguido en twitter.. – Ivan Diaz Perez Feb 17 '21 at 20:12
  • Edita la pregunta, poniendo el código actual. Igualmente, muestra el archivo real, porque como dije antes, la primera captura no coincide con los que salen en los `insert`, por lo que puede ser que estés confundido con el archivo que estás intentando leer. Luego, el problema de la codificación deberías resolverlo. No hay problema, luego te puedo escribir una respuesta al respecto. El problema es que la pregunta actualmente no está planteada de un modo que se pueda intentar una respuesta, porque hay incoherencia en las cosas que explicas en ella. – A. Cedano Feb 17 '21 at 21:09

0 Answers0