Este post es continuación de Limpieza de links erróneos: codificando un PHP y Ejecutando consultas de MySQL desde PHP
Poco a poco voy eliminando errores existentes en la base de datos de Blogpocket, relacionados con el SEO. Un blog de 12 años de vida acumula telarañas y eso es lo que estamos llevando a cabo: ¡una limpieza a fondo de primavera!… como Google 😛 .
En el post anterior vimos cómo ejecutar consultas de MySQL desde PHP. Con un sencillo script pudimos actualizar el contenido de un post en el que apareciese un determinado literal. En nuestro caso, una de las cosas que nos interesa buscar son URLs. Pero aquél script no nos sirve si queremos buscar un gran número de URL’s o, mejor dicho, nos vale de muy poco. Al menos, nos darían las uvas cambiando cada vez el literal y ejecutando el script mil veces.
Para eso existen los archivos y la capacidad que poseen todos los lenguajes de programación para leerlos y, en consecuencia, procesar cada uno de sus elementos (denominados técnicamente «registros»). En el caso que nos ocupa, nuestro archivo puede contener, simplemente, un registro por cada URL que deseamos buscar en la base de datos.
[php]
<?php
$file = file(«archivo.txt»);
$contador_registros=0;
foreach ($file as $fila)
{
$linea = eregi_replace(«[\n|\r|\n\r]», «», $fila);
echo «-«.$linea.»-<br />»;
$contador_registros++;
}
echo «Numero de registros del archivo = «.$contador_registros;
?>
[/php]
Una de las funciones en PHP que nos permite leer un fichero es file. Otra es fopen combinada con fgets. Pero aquí emplearemos file que transfiere «de golpe» un fichero completo a un array.
Nuestro archivo (archivo.txt) contiene una línea por cada URL. Una vez que tenemos todo el archivo cargado en la variable $file podemos recorrer este array con la estructura foreach, que es una forma muy sencilla de iterar sobre arrays. En cada iteración es posible acceder a cada elemento del array que se encuentra en la variable $fila (gracias a la condición del bucle foreach «$file as $fila»).
Nuestro programa de ejemplo lo único que hace es mostrar en pantalla el contenido del archivo (todas las URLs contenidas en él, cada una en una línea distinta) y contar cuántas existen.
Para ello empleamos la instrucción «echo» con un pequeño formateo que consiste en mostrar un guión «-» delante de cada URL y forzar el salto de línea con la etiqueta HTML «<br />». La variable $linea es la que contiene la URL extraída del archivo y que ha sido calculada previamente utilizando la función eregi_replace que sustituye una expresión regular de forma insensible a mayúsculas-minúsculas. Esto es únicamente para eliminar los saltos de línea del archivo que nos lo hemos traído junto con las URLs al ejecutar la función «file».
Sobre expresiones regulares habría que hablar largo y tendido. En esta entrada solamente nos quedaremos con la idea de que «[\n|\r|\n\r]» es una expresión regular que identifica los saltos de línea y que con eregi_replace los sustituimos por «» (un espacio vacio); es decir, por nada.
Para contar los registros, inicializamos la variable $contador_registros a cero antes del bucle, aumentamos una unidad a dicha variable con cada iteración (con la instrucción $contador_registros++, que es lo mismo que «$contador_registro=$contador_registros+1») y mostramos el resultado finalmente, al finalizar el bucle con la instrucción echo correspondiente.
Con este script y los anteriores ya tenemos las piezas fundamentales de nuestro programa para eliminar errores de la base de datos: introducimos las URL erróneas en un archivo, lo leemos y para cada una de ellas, actualizamos aquellos posts que las contengan cambiando dichas URLs por otras. ¡Fácil! ¿no?
Un detalle fino: si te fijas en la instrucción echo que está dentro del bucle foreach, veras que también hay un guión «-» justo detrás de la variable $linea. Eso es un truco para comprobar si la función eregi_replace ha cumplido correctamente su misión (eliminar el carácter de salto de línea del archivo): si el guión se muestra inmediatamente detrás de la URL es que todo está ok. Si, por el contrario, hay un espacio en blanco es que el carácter de salto de línea no ha sido eliminado 😉 .
Deja una respuesta