LIKE

2011-08-31 11 views
15

के लिए पीडीओ के साथ नामित पैरामीटर का उपयोग करके मैं LIKE का उपयोग कर अपने डेटाबेस में name फ़ील्ड को खोजने का प्रयास कर रहा हूं। अगर मैं एसक्यूएल शिल्प 'hand` द्वारा इस तरह:LIKE

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%how%'\n" 
     . ""; 
$sql = $db->prepare($query); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

तो इसके लिए संगत परिणाम देगा' कैसे '।
हालांकि, जब मैं इसे एक तैयार बयान में बदल जाते हैं:

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%:term%'\n" 
     . ""; 
$sql->execute(array(":term" => $_GET["search"])); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

मैं हमेशा शून्य परिणाम हो रही है।

मैं क्या गलत कर रहा हूं? मैं अपने कोड में अन्य स्थानों में तैयार बयान का उपयोग कर रहा हूं और वे ठीक काम करते हैं।

+0

संभावित पीडीओ [पीडीओ तैयार कथन प्रसंस्करण पैरामीटर नहीं] के डुप्लिकेट [http://stackoverflow.com/questions/2434560/pdo-prepare-statement-not-processing-parameters) – outis

उत्तर

27

बाध्य :placeholders एकल उद्धरणों में संलग्न नहीं होना चाहिए। इस तरह वे व्याख्या नहीं करेंगे, लेकिन कच्चे तार के रूप में माना जाता है।

आप LIKE पैटर्न के रूप में किसी एक का उपयोग करना चाहते हैं, तो मूल्य के साथ % पारित एक साथ:

$query = "SELECT * 
      FROM `help_article` 
      WHERE `name` LIKE :term "; 

$sql->execute(array(":term" => "%" . $_GET["search"] . "%")); 

ओह, और वास्तव में आप यहाँ पहली बार (addcslashes) इनपुट स्ट्रिंग साफ करने के लिए की जरूरत है। यदि उपयोगकर्ता पैरामीटर के भीतर किसी भी बाहरी % वर्णों की आपूर्ति करता है, तो वे LIKE मिलान पैटर्न का हिस्सा बन जाते हैं। याद रखें कि :term पैरामीटर स्ट्रिंग मान के रूप में पारित किया गया है, और उस स्ट्रिंग के भीतर सभी % एस LIKE क्लॉज के लिए प्लेसहोल्डर्स बन जाते हैं।

+2

[मानक एसक्यूएल में भागना] (http://drupal.org/node/654662) उतना आसान नहीं है जितना। पीएल/एसक्यूएल और ट्रांजैक्ट एसक्यूएल में, उदाहरण के लिए, आपको चरित्र को एक बचने वाले चरित्र के रूप में उपयोग करने की आवश्यकता है। – jswolf19

+0

@ jswolf19: MySQL में भागने के बारे में भी निश्चित नहीं था, और मैं आमतौर पर किसी भी गैर-अल्फान्यूमेरिक वर्णों को पट्टी करता हूं। (ओपी के लिए भी पर्याप्त हो सकता है।) – mario

+0

मुझे लगता है कि MySQL '\' के लिए डिफ़ॉल्ट है, लेकिन ओपी एक डीबी निर्दिष्ट नहीं करता है, और मानक एसक्यूएल डिफ़ॉल्ट बचने वाला वर्ण निर्दिष्ट नहीं करता है। आपको इसे 'LIKE B ESCAPE c' वाक्यविन्यास के साथ आपूर्ति करना होगा। – jswolf19

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