2010-11-23 5 views
9

मेरे मन में, निम्न स्क्रिप्ट काम करना चाहिए:आप तैयार पीडीओ स्टेटमेंट में MYSQL फ़ंक्शन क्यों पास नहीं कर सकते?

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = ?"); 
$stmt->execute(array(1, 'NOW()')); 

लेकिन जब तैयार बयान में NOW() गुजर, कुछ नहीं होता। वास्तविक तिथि (यानी 2010-11-23) के साथ NOW() को प्रतिस्थापित करना ठीक काम करता है।

मैं स्पष्टीकरण ऑनलाइन खोजने में असमर्थ हूँ। कोई विचार?

संपादित

बस आगे स्पष्ट करने के लिए और प्रश्न में किसी भी भ्रम से छुटकारा, मैं वास्तव में तैयार बयान हालांकि, चर के लिए पांच संभावित तिथि/समय कार्यों में से एक पर सेट हो जाएगा में एक चर पास करना चाहते हैं माई एसक्यूएल।

उदा

$ var = 'NOW()';

$ var = 'LAST_DAY (DATE_ADD (CURDATE(), इंटरवल 1 महीने));

$ var = 'LAST_DAY (CURDATE())';

$stmt->execute(array(1, $var)); 

मैं जानता हूँ कि यह एक ही शून्य परिणाम देंगी, लेकिन मैं चिंतित हूँ कि अगर मैं बस बदलने के लिए:

... और इतने पर ...

तैयार बयान में बदल जाता है एसक्यूएल बयान करने के लिए:

अद्यतन तालिका सेट स्थिति =, DATE_MODIFIED = $ वर

? 10

मैं अपने आप को इंजेक्शन के लिए खोलने रहा हूँ?

+2

तैयार बयान आदेशों और डेटा के लिए ** जुदाई उपयोग किया जाता है **। और आप उस अलगाव को पूर्ववत नहीं कर सकते हैं और SQL कथन के रूप में व्याख्या किए गए डेटा प्राप्त कर सकते हैं। – mario

उत्तर

13

आपको पैरामीटर के रूप में NOW() पास करने की आवश्यकता नहीं है क्योंकि इसे किसी भी प्रोसेसिंग की आवश्यकता नहीं है, क्योंकि यह SQL फ़ंक्शन में बनाया गया है, इसलिए इसे नीचे की वास्तविक क्वेरी में शामिल करें।

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = NOW()"); 

वैकल्पिक रूप से, तुम सिर्फ एक टाइमस्टैम्प क्षेत्र के लिए date_modified सेट कर सकते हैं और यह अपने आप पर एक एसक्यूएल अद्यतन date_modified फ़ील्ड अपडेट होगा।

+0

@ ब्रैड - धन्यवाद, मेरे पास पहले से ही डेटाबेस में एक और टाइमस्टैम्प फ़ील्ड है और वास्तविक कॉल अब एक से अधिक है() लेकिन मैं स्पष्ट रूप से – JM4

+0

को संशोधित करने के लिए संशोधित करूंगा - मैं एक मान $ चर पारित कर रहा हूं क्योंकि फ़ंक्शन पूरी तरह से बदल सकता है तो मैं अभी भी सोच रहा हूं कि इंजेक्शन के लिए "मामला" हो सकता है? – JM4

+0

फिर आपने वह कोड क्यों पोस्ट किया? आप वास्तविक कोड पोस्ट करना चाहिए इस्तेमाल किया जा रहा है, अगर आप इसे एक चर गुजर रहे हैं, तो वास्तविक चर का उपयोग कर रहे दिखाने (या के रूप में 'इसके बारे में कम से कम उदाहरण पर NOW()' कभी काम नहीं करेगा की तरह तुम्हारे पास है), आप कैसे हैं आपके द्वारा पोस्ट किए गए परिदृश्य में 'अब() 'का उपयोग करने से कोई अर्थ नहीं आता है। –

0

मेरा अनुमान है कि पीडीओ '() अब' मानते हुए है एक स्ट्रिंग है और उद्धरण में यह enclosing जब क्वेरी पैरामीटर पॉप्युलेट है। मैं केवल PHP फ़ंक्शन दिनांक ('वाई-एम-डी') का उपयोग कर वर्तमान दिनांक पास कर दूंगा, जो आपको एक ही परिणाम देगा।

+0

दरअसल, ब्रैड का जवाब बेहतर है, अब मैं इसे पढ़ रहा हूं। –

7

तैयार बयानों सब कुछ आप एक शाब्दिक स्ट्रिंग के रूप में उन्हें में डालने की व्याख्या। यह किसी भी प्रकार के अप्रत्याशित एसक्यूएल इंजेक्शन को रोकने के लिए है।

वास्तव में क्या हो रहा है यह है कि NOW() डेटाबेस में डालने का प्रयास कर रहा है, जैसा कि यह वास्तविक तिथि प्राप्त करने के बजाय (सचमुच, NOW()) पढ़ता है। यह तब संभवतः आपके डेटाबेस में खाली दिख रहा है क्योंकि आपके पास डेट कॉलम है, जो दिनांक के रूप में NOW() की व्याख्या नहीं करता है और इसलिए इसे स्वीकार नहीं करता है।

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

+0

धन्यवाद, नीचे दी गई मेरी टिप्पणी नीचे देखें । चर मैं कर रहा हूँ 'वास्तव में' पासिंग को बदल सकते हैं और अभी भी? – JM4

+0

इंजेक्शन के लिए अतिसंवेदनशील हो सकता है आपके '$ var' के सभी एक को महत्व देता है तो आपके भीतर PHP स्क्रिप्ट सेट करें और कोई बाहरी स्रोत नहीं, तो आपको किसी भी प्रकार के इंजेक्शन के बारे में चिंता करने की ज़रूरत नहीं है। –

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