2010-05-18 15 views
5

के भीतर किसी सरणी का उपयोग कैसे कर सकता हूं, इसलिए मैं एक खोज स्ट्रिंग (शब्दों की संख्या हो सकती है) लेने के लिए कोशिश कर रहा हूं और प्रत्येक मान को निम्नलिखित IN कथन में उपयोग करने के लिए सूची में बदल सकता हूं) मेरे होने गिनती फिल्टरमैं SQL क्वेरी

$search_array = explode(" ",$this->search_string); 
$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($search_array) 
      group by p.id 
      having count(c.value) >= $tag_count"; 

यह वर्तमान में कोई परिणाम, किसी भी विचार के साथ उपयोग करने के लिए इन सभी मूल्यों की गणना करने की जरूरत है?

समाधान:

$search_array = explode(" ",$this->search_string); 

foreach ($search_array as $key => $value) { 

    $new_search_array[] = "'$value'"; 

} 

$search_string = implode(',', $new_search_array); 

यह मैं एक अल्पविराम से अलग सूची

उत्तर

6
$search_array = implode(",", $search_array); 

देता है क्योंकि में मूल्यों के एक अल्पविराम से अलग सूची लेता है। (लेकिन तुम, अगर वे शब्द हैं सुनिश्चित करने के लिए $ search_array की सामग्री को उद्धृत कर रहे हैं की जरूरत है।)

एक कदम में यह ऐसा लग सकती है:

and c.value IN (implode(', ', $search_array)) 

$ search_array

function quoteAndComma($result, $each) { 
    return $result . ', "'.$each.'"'; 
} 

$search_array = array_reduce($search_array, "quoteAndComma", ''); 
+0

आप के साथ '" ' "ही पूरा कर सकते हैं। implode ("','", $ search_array)। "'", हालांकि, यह शायद आपके समाधान के रूप में सुरुचिपूर्ण नहीं है :-) –

+0

ओह अच्छा, मैंने इसके बारे में भी सोचा नहीं था! –

+0

अच्छा समाधान, लेकिन ध्यान दें कि यह 5.3 से पहले PHP में अपेक्षित काम नहीं करेगा, क्योंकि array_reduce() 5.2 और इससे पहले के तीसरे पैरामीटर के रूप में केवल पूर्णांक स्वीकार करता है। नतीजतन स्ट्रिंग '0, "एक", "दो", ...' –

0

उपयोग एक सरणी है जिसे आप सीधे स्ट्रिंग में जोड़ रहे हैं। ऐसा करने से पहले आपको इसे एक स्ट्रिंग में बदलना होगा।

इसके अलावा, आप यह देखने के लिए अपने एसक्यूएल स्टेटमेंट को क्यों प्रतिबिंबित नहीं कर रहे हैं कि आप वास्तव में MySQL को खिला रहे हैं?

+1

कृपया 'mysqli_real_escape_string' सरणी में मान पहले – knittl

+0

मैंने पहले कोई इंजेक्शन सुरक्षा नहीं जोड़ा है, केवल मूल क्वेरी काम कर रहा है। – ThinkingInBits

0

मूल्यों की अल्पविराम से अलग सूची की अपेक्षा करता है, (अगर वे स्ट्रिंग हैं तो उद्धृत)। $-> search_string का आपका मूल्य क्या है? और इसे किसी सरणी में विस्फोट करने से काम नहीं होगा ... आपको यह देखने के लिए अपनी $ क्वेरी को प्रतिबिंबित करने का प्रयास करें कि आपको क्या मिलता है।

0

...

$search_array = explode(" ",$this->search_string); 
$search = implode(",", $search_array); 
$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($search) 
      group by p.id 
      having count(c.value) >= $tag_count"; 
0

मैं नहीं एक PHP डेवलपर तो मुझे क्षमा करें अगर मैंने कुछ याद आती है, लेकिन सरणी मूल्यों अल्पविराम के द्वारा और एकल उद्धरण में sparated किया जाना चाहिए:

WHERE c.value IN ('a','b','c') 
4

आपको पहले इस सरणी से एक स्ट्रिंग बनाना चाहिए:

// Don't forget to escape the data! 
$search_array = array_map('mysql_real_escape_string', $search_array); 

// Convert array to a string like "'one', 'two', ..." 
$search_values = "'" . implode("', '", $search_array) . "'"; 

// Build a query 
$query = "select ... c.value IN ($search_values) ..." 
0

आप अपने आईएन स्टेटमेंट को रिग में नहीं लगा रहे हैं हिंदुस्तान टाइम्स तरह से, आप दो विकल्प हैं, या तो खोज अल्पविराम के द्वारा अलग स्ट्रिंग गुजरती हैं, या यह अपने आप करते हैं, में की तरह:

$search_array = explode(" ", $this->search_string); 

for ($i = 0; $i < count($search_array); $i++) 
{ 
    $search_array[$i] = "'" . $search_array[$i] . "'"; 
} 

$list = implode(",", $search_array); 

$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($list) 
      group by p.id 
      having count(c.value) >= $tag_count"; 
0
$search_array = explode(" ",$this->search_string); 

    foreach ($search_array as $key => $value) { 

     $new_search_array[] = "'$value'"; 

    } 

    $search_string = implode(',', $new_search_array);