हमें SQL इंजेक्शन भेद्यताओं और एक खाली स्थिति का ध्यान रखना चाहिए । मैं नीचे के रूप में दोनों को संभालने जा रहा हूं।
एक शुद्ध संख्यात्मक सरणी के लिए, प्रत्येक तत्व पर intval
या floatval
उसके doubleval
ऊपर उचित प्रकार के रूपांतरण का उपयोग करें । mysqli_real_escape_string()
यदि आप चाहें तो स्ट्रिंग प्रकारों के लिए भी संख्यात्मक मूल्यों पर लागू किया जा सकता है। MySQL नंबरों के साथ-साथ डेट वेरिएंट को भी स्ट्रिंग की अनुमति देता है ।
क्वेरी से गुजरने से पहले मानों को उचित रूप से बाहर निकलने के लिए, इसके समान फ़ंक्शन बनाएं:
function escape($string)
{
// Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
return mysqli_real_escape_string($db, $string);
}
इस तरह के एक समारोह के लिए सबसे अधिक संभावना आपके आवेदन में पहले से ही उपलब्ध होगी, या हो सकता है कि आपने पहले ही एक बना लिया हो।
स्ट्रिंग सरणी को संचित करें जैसे:
$values = array_map('escape', $gallaries);
एक अंकीय सरणी का उपयोग कर स्वच्छ किया जा सकता है intval
या floatval
या doubleval
बजाय उपयुक्त के रूप में:
$values = array_map('intval', $gallaries);
फिर अंत में क्वेरी कंडीशन बनाएँ
$where = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
या
$where = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
चूंकि सरणी कभी-कभी खाली भी हो सकती है, $galleries = array();
इसलिए हमें ध्यान देना चाहिए कि IN ()
खाली सूची की अनुमति नहीं है। OR
इसके बजाय एक भी उपयोग कर सकते हैं , लेकिन समस्या बनी हुई है। तो उपरोक्त जाँच, count($values)
सुनिश्चित करना है।
और इसे अंतिम क्वेरी में जोड़ें:
$query = 'SELECT * FROM `galleries` WHERE ' . $where;
टीआईपी : यदि आप सभी पंक्तियों को छिपाने के बजाय खाली सरणी के मामले में सभी रिकॉर्ड (कोई फ़िल्टरिंग) नहीं दिखाना चाहते हैं, तो बस टर्नरी के झूठे हिस्से में 0 को 1 के साथ बदलें ।