मैं आपको कुछ परेशानी से बचाता हूं और आपको बताता हूं कि आप जो करने की कोशिश कर रहे हैं वह वैसे भी काम नहीं करेगा। आप केवल एक पैरामीटर को अपने IN()
. से बाइंड कर रहे हैं फ़ंक्शन कॉल। आप सोचते हैं आप अल्पविराम से अलग की गई सूची पास कर रहे हैं लेकिन आप वास्तव में केवल एक अल्पविराम से अलग की गई स्ट्रिंग पास कर रहे हैं जिसे एक मान के रूप में माना जाता है . इसका मतलब है कि आप एक रिकॉर्ड के लिए खोज करेंगे "'[email protected]
के मान के साथ ', '[email protected]
"[email protected]
से मेल खाने वाले रिकॉर्ड के बजाय '" " या "[email protected]
".
इसे दूर करने के लिए आपको यह करना होगा:
- गतिशील रूप से अपने प्रकार की स्ट्रिंग जेनरेट करें
- उपयोग
call_user_func_array()
अपने मापदंडों को बाँधने के लिए
आप टाइप स्ट्रिंग को इस तरह जेनरेट कर सकते हैं:
$types = str_repeat('s', count($selected));
यह सब s
. की एक स्ट्रिंग बना देता है यह उतने ही वर्ण हैं जितने कि सरणी में तत्वों की संख्या।
फिर आप call_user_func_array()
. का उपयोग करके अपने पैरामीटर्स को बाइंड करेंगे इस तरह (ध्यान दें कि मैंने IN()
. के लिए कोष्ठक वापस रखा है समारोह):
if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));
लेकिन अगर आप इसे आजमाते हैं तो आपको mysqli_stmt::bind_param()
के बारे में एक त्रुटि मिलेगी पैरामीटर दो को संदर्भ द्वारा पारित किए जाने की अपेक्षा:
यह एक तरह से कष्टप्रद है लेकिन काम करने में काफी आसान है। इसके समाधान के लिए आप निम्न फ़ंक्शन का उपयोग कर सकते हैं:
function refValues($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
यह केवल मानों की एक सरणी बनाता है जो $selected
. में मानों के संदर्भ में हैं सरणी। यह mysqli_stmt::bind_param()
बनाने के लिए काफी है खुश:
if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
call_user_func_array(array($stmt, "bind_param"), array_merge($types, refValues($selected)));
संपादित करें
PHP 5.6 के रूप में अब आप ...
. का उपयोग कर सकते हैं इसे और भी आसान बनाने के लिए ऑपरेटर:
$stmt->bind_param($types, ...$selected);