2012-02-23 15 views
17

अंदर मुझे पता है कि इतना की तरह एक भी मूल्य के लिए% क्वेरी की तरह एक एसक्यूएल प्रदर्शन करने के लिए:एसक्यूएल की तरह% सरणी

SELECT * FROM users WHERE name LIKE %tom%; 

लेकिन कैसे मैं इस करते हैं खोज मेरी तरह के लिए नियम एक सरणी से आता है तो क्या होगा?

$words = array("Tom", "Smith", "Larry"); 

मैं कैसे की तरह मेरे सरणी में शब्दों की खोज करना% की तरह मेरे एसक्यूएल करते हैं: उदाहरण के लिए, मान लीजिए कि हम इस तरह एक सरणी डालते हैं

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]% 

पूरे क्वेरी के अंदर डाले बिना एक foreach पाश या कुछ

संपादित: मैं भूल गया था, कि मुझे लगता है cakePHP की शर्तों ('सभी') विधि के अंदर cakePHP में यह कर रहा हूँ उल्लेख करने के लिए इतना है कि चीजों को थोड़ा पेचीदा हो।

धन्यवाद

+0

आपके प्रश्न में [टैग: जैसे-ऑपरेटर] टैग के लिए कम से कम '5' वोट हैं। क्या मैं कृपया अनुरोध कर सकता हूं कि आप [टैग: एसक्यूएल-जैसे] को [synonym] (http://stackoverflow.com/tags/like-operator/synonyms) के रूप में सुझाव दें? – Kermit

उत्तर

25
$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

संपादित करें: CakePHP के लिए कोड:

foreach($words as $word){ 
    $sql[] = array('Model.name LIKE' => '%'.$word.'%'); 
} 

$this->Model->find('all', array(
    'conditions' => array(
     'OR' => $sql 
    ) 
)); 

इस सामग्री के बारे में पढ़ें: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

+1

मेरा विचार बिल्कुल ठीक है। अच्छा उत्तर! बस जब एक खाली सरणी जो एसक्यूएल त्रुटि उत्पन्न होगी होने सावधान रहने की जरूरत है ... –

+0

मुझे लगता है कि 'या 0' ठीक ... करना होगा;) –

+0

यह काम करेंगे, लेकिन मैं कैसे cakePHP अंदर ऐसा करते हैं लगता है ('all') फ़ंक्शन (संपादित करें देखें) – user765368

4

आप नहीं कर सकते। इसे एक जंजीर field like %..% or field like %..% or ... होना होगा। where ... in खंड केवल वाइल्डकार्ड के लिए समर्थन के साथ स्ट्रिंग मैचों को निकाला करता है।

11

मानक SQL के मामले में, यह होगा:

SELECT * FROM users WHERE name LIKE '%tom%' 
         OR name LIKE '%smith%' 
         OR name LIKE '%larry%'; 

चूंकि आप MySQL का उपयोग कर रहे हैं उपयोग कर सकते हैं RLIKE (a.k.a. REGEXP)

SELECT * FROM users WHERE name RLIKE 'tom|smith|larry'; 
+0

'RLIKE' मेरे लिए एक बिल्कुल महान समाधान है, धन्यवाद करने के लिए हुआ था! ! ;) –

3

का उपयोग कर REGEXP

SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry'; 
0

मैं सिर्फ 472084.

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

मेरी स्वयं के लिए के कोड लिया कोशिश, मैं इसे संशोधित करने के लिए किया था क्योंकि यह मुझे एक त्रुटि दी है एसक्यूएल। मैं इसे थ्रेड पढ़ने वाले लोगों के लिए पोस्ट करता हूं।

foreach($words as $word){ 
    $sql[] = 'name LIKE \'%'.$word.'%\''; 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

उनके बीच का अंतर उद्धरण के बारे में है, मेरे mysql डीबी ने कहा कि एक समस्या है! तो मुझे $sql[] = 'name LIKE %'.$word.'%' से उद्धरण से बचना पड़ा और अब यह पूरी तरह से काम कर रहा है।

0

Blockquote

/** * मूल्यों की एक बहुआयामी सरणी, जब "[]" ब्लॉक के साथ विभिन्न चरित्रों समूहीकरण फटना। * @param सरणी $ सरणी सरणी * @return स्ट्रिंग बिखर गया सरणी */ समारोह hoArray2SqlLike ($ सरणी) फटना { if (!is_array ($ सरणी)) $ सरणी लौटाएं;

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

इस कोड में हम एसक्यूएल क्वेरी में डबल कोट्स नहीं मिल सकता

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%; 
// error in double quotes and % is out side of Double quotes . 

या आप भी अल्पविराम से अलग मान का उपयोग कर सकते हैं: -

$name = array(Tom, Smith, Larry); 

$sql="SELECT * FROM person"; 

    extract($_POST); 
    if ($name!=NULL){ 
    $exp_arr= array_map('trim', explode(",",$name)); 
    echo var_export($exp_arr); 
    //die; 
     foreach($exp_arr as $val){ 
     $arr = "'%{$val}%'"; 
     $new_arr[] = 'name like '.$arr; 
     } 

     $new_arr = implode(" OR ", $new_arr); 
     echo $sql.=" where ".$new_arr; 
    } 
     else {$sql.="";} 

इको इस तरह एसक्यूएल क्वेरी: -

SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%'; 
संबंधित मुद्दे