Таким образом, я пытаюсь взять строку поиска (могло быть любое количество слов), и превратите каждое значение в список для использования в следующем операторе 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);
Это дает мне список разделенных запятой значений
$search_array = implode(",", $search_array);
потому что IN принимает список значений, разделенных запятыми. (Но вам нужно убедиться, что содержимое $search_array заключено в кавычки, если это слова.)
Выполнение этого в один шаг может выглядеть так:
function quoteAndComma($result, $each) {
return $result . ', "'.$each.'"';
}
$search_array = array_reduce($search_array, "quoteAndComma", '');
...
$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";
Сначала вы должны построить строку из этого массива:
// 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) ..."
Я не разработчик PHP, извините, если что-то пропущу, но значения массива следует разделять запятыми и заключать в одинарные кавычки:
WHERE c.value IN ('a','b','c')
Вы не заполняете оператор 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";
Используйте
and c.value IN (implode(', ', $search_array))
$ search_array - это массив, который вы напрямую объединяете в строку. Перед этим вам нужно превратить его в строку.
Кроме того, почему вы не повторяете свой оператор sql, чтобы увидеть, что вы действительно передаете данные в MySQL?
IN ожидает список значений, разделенных запятыми (в кавычках, если они являются строками). Что содержит ваше значение $ this-> search_string? И преобразование его в массив НЕ будет работать ... попробуйте повторить свой запрос $, чтобы увидеть, что именно вы получите.
$search_array = explode(" ",$this->search_string);
foreach ($search_array as $key => $value) {
$new_search_array[] = "'$value'";
}
$search_string = implode(',', $new_search_array);