आप एक कथन बनाने और एक परम बाध्य करने का प्रयास कर रहे हैं।
कथन बहुत अच्छा है क्योंकि यह संभावित रूप से किसी भी प्रकार के SQL इंजेक्शन को समाप्त कर देता है। और यह केवल एक स्ट्रिंग के रूप में देखी जा रही क्वेरी की अवधारणा को हटाकर करता है। SQL क्वेरी को एक पैरामीटर सूची के साथ एक स्ट्रिंग के रूप में देखा जाता है और एक संबद्ध डेटा को बाइंडेड चर के रूप में देखा जाता है। इसलिए क्वेरी केवल टेक्स्ट नहीं है, बल्कि टेक्स्ट + डेटा है।
मेरा मतलब है:
यह सरल प्रश्न:
SELECT * FROM A WHERE val="$param"
यह सुरक्षित नहीं है क्योंकि क्वेरी को केवल एक स्ट्रिंग के रूप में देखा जाता है। और अगर $param चेक नहीं किया गया है, तो यह SQLi होल है।
लेकिन जब कोई स्टेटमेंट बनाते हैं, तो आपकी क्वेरी बन जाती है:
SELECT * FROM A WHERE val=:param
फिर आप मान को निर्दिष्ट करने के लिए बाइंडपरम का उपयोग करते हैं:परम। जिसका अर्थ है कि मान क्वेरी स्ट्रिंग में संलग्न नहीं है, लेकिन क्वेरी पहले से ही पार्स की गई है और डेटा प्रदान किया गया है।
आपके मामले में, आप परम से जुड़ते हैं:सरणी एक अंतर्निहित सरणी (मुझे लगता है कि "डेटा 1", "डेटा 2", आदि ..) जो केवल एक पैरामीटर है जिसका मान एक स्ट्रिंग ("data1, data2, data3...") के रूप में है, इसलिए इसका परिणाम केवल एक इंसर्ट होगा, न कि कई इंसर्शन।
आप अपने सरणी को संभालने के लिए पर्याप्त पैरामीटर के साथ एक क्वेरी उत्पन्न करके अपनी कथन पीढ़ी को बदल सकते हैं
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
फिर अपने सरणी पर लूप करें और प्रत्येक पैरामीटर के लिए बाइंडपरम विधि को कॉल करें।
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
यह काम करेगा।
संपादित करें :यह समाधान दिखाता है कि यह एक आयामी सरणी के लिए कैसे काम करता है, लेकिन स्टेटमेंट क्वेरी जेनरेशन को ट्वीव करके और बाइंडपरम लूप को संशोधित करके आपकी समस्या को आसानी से बढ़ाया जा सकता है।
आपका बयान इस तरह दिखना चाहिए:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
आपको बस अपने बेस ऐरे में एलीमेंट की संख्या गिननी है।