Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक अंतर्निहित सरणी को एक MySQL तैयार कथन में बाध्य करने में समस्या

मैं आपको कुछ परेशानी से बचाता हूं और आपको बताता हूं कि आप जो करने की कोशिश कर रहे हैं वह वैसे भी काम नहीं करेगा। आप केवल एक पैरामीटर को अपने IN() . से बाइंड कर रहे हैं फ़ंक्शन कॉल। आप सोचते हैं आप अल्पविराम से अलग की गई सूची पास कर रहे हैं लेकिन आप वास्तव में केवल एक अल्पविराम से अलग की गई स्ट्रिंग पास कर रहे हैं जिसे एक मान के रूप में माना जाता है . इसका मतलब है कि आप एक रिकॉर्ड के लिए खोज करेंगे "'[email protected] के मान के साथ ', '[email protected] "[email protected] से मेल खाने वाले रिकॉर्ड के बजाय '" " या "[email protected] ".

इसे दूर करने के लिए आपको यह करना होगा:

  1. गतिशील रूप से अपने प्रकार की स्ट्रिंग जेनरेट करें
  2. उपयोग 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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Amazon RDS पर mysqladmin फ्लश-होस्ट कैसे चलाएं

  2. कैसे लार्वेल में एक mysql संग्रहीत कार्यविधि से सेट एकाधिक परिणाम लाने के लिए?

  3. MySQL:दिनांक के साथ बाधा की जाँच करें

  4. वर्डप्रेस कस्टम टेबल या कस्टम पोस्ट प्रकार?

  5. कॉलम नाम के साथ LIKE का उपयोग कैसे करें