2010-03-12 17 views
19

संक्षेप में, मेरे पास एक मान है कि मुझे अपने SQL क्वेरी में दो बार कॉल करना होगा। इस प्रकार, क्या बयान में समान नामित प्लेसहोल्डर का पुन: उपयोग करना संभव है। SELECT :Param FROM Table WHERE Column = :Param, फिर बस bindValue (": परम"), और दोनों के लिए मूल्य होना चाहिए: पैरा?पीडीओ पैरामीटरेटेड क्वेरी - प्लेसहोल्डर नामक पुन: उपयोग?

+0

आप इसे अभी क्यों नहीं देखते? पीडीओ :: तैयार करता है हां और पीडीओएसटेमेंट :: निष्पादित करता है कि आपको ड्राइवर पर निर्भर डीबी कर्सर को बंद करने की आवश्यकता हो सकती है। –

+0

मैं इसे करने की कोशिश की, मैं एक त्रुटि हो रही है, लेकिन मैं समझ मैं कुछ और गलत कर रहा था। दस्तावेज़ों में कुछ भी नहीं मिला (पीडीओ :: बिंदपाराम देख रहा था)। पीडीओ में :: हालांकि तैयार यह पाया जाता है, सही दिशा की ओर इशारा करते के लिए धन्यवाद! – gamers2000

+0

एफवाईआई - यह वास्तव में मेरे प्रश्न का भी उत्तर दिया। 1 अप आप – meteorainer

उत्तर

18

PDO::prepare कहा गया है कि "यदि आप एक तैयार बयान में दो बार एक ही नाम के एक नामित पैरामीटर मार्कर का उपयोग नहीं कर सकते हैं", इसलिए मुझे लगता है कि यह है कि एक तो कोई है।

+8

दस्तावेज़ पूरी तरह से सही नहीं हैं। यदि 'पीडीओ :: ATTR_EMULATE_PREPARES'' सत्य 'है, पीडीओ * करता है * नाम पैरामीटर मार्करों का पुन: उपयोग करने का समर्थन करता है। – Mike

+2

ऐसा लगता है कि किसी ने दस्तावेज़ अपडेट किए हैं। अब यह कहता है "जब तक इम्यूलेशन मोड चालू नहीं होता है, तब तक आप एक ही नाम के नामित पैरामीटर मार्कर का उपयोग एक ही वक्त में नहीं कर सकते हैं।" – Mike

+1

आप आंशिक रूप से सही हैं। हालांकि 'चयन करें: परम' असंभव है, क्योंकि आप टेबल/कॉलम को बाध्य नहीं कर सकते हैं। Http://stackoverflow.com/q/182287/ देखें –

1

पुन: उपयोग के अलावा, यहां मुख्य मुद्दा यह है कि आप गतिशील रूप से कॉल नामों को बदलने की कोशिश कर रहे हैं।

इस उत्तर एक अनाम उपयोगकर्ता द्वारा http://php.net/manual/en/pdo.prepare.php पर पोस्ट:

सोच क्यों चारों ओर एक प्लेसहोल्डर, गलत है के उद्धरण को जोड़ने और तुम क्यों तालिका या स्तंभ नाम के लिए प्लेसहोल्डर उपयोग नहीं कर सकते उन करने के लिए

:

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

योजना "My_table से नाम चुनें जहां आईडी =: मूल्य" के लिए ": मूल्य", लेकिन मालूम होता है समान ही जो कुछ भी आप के लिए स्थानापन्न हो जाएगा "से नाम चुनें: तालिका कहां आईडी =: मूल्य" नहीं कर सकते योजना बनाई जाए, क्योंकि डीबीएमएस को पता नहीं है कि आप वास्तव में किस तालिका से चयन कर रहे हैं।

यहां तक ​​कि जब का उपयोग कर "नकल करते तैयार करता है", पीडीओ आप कहीं भी प्लेसहोल्डर का उपयोग करें, क्योंकि इस पर काम करने के लिए होगा जाने नहीं दे सकता कि तुम क्या मतलब: करता है "का चयन करें: से some_table foo" ": foo" होने जा रहा है मतलब कॉलम संदर्भ, या एक शाब्दिक स्ट्रिंग?

जब आपकी क्वेरी गतिशील कॉलम संदर्भ का उपयोग कर रही है, तो आपको तालिका में मौजूद कॉलम को स्पष्ट रूप से सफेद-सूचीबद्ध करना चाहिए, उदा। डिफॉल्ट में फेंक दिए गए अपवाद के साथ एक स्विच स्टेटमेंट का उपयोग करना: खंड।

1

यदि आप PDO::ATTR_EMULATE_PREPARES = true सेट करते हैं तो आप कर सकते हैं।

उदा। $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

यदि आप लार्वेल का उपयोग कर रहे हैं तो आप इसे में options सरणी में सेट कर सकते हैं। जैसे PDO::ATTR_EMULATE_PREPARES => true

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