Zde jste nesvázali všechny vazby
$sql = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM comments WHERE articleid = :art
ORDER BY " . mysqli_escape_string($order) . " LIMIT :numRows";
$st = $conn->prepare( $sql );
$st->bindValue( ":art", $art, PDO::PARAM_INT );
Deklarovali jste vazbu nazvanou :numRows, ale ve skutečnosti k ní nikdy nic nenavážete.
AKTUALIZACE 2019:Stále dostávám kladné hlasy a to mi připomnělo další návrh
Dvojité uvozovky jsou v PHP interpolace řetězců, takže pokud budete v řetězci dvojitých uvozovek používat proměnné, je zbytečné používat operátor concat. Na druhou stranu, jednoduché uvozovky nejsou řetězcovou interpolací, takže pokud máte na konci řetězce pouze jednu proměnnou, může to dávat smysl, nebo to prostě použít pro celý řetězec.
Ve skutečnosti je zde k dispozici mikro operace, protože interpret se nestará o analýzu řetězce pro proměnné. Posílení je téměř nepozorovatelné a v malém měřítku zcela ignorovatelné. Avšak ve velmi rozsáhlých aplikacích, zejména starých dobrých starších monolitech, může dojít ke znatelnému zvýšení výkonu, pokud jsou takto použity struny. (a IMO se to stejně čte snadněji)