आपने यहां अपनी सभी बाइंडिंग नहीं बांधी हैं
$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 नाम से एक बाइंडिंग की घोषणा की है, लेकिन आप वास्तव में इससे कुछ भी नहीं बांधते हैं।
UPDATE 2019:मुझे इस पर वोट मिलते रहते हैं और इसने मुझे एक और सुझाव की याद दिला दी
डबल कोट्स PHP में स्ट्रिंग इंटरपोलेशन हैं, इसलिए यदि आप डबल कोट्स स्ट्रिंग में वेरिएबल्स का उपयोग करने जा रहे हैं, तो कॉन्सैट ऑपरेटर का उपयोग करना व्यर्थ है। दूसरी तरफ, सिंगल कोट्स स्ट्रिंग इंटरपोलेशन नहीं हैं, इसलिए यदि आपको स्ट्रिंग के अंत में केवल एक वेरिएबल की तरह मिल गया है तो यह समझ में आ सकता है, या केवल पूरे स्ट्रिंग के लिए इसका इस्तेमाल कर सकता है।
वास्तव में, यहां एक माइक्रो सेशन उपलब्ध है क्योंकि दुभाषिया चर के लिए स्ट्रिंग को पार्स करने की परवाह नहीं करता है। बढ़ावा लगभग ध्यान देने योग्य नहीं है और छोटे पैमाने पर पूरी तरह से अनदेखा किया जा सकता है। हालांकि, एक बहुत बड़े अनुप्रयोग में, विशेष रूप से अच्छे पुराने पुराने मोनोलिथ, यदि स्ट्रिंग्स का इस तरह उपयोग किया जाता है, तो प्रदर्शन में उल्लेखनीय वृद्धि हो सकती है। (और आईएमओ, वैसे भी पढ़ना आसान है)