ultima - mostrar datos de mysql en php en una tabla html
¿Cómo puedo saber cuándo se actualizó por última vez una tabla MySQL? (12)
En el pie de página de mi página, me gustaría agregar algo como "la última actualización fue xx / xx / 200x", siendo esta fecha la última vez que se actualizó cierta tabla mySQL.
¿Cuál es la mejor manera de hacer eso? ¿Hay una función para recuperar la última fecha actualizada? ¿Debo acceder a la base de datos cada vez que necesito este valor?
Análisis de nivel del sistema operativo:
Encuentre dónde se almacena el DB en el disco:
grep datadir /etc/my.cnf
datadir=/var/lib/mysql
Verifique las modificaciones más recientes
cd /var/lib/mysql/{db_name}
ls -lrt
Debería funcionar en todos los tipos de bases de datos.
Crearía un disparador que atrape todas las actualizaciones / inserciones / eliminaciones y escriba la marca de tiempo en la tabla personalizada, algo así como nombre de tabla | marca de tiempo
Solo porque no me gusta la idea de leer tablas del sistema interno del servidor db directamente
Esto es lo que hice, espero que ayude.
<?php
mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
mysql_select_db("information_schema") or die(mysql_error());
$query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE
`TABLE_SCHEMA` LIKE ''DataBaseName'' AND `TABLE_NAME` LIKE ''TableName''";
$result1 = mysql_query($query1) or die(mysql_error());
while($row = mysql_fetch_array($result1)) {
echo "<strong>1r tr.: </strong>".$row[''UPDATE_TIME''];
}
?>
Guarde en caché la consulta en una variable global cuando no esté disponible.
Cree una página web para forzar que la memoria caché se vuelva a cargar cuando la actualice.
Agregue una llamada a la página de recarga en sus scripts de implementación.
Lo más simple sería verificar la marca de tiempo de los archivos de tabla en el disco. Por ejemplo, puede consultar debajo de su directorio de datos
cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd
Esto debería darle la lista de todas las tablas con la tabla cuando se modificó por última vez la hora más antigua, primero.
Me sorprende que nadie haya sugerido el seguimiento del último tiempo de actualización por fila:
mysql> CREATE TABLE foo (
id INT PRIMARY KEY
x INT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
KEY (updated_at)
);
mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | NULL | 2013-08-18 03:26:28 |
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
mysql> UPDATE foo SET x = 1234 WHERE id = 1;
Esto actualiza la marca de tiempo aunque no lo mencionamos en la ACTUALIZACIÓN.
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
Ahora puede consultar el MAX ():
mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at) |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+
Es cierto que esto requiere más almacenamiento (4 bytes por fila para TIMESTAMP).
Pero esto funciona para tablas InnoDB anteriores a la versión 5.7.15 de MySQL, lo que no ocurre con INFORMATION_SCHEMA.TABLES.UPDATE_TIME
.
No estoy seguro si esto sería de interés. Usando mysqlproxy entre mysql y clientes, y haciendo uso de un script lua para actualizar un valor de clave en memcached de acuerdo con cambios interesantes en la tabla, ACTUALIZAR, ELIMINAR, INSERTAR fue la solución que hice recientemente. Si el envoltorio admite ganchos o activadores en php, esto podría haber sido más fácil. Ninguna de las envolturas a partir de ahora hace esto.
No tengo la base de datos de information_schema, utilizando la versión de mysql 4.1.16, por lo que en este caso puede consultar esto:
SHOW TABLE STATUS FROM your_database LIKE ''your_table'';
Devolverá estas columnas:
| Name | Engine | Version | Row_format | Rows | Avg_row_length
| Data_length | Max_data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | Collation
| Checksum | Create_options | Comment |
Como puede ver, hay una columna llamada: " Update_time " que muestra la última hora de actualización para your_table .
Para obtener una lista de cambios recientes en la tabla, use esto:
SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
Si está ejecutando Linux, puede usar inotify para ver la tabla o el directorio de la base de datos. inotify está disponible en PHP, node.js, perl y sospecho que en la mayoría de los otros idiomas. Por supuesto, debe haber instalado inotify o su ISP lo instaló. Una gran cantidad de ISP no lo hará.
Simplemente tome la fecha del archivo modificada desde el sistema de archivos. En mi idioma eso es:
tbl_updated = file.update_time(
"C:/ProgramData/MySQL/MySQL Server 5.5/data/mydb/person.frm")
Salida:
1/25/2013 06:04:10 AM
En versiones posteriores de MySQL puede usar la base de datos information_schema
para informarle cuándo se actualizó otra tabla:
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = ''dbname''
AND TABLE_NAME = ''tabname''
Por supuesto, esto significa abrir una conexión a la base de datos.
Una opción alternativa sería "tocar" un archivo en particular cada vez que se actualice la tabla MySQL:
En las actualizaciones de bases de datos:
- Abra su archivo de marca de tiempo en el modo
O_RDRW
-
close
nuevo
o alternativamente
- use
touch()
, el equivalente de PHP de la funciónutimes()
, para cambiar la marca de tiempo del archivo.
En la pantalla de la página:
- use
stat()
para volver a leer la hora de modificación del archivo.