Tengo este código en el que utilizo la clase spoondatabase para el manejo de la base de datos, esa parte está bien (creo) los nombres de las variables son ejemplos, pero es lo mismo que en real:
Código PHP:
<?php
//Activamos la visualización de todo tipo de errores y notificaciones
error_reporting(E_ALL);
ini_set("display_errors", 1);
//Definimos zona horaria
date_default_timezone_set('Europe/Madrid');
setlocale(LC_ALL, "spanish", "es", "es_ES@euro","es_ES","esp");
// Cargamos datos comunes a todo el sistema
require_once ("datos_sistema.php");
//creo una conexión con la base de datos
$db = new SpoonDatabase(CONTROLADOR, SERVIDOR, USUARIO, CLAVE, BASE_DATOS);
define('PATH', '/la_ruta_completa_al_archivo/');
$cantidad = $db->getRecords("SELECT id FROM tabla");
//Cuento el total de elementos para no pasarme al actualizar los archivos
$total = count($cantidad);
//Recibo y limpio las variables que legan por $_GET
if ( (isset($_GET['num1'])) && (!empty($_GET['num1'])) ) {
$maximo = trim(htmlentities(strip_tags($_GET['num1'])));
}
if ( (isset($_GET['num2'])) && (!empty($_GET['num2'])) ) {
$minimo = trim(htmlentities(strip_tags($_GET['num2'])));
}
//Aquí hago un condicional para que si me paso de
//número en las variables que envío, se quede en el máximo
if ($maximo<=$total) {
$maximo = $maximo;
} else {
$maximo = $total;
}
$minimo = $minimo;
//Creo la función para leer y modificar los archivos
function leer_fichero_completo($nombre_fichero, $dato1_a_agregar, $dato2_a_agregar){
global $minimo, $maximo, $db;
//Como hay que modificar todos los archivos según los datos de la
//base de datos, hago un bucle que obtiene los datos de la base de datos
for($i=$minimo;$i<=$maximo;$i++) {
//Hago una petición para que me muestre todos los registros de la tabla
//que coincidan con el id enviado, esto genera un array unidimensional
$datos = $db->getRecord("SELECT
id,
nombre_archivo,
dato1_a_agregar,
dato2_a_agregar
FROM tabla
WHERE id=?", $i);
//Paso los datos recibidos a variables
$nombre_archivo = $datos['nombre_archivo'];
$dato1_a_agregar = $datos['dato1_a_agregar'];
$dato2_a_agregar = $datos['dato2_a_agregar'];
$ext = ".ext";
$first = substr($nombre_archivo,0,1);
} //Fin del buble que obtiene los datos
//Empiezo a trabajar con el archivo (o archivos, claro)
if (!file_exists($nombre_fichero)) {
echo "No existe el fichero";
}
if (!is_writable($nombre_fichero)) {
echo "El archivo no es escribible";
}
//abrimos el archivo de texto y obtenemos el identificador
$fichero_texto = fopen ($nombre_fichero, "r");
//obtenemos de una sola vez todo el contenido del fichero
//OJO! Debido a filesize(), sólo funcionará con archivos de texto
$contenido_fichero = fread($fichero_texto, filesize($nombre_fichero));
$contenido_fichero = $contenido_fichero . $dato1_a_agregar . "\n" . $dato2_a_agregar . "\n";
//Actualizamos el archivo con el nuevo valor
$fp = fopen($nombre_fichero,"w+");
fwrite($fp, $contenido_fichero, 1024);
fclose($fp);
return $contenido_fichero;
} //Fin de la función
//Como hay que modificar todos los archivos según los datos de la
//base de datos, hago un bucle que, por un lado obtiene los datos
//de la base de datos, y por otro lado, modifica los archivos
//correspondientes mediante la función anterior
for($i=$minimo;$i<=$maximo;$i++) {
//Hago una petición para que me muestre todos los registros de la tabla
//que coincidan con el id enviado, esto genera un array unidimensional
$datos2 = $db->getRecord("SELECT
id,
nombre_archivo,
dato1_a_agregar,
dato2_a_agregar
FROM tabla
WHERE id=?", $i);
$nombre_archivo2 = $datos2['nombre_archivo'];
$dato1_a_agregar2 = $datos2['dato1_a_agregar'];
$dato2_a_agregar2 = $datos2['dato2_a_agregar'];
$ext2 = ".ext";
$first2 = substr($nombre_archivo2,0,1);
$nombre_fichero2 = PATH . $first2 ."/".$nombre_archivo2.$ext2;
//Aquí ejecuto la función pasando los parámetros necesarios
$contenido = leer_fichero_completo($nombre_fichero2, $dato1_a_agregar2, $dato2_a_agregar2);
//Esto es una prueba para ver que los datos son correctos.
//$contenido = $nombre_fichero2 ."<br>". $dato1_a_agregar2 ."<br>". $dato2_a_agregar2;
//Con esto notifico qué archivo se ha modificado y los datos modificados en cada archivo
echo $i . ".- Se ha actualizado el archivo <b>" . $nombre_archivo2 . "</b> con los datos <b>" . $dato1_a_agregar2 . "</b> y <b>" . $dato2_a_agregar2 . "</b><br>";
//En esta línea muestra los datos que deben ser, pero en el contenido de cada archivo, no
//Con esto muestro el nuevo contenido de cada archivo para ver si está correcto.
echo "<pre>";
echo $contenido;
echo "</pre>";
//Aquí es donde veo que el contenido de cada archivo no es correcto, lo explico fuera del código
}
?>
El caso es que cuando muestro el contenido de cada archivo, los datos que me ha añadido son en todos los casos, los recibidos en la última vuelta del bucle, sin embargo, en la prueba anterior, sí me muestra en cada caso los datos correctos.
Así que me estoy volviendo loco, llevo dos días dándole vueltas a este asunto y no le veo el fallo, por eso lo posteo aquí a ver si otros ojos me echan un cable
Muchas gracias por anticipado.