entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Problema Actualizar columna de un csv .Elimina contenido

Hola me encuentro con el siguiente codigo :

//Abrimos el fichero en modo c+, que permite lectura y escritura sin truncar el fichero, como hace w
$f = fopen(__DIR__ .'/datos/saved.csv', 'c+');
$cursor = 0;
while ($row = fgetcsv($f)) {
     $result = $row[1];
     //Actualiza la 3 columna
     $res = $row[3]+1;
     $row[3] = $res;
    //Retrocede el cursor al principio de la fila, para sobreescribirla
    fseek($f, $cursor);
    //Escribe la fila con la segunda columna modificada
    fputcsv($f, $row);

     //Actualiza el valor de la variable cursor, para que podamos volver al principio de línea en su caso
    //$cursor = ftell($f);
  }

fclose($f);

Este código actualiza la tercera columna de saved.csv la columnas de saved.csv son :

570de,url,contenido,0
b9636,url,contenido,0

El proceso se realiza al actualizar la pagina El problema esta en que me elimina la primera columna de la segunda fila dejando el contenido de saved.csv de esta manera:

570de,url,contenido,1
,url,contenido,1

Aun no entiendo que es lo que esta mal espero su ayuda.

1voto

carlossevi comentado

Si $cursor siempre es cero, con la siguiente línea siempre estás volviendo al principio del fichero:

//Retrocede el cursor al principio de la fila, para sobreescribirla
fseek($f, $cursor);

0voto

Botxtrem-Solutions comentado

Gracias por la aclaracion iigual me queda la duda de como esa parte es la causante de que borre la primera columna de la segunda fila.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola @Botxtrem-Solutions,

tu código, así como lo ponés en la pregunta, entra en un bucle infinito.

Posiblemente veas trunca una de las líneas cuando la ejecución llega al tiempo máximo permitido y el script se aborta.

El motivo del bucle infinito es que es que fputcsv() avanza el puntero del archivo para que en el próximo while() se avance a la línea siguiente, pero al hacer en todas las iteraciones fseek($f, $cursor) con $cursos=0 siempre, vuelve al principio y no sale más.

Seguramente no tenés configurado tu PHP.ini para desarrolo con las opciones que corresponde, porque de ser así verías este error en la pantalla.

Por último, si estás haciendo esto para guardar las visitas que tiene una página o algo para usar en la web, es una muy mala elección: los archivos no pueden leerse y escribirse concurrentemente, así que cuando haya varios visitantes a la vez el script fallará porque está bloqueado por otro visitante.

Si estás guardando estas cosas para uso real, debés usar una base de datos o algún soporte que permite la concurrencia de manera solvente.

Saludos cordiales

0voto

Botxtrem-Solutions comentado

Gracias por tu aclaración y si comprendo y el código lo uso para practicar y aprender otra manera de no depender tanto de las bases de datos igual te agradezco mucho tu explicación Saludos cordiales

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta