Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Leguim

#51
Gracias por la ayuda a los 2!

Estuve viendo eso de CRON JOBS y parece algo sencillo por lo menos para configurar en un hosting, voy a decirles todo lo que entendí haber si estoy en el camino correcto  :xD. Además tengo una nueva duda con otra cosita de esto de los CRON JOBS que más abajo la digo.

Los CRON JOBS sirven para ejecutar código/instrucciones regularmente cada X tiempo, básicamente eso. Ahora para configurar uno (en un hosting) en general es un formulario donde se ingresa cada x tiempo debe de ser ejecutado. Estoy pensando y puede ser cada 1 Minuto.

Luego se debe ingresar la ruta del archivo (en este caso PHP) que contendrá el algoritmo o las instrucciones, lo que quiere decir que debería crear un archivo .php que se llame por ejemplo "cron_jobs.php y que ahí estarán esas funciones php "x::Marcar_Desconectados();", etcétera.

Mis dudas nuevas serían:

cron_jobs.php
Código (php) [Seleccionar]

// Llamo a las librerías que use
// [...]

x::Marcar_Desconectados(); // marca los desconectados
x::Desbloquear_Usuarios(); // desbloquea usuarios que tenían un bloqueo temporal
x::Eliminar_Registros_Antiguos(); // elimina registros ya muy viejos que son innecesarios
x::Otra_Cosa(); // básicamente cualquier otra función que haga cosas similares...


Tener eso, ¿está bien? ¿o debería crear un archivo .php para cada función y configurar varias tareas cron?

Se me ocurría hacer mejor si fuera posible, $_GET['name_function'] y si es === ejecuta una, o ejecuta otra. Entonces la ruta sería... /public_html/blah/blah/cron_jobs.php?name_function=Marcar_Desconectados

y así para los demás cron jobs que vaya configurando por separado.

Y la última duda...
si una persona ingresa por ejemplo a cron_jobs.php ¿No ejecutará también? Estoy hablando de un ingreso como por ejemplo en lugar de irse a index.php se van a cron_jobs.php

No sé si me di a entender con esa ultima pregunta.

#52
Hola,

No sabía donde era mejor este tema, si en la sección base de datos o en esta sección de PHP.
Estoy no teniendo problemas pero sí dudas, hasta ahora todo este sistema funciona excelente. Lo que me permite hacer es lo siguiente, desbloquear usuarios que fueron bloqueados de forma temporal hasta x fecha, marcar como desconectados usuarios que ya no hicieron acciones en la aplicación por un periodo de x minutos, eliminar algunos registros de x tabla que ya son demasiado viejos, etc.

Mi función para marcar como desconectados a usuarios que no hicieron acciones por x periodo de minutos por lo que se los considera desconectados:
Código (php) [Seleccionar]

static function Marcar_Desconectados()
{
$unix_grace = strtotime('-x minutes', time());
$con = Conectar_BD(nombre_usuario, contrasena);
$query = $con->prepare('UPDATE users SET connected = 0 WHERE connected = 1 AND :unix_grace >= unix_activity');
$query->bindValue(':unix_grace', $unix_grace, PDO::PARAM_INT);
$query->execute();
}


Cada vez que se realice una petición al servidor, se envía un formulario, se carga una página (por ejemplo se ingresa a index.php), se ejecuta un código php con ajax, etc.. se va a ejecutar la funcion..

Código (php) [Seleccionar]

x::Marcar_Desconectados();


Realmente no sé si es óptimo considerando muchos usuarios en esta aplicación web. Aunque si eventualmente no hay usuarios que marcar como desconectados, no hay registros viejos que eliminar, no hay usuarios bloqueados temporalmente que desbloquear, es decir ejecutaría estas consultas pero no modificaría nada ni haría ninguna accion DELETE, UPDATE, etcétera.

Aunque estaría haciendo las consultas igual, por eso no estoy seguro.
#53
Básicamente tengo una tabla en mi base de datos que almacenará todas las notificaciones que pudiera llegar a tener cada usuario.
Se me ocurrió una idea para optimizar esta tabla en específico que sería que al llegar a las 1.000 notificaciones ya no pueda seguir almacenando más por lo menos para ese usuario.

Quiero decir, tengo 1.000 notificaciones y cuando se agregue una nueva notificación se va a eliminar la más vieja. Seguiremos con 1.000 notificaciones, independientemente si estén vistas o no.

Personalmente me parece un poco exagerado 1.000 registros, yo haría 300 o 150. ¿Qué opinan?
#54
Es algo trivial pero estoy teniendo problemas, no encuentro una función para saber si es ENTERO o FLOTANTE un número.
Estuve viendo pero no la encuentro, ya sé que existe is_int e is_float pero quiero que sea como is_numeric.

Quiero decir, is_numeric si le das como valor '3500' (cadena pero con numero dentro) devolverá true pero si pongo is_float('3500.78') esto me va a dar false porque no interpreta el numero que está en la cadena. Lo mismo pasa si fuera is_int('3500').

Pasa que como ya sabrán todo los datos que envía un formulario los devuelve en cadena.
¿No hay una función para eso?

EDIT:
Se me ocurrió algo "cutre" por así decirlo, y es que podría preguntar si dicha cadena tiene punto y si tiene punto quiere decir que en principio es un decimal entonces uso floatval('x');

IS_NUMERIC(x)
      TIENE_PUNTO(x)
             FLOATVAL(x)
      NO TIENE PUNTO
             INTVAL(x)

Por ahora tengo esto.
#55
No creo que te hayas equivocado, esa consulta de los LIMIT :x, :y no funciona a no ser que concatene LIMIT '.($x).', '.($y)

No sé si se podría arreglar esta vulnerabilidad de inyecciones para estas variables que quedarán concatenadas, con alguna función para "limpiar". Para este caso puedo decir si es numerico x e y pero ya cuando la variable es una cadena se complica.
#56
Entonces tampoco se puede parametrizar los limites en una consulta, no?

Código (php) [Seleccionar]

"... ORDER BY id_x DESC LIMIT :start, :quantity"


donde start es 0, y quantity es 10.
#57
Estoy mejorando todas mis consultas, antes usaba este método:

Código anterior (siempre use esto y funciona correctamente), como "dato curioso" en esta consulta sino concateno '.($by).' no me devuelve datos, es decir que no puedo usar :by en la consulta. No entiendo por qué (si me pudieran ayudar con eso también)
Código (php) [Seleccionar]

$con = Connection(USERNAME, PASSWORD);
$query = $con->prepare('SELECT id_album FROM albums WHERE '.($by).' = :by_value');
$query->execute(array(':by_value' => $by_value));
$results = $query->fetchAll();


Pero viendo un poco parece ser que hacerlo de la siguiente manera es más eficiente y seguro:
Pero me dice "Uncaught Error: Call to a member function bindParam() on bool" busqué el error pero veo ninguna relación con lo que escribí, lo ví varias veces pero parece que todo está correcto.
Código (php) [Seleccionar]

$con = Connection(USERNAME, PASSWORD);
$query = $con->prepare('SELECT id_album FROM albums WHERE :by = :by_value');
$query = $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$query->bindParam(':by', $by);
$query->bindParam(':by_value', $by_value);
$query->execute();
$results = $query->fetchAll();
#58
Hola,

bueno la anterior consulta ya la hace correctamente ahora tengo problemas con esta otra que es muy similar. Para este caso ya no va a eliminar las tentativas de un usuario si este llego a 6 sino que las va a eliminar si son 1 o 5 tentativas pero las eliminará si la fecha (unix) de creación tiene una antiguedad de 12 horas o más. (pero solo se evalua la más reciente)

Es decir, como son los unix no son mas que numeros enteros lo que hago para evaluar la mas reciente y ver si tiene esa antiguedad de 12 horas es tomar dentro de todos los registros/tentativas del usuario el unix mas grande.

Es decir:
Código (php) [Seleccionar]

$query = $con->prepare('DELETE FROM attempts WHERE id_user IN (SELECT A.id_user, MAX(A.unix_date) FROM attempts A INNER JOIN users U ON A.id_user = U.id_user WHERE (:unix_grace_delete_attempts >= MAX(A.unix_date)) AND U.login_banned = 0 GROUP BY A.id_user HAVING COUNT(*) >= 1 AND COUNT(*) <= 5');
$query->execute(array(':unix_grace_delete_attempts' => $unix_grace_delete_attempts));


Siempre uso BETWEEN en vez de hacer COUNT(*) >= 1 AND COUNT(*) <= 5 pero mientras mas simple de entender la consulta mejor para todos.

En relación a sobre qué es $unix_grace_delete_attempts lo que le estoy haciendo es restarle a el unix actual unas 12 horas.

Código (php) [Seleccionar]

$unix_now = time();
$unix_grace_delete_attempts = strtotime('-12 hours', $unix_now);
#59
Nop, sigue igual sin hacer nada

Si ya pongo alias e Inner JOIN ya no funciona pero si lo dejo tal cual si pero estoy en la nada porque necesito hacerlo así...


Solucionado:
Ya logré hacer que funcione,

Código (php) [Seleccionar]

"DELETE FROM attempts WHERE id_user IN (SELECT A.id_user FROM attempts A INNER JOIN users U ON A.id_user = U.id_user WHERE U.login_banned = 0 GROUP BY A.id_user HAVING COUNT(*) >= 6)"
#60
Hola,

Me sigue sin funcionar, ya estuve revisando varias veces la consulta pero no encuentro fallos.