2009-08-29 15 views
9

मैं निम्नलिखित क्वेरी चलाने की कोशिश कर रहा हूं, और मुझे वाइल्डकार्ड में समस्या हो रही है।तैयार कथन में वाइल्डकार्ड का उपयोग करना - MySQLi

function getStudents() { 
     global $db; 
     $users = array(); 
     $query = $db->prepare("SELECT id, adminRights FROM users WHERE classes LIKE ? && adminRights='student'"); 
     $query->bind_param('s', '%' . $this->className . '%'); 
     $query->execute(); 
     $query->bind_result($uid, $adminRights); 
     while ($query->fetch()) { 
      if (isset($adminRights[$this->className]) && $adminRights[$this->className] == 'student') 
       $users[] = $uid; 
     } 
     $query->close(); 
     return $users; 
    } 

मुझे एक त्रुटि मिल रही है जो बताती है: संदर्भ द्वारा पैरामीटर 2 पास नहीं कर सकता। वाइल्डकार्ड का उपयोग करने के लिए मुझे कारण है क्योंकि कॉलम के डेटा में धारावाहिक सरणी होती है। मुझे लगता है, अगर इसे संभालने का कोई आसान तरीका है, तो मैं क्या कर सकता हूं?

अग्रिम धन्यवाद!

+0

संभावित डुप्लिकेट [ कथन की तरह एसक्यूएल समस्याएं] (http://stackoverflow.com/questions/618527/sql-like-statement-problems) – outis

उत्तर

16

आप संदर्भ द्वारा bind_param() लिए पैरामीटर पास करने के, जिसका मतलब है कि आप एक एकल चर (नहीं एक concatenated स्ट्रिंग) पास करना है।

$className = '%' . $this->className . '%'; 
$query->bind_param('s', $className); 
5

पैरामीटर # 2 एक संदर्भ होना चाहिए, मूल्य नहीं। प्रयास करें

$param = '%' . $this->className . '%'; 
$query->bind_param('s', $param); 
+0

सही है, क्योंकि मैन्युअल में पहली वाक्य कहती है: "पैरामीटर के रूप में एक तैयार कथन में वैरिएबल को बाइंड करता है" (चर पर जोर) – Zed

0

यह वही कारण यह है कि सी में होता है ++: वहाँ कोई कारण नहीं है कि आप विशेष रूप में, हालांकि पारित करने के लिए इस तरह के एक चर का निर्माण नहीं कर सकते। जब आप किसी फ़ंक्शन को मान देते हैं जो तर्क को संदर्भ मानने की अपेक्षा करता है, तो आपको एक चर (अस्थायी नहीं) की आवश्यकता होती है। तो पहले एक चर बनाएँ और फिर इसे पास करें।

-4

मौजूदा जवाब मेरे लिए काम नहीं किया तो यह है कि मैं क्या बजाय प्रयोग किया है:

$sql = mysql_query("SELECT * FROM `products` WHERE `product_title` LIKE '$userInput%'") or die(mysq_error()); 

और यह सब समय काम करते हैं।

और बस यह सब ऊपर से मैं सिर्फ सरलतम रूप की कोशिश की और यह

$sql = "SELECT * FROM `products` WHERE `product_title` LIKE '%".$userInput."%'"; 

काम किया मुझे आशा है कि इस मदद करता है

+1

दूसरी क्वेरी खतरनाक है और *** *** *** का उपयोग कभी नहीं किया जाना चाहिए क्योंकि यह एसक्यूएल इंजेक्शन हमलों के लिए खुला है। – zzzzBov

+1

क्या * नहीं * करने का सही उदाहरण है। –

7

यह करने के लिए एक और तरीका है:

SELECT id, adminRights FROM users 
    WHERE classes LIKE CONCAT("%", ?, "%") && adminRights='student' 

यह वह जगह है यदि आपके पास गतिशील परिणाम बाध्य है और केवल SQL क्वेरी को बदलना चाहते हैं तो आसान ...