ここですべてのバインディングをバインドしていません
$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 );
:numRowsというバインディングを宣言しましたが、実際には何もバインドしていません。
2019年の更新:私はこれに賛成票を集め続けており、それは私に別の提案を思い出させました
二重引用符はPHPの文字列補間であるため、二重引用符の文字列で変数を使用する場合は、concat演算子を使用しても意味がありません。反対に、一重引用符は文字列補間ではないため、文字列の最後に1つの変数しかない場合は、意味があります。または、文字列全体に使用することもできます。
実際、インタプリタは変数の文字列の解析を気にしないため、ここで利用できるマイクロオペレーションがあります。ブーストはほとんど気付かれず、小規模では完全に無視できます。ただし、非常に大規模なアプリケーション、特に古き良きレガシーモノリスでは、このように文字列を使用すると、パフォーマンスが著しく向上する可能性があります。 (そしてIMO、とにかく読みやすいです)