Nasıl bir SQL sorgusu içinde bir dizi kullanabilirsiniz

6 Cevap php

Yani bir arama dizesi alır (kelime herhangi bir sayı olabilir) ve ek olarak deyimi) IN aşağıdaki kullanmak bir liste halinde her bir değeri açmak için çalışıyorum, benim sahip sayısı ile kullanmak için tüm bu değerlerin sayısını gerekir filtre

$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";

Bu şu anda herhangi bir sonuç döndürürse, herhangi bir fikir?

Çözüm:

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

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

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

}

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

Bu bana bir virgülle ayrılmış listesini verir

6 Cevap

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

IN değerleri virgülle ayrılmış listesini alır çünkü. (Onlar kelime eğer Ama, $ search_array içerikleri kote sağlamak gerekir.)

Tek adımda bunu yaparken bu gibi görünebilir:

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

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

Önce bu diziden bir dize inşa etmeli:

// 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) ..."

Kullanım

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

$ Search_array doğrudan bir dizeye birleştirerek olan bir dizidir. Bunu yapmadan önce bir dizeye açmak gerekiyor.

Ayrıca, neden aslında MySQL besleme olduğunuzu görmek için sql açıklamasını yineleyen değil mi?

...

$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";

Ben bir şey özledim eğer öyleyse pardon bir PHP geliştiricisi değilim, ama dizi virgül ile ve tek tırnak içinde sparated alınmalıdır:

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

: Sen doğru şekilde IN deyimi doldurmamak değil, iki seçenek, virgülle ayırarak arama dizesini geçmek, veya kendiniz yapmak gibi ya var

$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";