Oui c'est possible. C'est un cas classique de condition de concurrence.
L'explication rapide :
Il y a une chance que 2 requêtes simultanément passez la première vérification, obtenez $num == 0
et les deux insèrent une nouvelle ligne.
Pour l'éliminer, vous devez créer un UNIQUE
contrainte qui couvre (user_id, ip, date)
colonnes
La longue explication :