UTC_TIMESTAMP() order by id desc limit 1', (string) $userId ); if (!$row || !isset($row['email_verifications'])) { return null; } return $row['email_verifications']; } public static function findById(int $id): ?array { $row = DB::selectOne( 'select id, user_id, code_hash, expires_at, attempts, used_at from email_verifications where id = ? limit 1', (string) $id ); if (!$row || !isset($row['email_verifications'])) { return null; } return $row['email_verifications']; } public static function incrementAttempts(int $id): bool { $result = DB::update( 'update email_verifications set attempts = attempts + 1 where id = ?', (string) $id ); return $result !== false; } public static function markUsed(int $id): bool { $result = DB::update( 'update email_verifications set used_at = NOW() where id = ?', (string) $id ); return $result !== false; } }