ऐसा इसलिए है क्योंकि $pdo->errorInfo() अंतिम कथन को संदर्भित करता है जिसे सफलतापूर्वक निष्पादित किया गया था। चूंकि $sql->execute() झूठी वापसी करता है, तो यह उस कथन को संदर्भित नहीं कर सकता (या तो कुछ भी नहीं या पहले की क्वेरी के लिए)।
क्यों $sql->execute() झूठी वापसी, मुझे नहीं पता... या तो आपके $params . में कोई समस्या है सरणी या अपने डेटाबेस कनेक्शन के साथ।
नोट:PHP मैनुअल (https://php.net/manual/en/pdo .errorinfo.php
) ठीक से परिभाषित नहीं करता है कि "डेटाबेस हैंडल पर अंतिम ऑपरेशन" का क्या अर्थ है, लेकिन अगर बाध्यकारी मापदंडों के साथ कोई समस्या थी, तो वह त्रुटि पीडीओ के अंदर और डेटाबेस के साथ किसी भी बातचीत के बिना हुई होगी। यह कहना सुरक्षित है कि यदि $pdo->execute() true लौटाता है , वह $pdo->errorInfo() यह सही है। अगर $pdo->execute() रिटर्न false , $pdo->errorInfo() . का व्यवहार दस्तावेज़ीकरण से स्पष्ट रूप से स्पष्ट नहीं है। अगर मुझे अपने अनुभव से सही याद आता है, तो रिटर्न true execute निष्पादित करें , भले ही MySQL ने कोई त्रुटि लौटाई हो, false returns लौटाता है अगर कोई ऑपरेशन नहीं किया गया था। चूंकि दस्तावेज़ीकरण विशिष्ट नहीं है, यह डीबी ड्राइवर विशिष्ट हो सकता है।
यह उत्तर व्यावहारिक अनुभव को दर्शाता है जब इसे सितंबर 2012 में लिखा गया था। जैसा कि एक उपयोगकर्ता ने बताया है, दस्तावेज़ीकरण स्पष्ट रूप से इस व्याख्या की पुष्टि नहीं करता है। यह केवल विशेष डेटाबेस ड्राइवर कार्यान्वयन को भी प्रतिबिंबित कर सकता है, लेकिन यह हमेशा सत्य होना चाहिए कि यदि $pdo->execute() true लौटाता है , वह $pdo->errorInfo() मान्य है।
आप PDO::ERRMODE_EXCEPTION . भी सेट करना चाह सकते हैं आपके कनेक्ट अनुक्रम में। एक्सेप्शन हैंडलिंग त्रुटि को जांचना और क्वेरी करना अनावश्यक बनाता है।
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );