0

Veamos, estoy leyendo datos de un fichero CSV para meterlos con PHP en una BBDD MySQL. Este es el código:

$archivo=fopen("articulos1.csv", "r"); //abro el archivo

while(!feof($archivo)){

    $linea=fgets($archivo); //Leo datos con CSV
    $arrayLineas=explode(";", $linea); //Aquí tengo mi array con los datos del 

    if(!empty($arrayLineas[0])){ //Con esto quito cuando el ean esté vacío
        $contador=0;
        while($contador<count($arrayLineas)){
            $sql="INSERT INTO articulos_csv (`ean`, `nombre`) VALUES"." (".$arrayLineas[0].", ".$arrayLineas[1].")";
            $resultado=mysqli_query($conWebService, $sql);
            $contador++;
        }

Os dejo un ejemplo del tipo de estructuras que estoy recorriendo para insertar en la BBDD:

array(2) {
  [0]=>
  string(1) "9"
  [1]=>
  string(40) "PORT�TIL ASUS ROG ZEPHYRUS G14 GA401IU
"
}

Algunas líneas del CSV (abierto con el bloc de notas):

1;DECODIFICADOR ENGEL RS8100Y
3;RELOJ DEPORTIVO CON GPS GARMIN INSTINCT SOLAR AM

Algunas líneas de la BBDD (eso es lo máximo que he conseguido, ya que con el código actual no me inserta nada pero tampoco me da error):

ean nombre
1    1
3    3

ACTUALIZACIÓN 1:

He puesto todos los textos del CSV entre comillas, de la siguiente forma:

1;"DECODIFICADOR ENGEL RS8100Y"
3;"RELOJ DEPORTIVO CON GPS GARMIN INSTINCT SOLAR AM"

He probado con el siguiente código:

        foreach ($arrayLineas as $key => $value) {
            $sql="INSERT INTO articulos_csv (`ean`, `nombre`) VALUES"." (".$value.", ".$value.")";
            $resultado=mysqli_query($conWebService, $sql);

Y he conseguido lo siguiente en mi tabla de MYSQL:

ean nombre
0    DECODIFICADOR ENGEL RS8100Y
3    3
5    5

Es decir, no lo comprendo. Me mete el primer nombre medio bien (nombre correcto pero ean no, que debería ser 1) pero el resto no, y no da ningún error. No sé en qué estoy fallando. En este caso he estado leyendo el txt. Cuando leo el csv con este mismo código, lo que me inserta en MySQL es:

ean nombre
1    1
3    3

No veo dónde está el fallo.

Muchas gracias, saludos.

Sergio
  • 251
  • 2
  • 11
  • 1
    Modifica la pregunta añadiendo algunas líneas del CSV y la base de datos (phpMyAdmin, Export) a ver si vemos qué puede estar pasando... Recuerda que, salvo que sea algo trivial, tendremos que reproducir lo que te está pasando para poder ayudarte – David JP Oct 29 '20 at 11:37
  • El dato del índice `1` pinta muy, pero muy feo. ¿Viste ese carácter inspector `�` en `PORT�TIL`? ¿Viste que el dato tiene algo así como un salto de línea? Te recomiendo que, antes de hacer inserciones masivas, revises tu fuente de datos. Si esa inserción ocurriese, vas a tener posiblemente un desastre en tu BD (datos mal insertados, caracteres inspector por todos lados, saltos de línea, etc). Limpia bien tus datos primero y luego, para insertar, cuida tu configuración a todos los niveles. Además, es muy probable que aquí, el símbolo inspector u otro estén rompiendo el código, causando error. – A. Cedano Oct 29 '20 at 11:41
  • Te recomiendo que antes de seguir, pares el carro un momento y leas [esta pregunta](https://es.stackoverflow.com/q/59489/29967) y las respuestas dadas allí. Creo que puede ayudarte mucho a no complicarte en este proceso. – A. Cedano Oct 29 '20 at 11:42
  • En cuanto a ese carácter ya lo tengo solucionado. Lo solucioné así: $linea=utf8_encode(fgets($archivo)); //Leo datos con CSV y lo voy poniendo en formato UTF8. Quizás no es lo mejor, pero tampoco creo que sea un problema hacerlo recurriendo a una función, ¿no? – Sergio Oct 29 '20 at 11:47
  • Tienes que poner comillas simples ``` para los valores de tipo `VARCHAR`, por ejemplo: `$sql="INSERT INTO articulos_csv (ean, nombre) VALUES ($arrayLineas[0], '$arrayLineas[1]')";` Intenta de este modo, y para depurar, pon un `echo $sql;` y pon una muestra de la salida para revisar. En cuanto al código que pones al final, hacer la inserción así no tiene sentido, pues ocurrirá un `query` por cada columna... – A. Cedano Oct 29 '20 at 12:15
  • VALUES"." (".$arrayLineas[0].", ".$arrayLineas[1].")"; Ese es el código que tengo de la sentencia SQL. ¿Cómo pones ahí las comillas simples? Es que me lío mucha al mezclar '" y tal cuando concateno variables en SQL y he probado varias formas y me da error (además de haber buscado en Internet pero no haber encontrado nada claro). Muchas gracias. – Sergio Oct 29 '20 at 12:19
  • 1
    La consulta la puedes escribir tal y como te he dicho: `$sql="INSERT INTO articulos_csv (ean, nombre) VALUES ($arrayLineas[0], '$arrayLineas[1]')";` así te lías menos. Las comillas simples rodean a `$arrayLineas[1]` que parece ser el valor para la columna VARCHAR. – A. Cedano Oct 29 '20 at 21:48
  • O sea que las comillas simples para valores String no? Muchas gracias :) – Sergio Oct 30 '20 at 09:09

1 Answers1

0

Finalmente ya lo he solucionado. Este era el código correcto:

while(!feof($archivo)){

    $linea=utf8_encode(fgets($archivo)); //Leo datos con CSV y lo voy poniendo en formato UTF8
    $arrayLineas=explode(";", $linea); //Aquí tengo mi array con los datos del CSV

    if(!empty($arrayLineas[0])){ //Con esto quito cuando el ean esté vacío
        $sql="INSERT INTO articulos_csv (`ean`, `nombre`) VALUES ('$arrayLineas[0]', '$arrayLineas[1]');";
        var_dump($arrayLineas[0]);
        var_dump($arrayLineas[1]);
        $resultado=mysqli_query($conWebService, $sql);

        if(!$resultado){
            echo "Error: ". $sql ."\n". mysqli_error($conWebService);
        }
      }
    }

fclose($archivo);

Sergio
  • 251
  • 2
  • 11