इनपुट के संख्यात्मक होने के लिए आपको वास्तव में परीक्षण करने की आवश्यकता नहीं है, क्योंकि MySQL में, कोई भी स्ट्रिंग उदा। '123abc'
एक संख्यात्मक संदर्भ में (जैसे एक पूर्णांक कॉलम id
. से तुलना की जा रही है) ) परोक्ष रूप से केवल अंक लेता है और बाकी को अनदेखा करता है। एक गैर-संख्यात्मक स्ट्रिंग जैसे 'abc'
केवल पूर्णांक मान 0 है क्योंकि कोई प्रमुख अंक नहीं हैं।
मुद्दा यह है कि यदि आप क्वेरी पैरामीटर का उपयोग करते हैं तो मान SQL इंजेक्शन से सुरक्षित हैं। इनपुट $_SESSION या किसी अन्य स्रोत से आते हैं या नहीं, यह अप्रासंगिक है। SQL इंजेक्शन के संबंध में $_SESSION न तो सुरक्षित है और न ही असुरक्षित, इस तरह आप अपनी क्वेरी को डेटा पास करते हैं जो मायने रखता है।
मैं पैरामीटर प्लेसहोल्डर्स की सूची को प्रारूपित करने के लिए कोड को भी सरल बनाऊंगा:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
और bindParam() के बारे में भूल जाओ, बस सरणी को execute()
. पर पास करें ।
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
अपनी टिप्पणी दें:
पीडीओ में, आप :id
. जैसे किसी भी नामित पैरामीटर का उपयोग कर सकते हैं , या आप स्थितीय मापदंडों का उपयोग कर सकते हैं, जो हमेशा ?
. होते हैं (लेकिन किसी दिए गए प्रश्न में इन दो प्रकारों को न मिलाएं, एक या दूसरे का उपयोग करें)।
execute()
स्वचालित रूप से सरणी तत्वों को मापदंडों से बांधता है। एक साधारण सरणी (अर्थात पूर्णांकों द्वारा अनुक्रमित) स्थितीय मापदंडों से जुड़ना आसान है।
यदि आप नामित पैरामीटर का उपयोग करते हैं, तो आपको एक सहयोगी सरणी पास करनी होगी जहां सरणी की कुंजियां पैरामीटर नामों से मेल खाती हैं। सरणी कुंजियों को वैकल्पिक रूप से :
. के साथ उपसर्ग किया जा सकता है लेकिन इसकी आवश्यकता नहीं है।
यदि आप पीडीओ में नए हैं, तो यह वास्तव में दस्तावेज़ीकरण को पढ़ने के लिए भुगतान करता है। . कोड उदाहरण और सब कुछ हैं!