Sí, es posible. Es un caso clásico de una condición de carrera.
La explicación rápida:
Existe la posibilidad de que 2 solicitudes simultáneamente pase la primera verificación, obtenga $num == 0
y ambos insertan una nueva fila.
Para eliminarlo necesitas crear un UNIQUE
restricción que cubre (user_id, ip, date)
columnas
La larga explicación: