2009-04-21 16 views
12

के साथ इन खंडों का उपयोग कैसे करते हैं मैं तैयार कथन का उपयोग कर नए एमएसक्ली इंटरफेस पर कुछ पुराना कोड ले जा रहा हूं, मुझे आईएन क्लॉज युक्त एसक्यूएल स्टेटमेंट्स में परेशानी हो रही है। मैं सिर्फ सामान्य रूप से इस करना होगा:आप mysqli तैयार कथन

$ids = '123,535,345,567,878' 
$sql = "SELECT * FROM table WHERE id IN ($ids)"; 
$res = mysql_query($sql); 

इस mysqli में कनवर्ट कर रहा है और तैयार बयान मैं समाधान के एक नंबर की कोशिश की है:

$ids = '123,535,345,567,878' 
$ids = implode($ids,','); 
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?)); 
$result->bind_param("i", $ids); 
$result->execute(); 

ऊपर विफल रहता है और सरणी और फेरबदल में तत्वों की संख्या की गणना एसक्यूएल स्ट्रिंग में प्रश्न चिह्नों की संख्या और सरणी में प्रत्येक तत्व के लिए bind_parm को कॉल करने में विफल रहता है। बस अल्पविराम से अलग स्ट्रिंग का उपयोग करने में विफल रहता है।

मुझे इस पर Google में कोई अच्छा दस्तावेज़ नहीं मिल रहा है, तो आपने समस्या को हल कैसे किया है?

+0

[? खंड विकल्प में PreparedStatement] की संभावित डुप्लिकेट (https://stackoverflow.com/questions/178479/preparedstatement -इन-क्लॉज-विकल्प) – bfavaretto

उत्तर

6

देखो:

  • साथ एसक्यूएल स्ट्रिंग बनाने के लिए:

    I have an array of integers, how do I use each one in a mysql query (in php)?

    यह करने पर निर्भर करता प्रश्न संख्या

  • call_user_func_array() का उपयोग अपनी स्ट्रिंग को क्वेरी स्ट्रिंग
पर बाध्य करने के लिए करें
+0

all_user_func_array() चाल धन्यवाद –

9

परिवर्तनीय लंबाई की एक पंक्ति को एक बाध्य चर में बांधना संभव नहीं है।

इसी प्रकार, यदि आप स्ट्रिंग बाध्य करने के लिए $ids आप वास्तव में के साथ पहुंच जाएंगे थे:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878') 

(नोट ID की सूची के आसपास उद्धरण)।

प्रश्न संख्या और बाध्य पैरामीटर की सही संख्या के साथ अपनी स्वयं की क्वेरी बनाना वास्तव में काम करना चाहिए - आपको इसे फिर से प्रयास करने और वास्तविक त्रुटि पर रिपोर्ट करने की आवश्यकता हो सकती है।

वैकल्पिक रूप से, यह उन अवसरों में से एक हो सकता है जहां दुर्भाग्य से आपके स्वयं के एसक्यूएल को हस्तशिल्प करना और बाध्य पैरामीटर का उपयोग नहीं करना आवश्यक है।

एक ऐसी ही सवाल है कि पहले (दूसरा कोड नमूना) यहाँ कहा गया है के जवाब में
-1

मैंने सोचा तैयार बयान की बात को इस स्थिति में तो था तुम सिर्फ कर सकता है:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'"); 
foreach ($usernames as $username) 
{ 
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username); 
    $stmt->execute(); 
} 
$stmt->close(); 
+0

आपका उत्तर एक प्रश्न जैसा है जो मुझे विश्वास है। इसके अलावा समस्या यह होगी कि इन कथन में यह एक स्ट्रिंग के रूप में मानों में एकाधिक से बच जाएगा। –

संबंधित मुद्दे