2012-12-03 12 views
7

मैं अपने सभी साइट कोड को mysql_ * कार्यों को पीडीओ में उपयोग करने से बदल रहा हूं। पीडीओ पर PHP दस्तावेज मेरी आवश्यकताओं के लिए स्पष्ट नहीं है। यह आपको उपयोग करने के लिए कार्य देता है, लेकिन विभिन्न परिदृश्यों में उन्हें समझाने के लिए विस्तार से नहीं जाता है।पीडीओ और माईएसक्यूएल फुलटेक्स्ट खोज

मूल रूप से, मैं एक mysql की प्रतिलिपि प्राप्त खोज की है:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)"; 

वास्तविक बयान बहुत लंबे समय तक है, लेकिन इस यह मूल रूप से क्या करता है।

मेरा सवाल है, मैं पीडीओ में इसे कैसे शामिल करूं?

मुझे पता है कि आप जगह-मार्कर के चारों ओर उद्धरणों का उपयोग करने के लिए नहीं हैं, तो क्या आप उन्हें AGAINST() फ़ंक्शन में छोड़ देते हैं? क्या मैं उन्हें शामिल करता हूं? अगर मैं उन्हें छोड़ देता हूं, वाइल्डकार्ड प्रतीक आदि के साथ क्या होता है?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE"); 
$sql->bindValue(':searchText', $searchFor . '*'); 

उत्तर

12

यह दुर्भाग्य से क्वेरी पैरामीटर के साथ उपयोग करने के लिए एक अजीब अपवाद नहीं है (संपादित करें: लेकिन जाहिरा तौर पर प्रत्येक MySQL शाखा का सबसे हाल ही बिंदु रिलीज में नहीं, नीचे देखें)।

AGAINST()में पैटर्न एक स्थिर स्ट्रिंग हो, एक क्वेरी पैरामीटर नहीं होना चाहिए। एसक्यूएल प्रश्नों में अन्य स्थिर तारों के विपरीत, आप यहां MySQL में सीमा के कारण, यहां एक क्वेरी पैरामीटर का उपयोग नहीं कर सकते हैं।

खोज पैटर्न को सुरक्षित रूप से प्रश्नों में विभाजित करने के लिए, PDO::quote() फ़ंक्शन का उपयोग करें। ध्यान दें कि पीडीओ का उद्धरण() फ़ंक्शन पहले से ही उद्धरण delimiters जोड़ता है (mysql_real_escape_string() के विपरीत)।

$quoted_search_text = $this->db->quote('+word +word'); 

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE"); 

@YourCommonSense से

पुन टिप्पणी:

आप कर रहे हैं ठीक है, मैं तो बस इस MySQL 5.5.31, 5.1.68 पर परीक्षण किया, और 5.0.96 (MySQL सैंडबॉक्स एक अद्भुत उपकरण है), और ऐसा लगता है कि ये संस्करण गतिशील SQL क्वेरी के AGAINST() खंड में क्वेरी पैरामीटर स्वीकार करते हैं।

मुझे अभी भी अतीत में मौजूद एक संघर्ष की याद आ रही है। शायद इसे प्रत्येक शाखा के सबसे हालिया बिंदु-रिलीज में ठीक किया गया है।

  • एक संग्रहीत प्रक्रिया पैरामीटर का उपयोग न करने में() खंड हमेशा एक ही परिणाम देता है: http://bugs.mysql.com/bug.php?id=3734
  • क्रैश या तैयार बयान, मैच और प्रतिलिपि प्राप्त के साथ अजीब परिणाम: उदाहरण के लिए, मैं इन से संबंधित कीड़े खोजने के http://bugs.mysql.com/bug.php?id=14496
+0

आप अपने जवाब के लिए बहुत बहुत धन्यवाद, और वैकल्पिक समाधान :) –

+2

मैं इस "अजीब" व्यवहार की बात कर रहे पुन: पेश नहीं कर सकते। 'के खिलाफ (? बुलेन मोड में)' मेरे लिए बिल्कुल सही काम करता है। आप किस MySQL संस्करण का उपयोग कर रहे हैं? –

+0

बेशक इम्यूलेशन मोड बंद है और दोबारा चेक किया गया है। –

0
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}"; 

try { 
    $database->prepare($sql); 
    $database->bindParam(':searchstr', $search); 
    $database->execute(); 
    $result_array = $database->fetch_array($sql); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
संबंधित मुद्दे