Я не уверен, что является причиной проблемы. Видимо, есть что-то, что лишает HTML-теги своего рода безопасность. Одно из предложений - попытаться заменить символы «<» и «>» их кодами ASCII:
$sql .= 'fromdate '.chr(60).'= expirydate and expirydate '.chr(62).'= curdate() order by rand()';
редактировать:
Вы также можете использовать оператор NOT BETWEEN, как показано ниже:
$sql .= '(expirydate NOT BETWEEN fromdate AND curdate()) AND (expirydate NOT BETWEEN fromdate AND 17530101) ORDER BY rand()
Предполагается, что значение 17530101 является наименьшим возможным значением для даты и времени. В предыдущем коде вы проверяли, находится ли значение expirydate между fromdate и curdate () И expirydate не меньше, чем любой из них. Это означает, что значение expirydate должно быть больше, чем fromdate, curdate для оператора, возвращающего true, чего вы и пытаетесь достичь.