Как я могу использовать массив в рамках SQL-запроса

Таким образом, я пытаюсь взять строку поиска (могло быть любое количество слов), и превратите каждое значение в список для использования в следующем операторе IN), кроме того, мне нужно количество всех этих значений для использования с тем, что я имел фильтр количества

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

Это дает мне список разделенных запятой значений

5
задан ThinkingInBits 18 May 2010 в 08:07
поделиться

8 ответов

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

потому что IN принимает список значений, разделенных запятыми. (Но вам нужно убедиться, что содержимое $search_array заключено в кавычки, если это слова.)

Выполнение этого в один шаг может выглядеть так:

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

$search_array = array_reduce($search_array, "quoteAndComma", '');
6
ответ дан 13 December 2019 в 22:03
поделиться

...

$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
ответ дан 13 December 2019 в 22:03
поделиться

Сначала вы должны построить строку из этого массива:

// 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) ..."
4
ответ дан 13 December 2019 в 22:03
поделиться

Я не разработчик PHP, извините, если что-то пропущу, но значения массива следует разделять запятыми и заключать в одинарные кавычки:

WHERE c.value IN ('a','b','c')
0
ответ дан 13 December 2019 в 22:03
поделиться

Вы не заполняете оператор IN правильным образом, у вас есть два варианта, либо передать строку поиска, разделенную запятыми, либо сделать это самостоятельно, как в :

$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
ответ дан 13 December 2019 в 22:03
поделиться

Используйте

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

$ search_array - это массив, который вы напрямую объединяете в строку. Перед этим вам нужно превратить его в строку.

Кроме того, почему вы не повторяете свой оператор sql, чтобы увидеть, что вы действительно передаете данные в MySQL?

0
ответ дан 13 December 2019 в 22:03
поделиться

IN ожидает список значений, разделенных запятыми (в кавычках, если они являются строками). Что содержит ваше значение $ this-> search_string? И преобразование его в массив НЕ будет работать ... попробуйте повторить свой запрос $, чтобы увидеть, что именно вы получите.

0
ответ дан 13 December 2019 в 22:03
поделиться
    $search_array = explode(" ",$this->search_string);

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

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

    }

    $search_string = implode(',', $new_search_array);
0
ответ дан 13 December 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: