2012-11-15 6 views
5

कोड उदाहरण;पता लगाएं कि पीडीओ-> निष्पादित एक पंक्ति/रिकॉर्ड देता है?

$stmt = $db->prepare('SELECT u.username, u.display_name FROM users u WHERE u.id = :userId'); 
$stmt->bindValue(':userId', 10); 
$stmt->execute(); 

तैयार करना -> निष्पादित करना। यदि आप सुनिश्चित हैं कि क्वेरी अधिकतम 1 पंक्ति लौटाएगी; क्या यह देखने का एक आसान तरीका है कि क्वेरी ने एक पंक्ति वापस कर दी है? मैं हर किसी को 'rowCount' पर मान्य मानता हूं, लेकिन क्या कोई क्लीनर तरीका नहीं है?

यह आलेख: http://www.christiansouth.com/php/pdo-getting-started-part-2-pdostatement/ राज्य;

सत्य अगर क्वेरी सफल हुई तो गलत था अगर यह नहीं था। यहां स्टम्बल है यदि SQL में कोई त्रुटि है तो यह केवल FALSE को वापस कर देगा। तो यदि SQL मान्य है लेकिन कोई पंक्ति नहीं लौटाता है तो आपको अभी भी एक वास्तविक वापसी मूल्य मिलेगा।

क्या यह कथन सही है? क्योंकि php.net केवल इसके बारे में बात करता है:

विफलता पर सफलता या गलत पर सत्य लौटाता है।

तो, फिर से सवालों के ऊपर रैपिंग:

  • यह सच आप मान्य नहीं कर सकता है, तो एक पंक्ति एक बूलियन के रूप में $ stmt (उपरोक्त उदाहरण में) का उपयोग कर वापस आ गया था है?
  • क्या इसका कोई समाधान है जो क्लीनर दिखता है तो 'rowCount' अगर किसी में रैप किया गया है?

उत्तर

5

परिणाम-सेट (यानी fetch) का उपयोग करें: क्या कोई पंक्ति थी या नहीं?

एक परिणाम सेट 0 रिकॉर्ड के साथ अभी भी "यह काम किया" के मामले में पूरी तरह से वैध है और क्यों सही हर वैध क्वेरी execute 'एड पर दिया जाता है है। इस मामले में FALSE को केवल अपवाद स्थिति के रूप में माना जाना चाहिए।

दूसरी ओर, परिणाम (पहले) fetch से परिणाम - ज्ञान के साथ संयुक्त है कि क्वेरी केवल 0..1 पंक्तियों को वापस कर देगी - यह निर्धारित करने के लिए उपयोग किया जा सकता है कि एक पंक्ति प्राप्त हुई थी या नहीं। चूंकि यह ऐसी क्वेरी के लिए डेटा तक पहुंचने का "मानक" तरीका है, इसलिए अतिरिक्त जांच करने की कोई आवश्यकता नहीं है।

+0

तो मैं $ उपयोग कर सकते हैं परिणाम = $ stmt-> लाने (पीडीओ :: FETCH_ASSOC); अगर ($ परिणाम) // एक पंक्ति मिली; ? – user1178560

+0

एक खाली परिणाम सेट से प्राप्त करना एक त्रुटि वापस करने जा रहा है। मुझे अभी भी यह नहीं दिख रहा है कि आप ऐसा क्यों करना चाहते हैं, जब आपके पास पंक्ति गणना() – gview

+0

@gview से $ stmt ऑब्जेक्ट में आपके लिए उपलब्ध पंक्ति है, तो खाली परिणाम सेट पर 'fetch' का * परिणाम * क्या है ? (संकेत: यह 'गलत' है।) यह एक खाली परिणाम सेट पर 'execute' के परिणाम से एक * अलग * मुद्दा है (जो वैध क्वेरी होने पर' TRUE' है)! यह विशेष मुद्दा यह जानने के बारे में नहीं है कि सामान्य अर्थ में कितने परिणाम लौटाए गए थे - इस * विशेष क्वेरी/उपयोग * के लिए परिणाम-सेट को 0..1 रिकॉर्ड वापस करने के लिए डिज़ाइन किया गया है (यह एकल कुंजी के साथ एक गैर-जॉइन क्वेरी है चयन)। अब, शायद यह तर्क दिया जा सकता है कि कोड को "सबसे अधिक * एक रिकॉर्ड वापस लौटाया जाना चाहिए", लेकिन .. मैं बस वहां छोड़ दूंगा। –

1

जब तक आप mysql के साथ काम कर रहे हैं, पंक्ति गणना आपको एक और क्वेरी किए बिना परिणाम सेट में संख्या प्रदान करेगी। अन्य डेटाबेस पंक्ति गणना का सही समर्थन नहीं कर सकते हैं, इसलिए आपको पहले एक अलग चयन गिनती (*) ... क्वेरी करना होगा।

चाहे आप निष्पादन पर केवल सत्य या गलत हो जाएं, यह बिल्कुल सही होने वाला है, यहां तक ​​कि उन पंक्तियों के लिए भी जो कोई पंक्ति नहीं लौटाते हैं। ऐसा इसलिए है क्योंकि संबंध सिद्धांत में, एक खाली परिणाम सेट पूरी तरह से मान्य है, और कोई पंक्तियों के साथ चयन कोई त्रुटि नहीं है।

-3

निष्पादन() का उपयोग करें;

पीएचपी मैनुअल से:

पीडीओ :: कार्यकारी() पंक्तियों को संशोधित या SQL विवरण आप जारी द्वारा नष्ट कर दिया गया की संख्या देता है। यदि कोई पंक्ति प्रभावित नहीं हुई है, तो पीडीओ :: exec() 0 देता है।

http://php.net/manual/en/pdo.exec.php

+0

अक्सर प्रश्न पढ़ने के लायक है , आप ध्यान दें। –

+0

मुझे लगता है कि यह इस सवाल का जवाब देता है: "क्या इसका कोई समाधान है जो क्लीनर दिखता है तो 'पंक्ति गणना' अगर एक में रैप हो जाती है?" – user2802726

+0

आपको गलत महसूस हो रहा है। इसके अलावा, आप निष्पादन() निष्पादित() के साथ निष्पादित नहीं कर सकते हैं। स्पष्ट रूप से, आपको पहले से ही उत्तर दिए गए सवालों के जवाब देने के लिए थोड़ा और अनुभव चाहिए। –

संबंधित मुद्दे