Jump to content
  • 0

Как организовать поиск только по конкретному Доп. полю?


Нарек
 Share

Question

Здравствуйте. А есть возможность организовать поиск только по доп. полю? Уточню, есть киносайт где год выхода фильма является доп. полем и ссылкой (например site.ru/xfsearch/2015). По клику на данное поле естественно показываются все записи где есть 2015 независимо от того где написано это число. И выходит, что по клику на 2015 год показывается фильм 1990 года где в описании есть цифра 2015. Как можно сделать, чтобы по клику на год-ссылку велся поиск только в определенной доп поле?
Примечание: На сайте использую 2 типа ссылок которые ведут на xfsearch.

  • ​Год
  • Страна

​На одном форуме помогли кодом 

В engine/engine.php заменить

WHERE {$stop_list}xfields LIKE '%{$xf}%'

на 

WHERE {$stop_list} (`xfields` = 'year|".$xf."' OR `xfields` LIKE 'year|".$xf."||%' OR `xfields` LIKE '%||year|".$xf."' OR `xfields` LIKE '%||year|".$xf."||%')

где year название доп. поля.
Так вот, код то работает, только теперь нажатие на доп поле Страна ничего не показывает. Может можно как нибудь совместить в этом коде и year и country, да так, чтобы они не мешали основному поиску?
Спасибо! 

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0
`xfields` = 'year|".$xf."' OR `xfields` LIKE 'year|".$xf."||%' OR `xfields` LIKE '%||year|".$xf."' OR `xfields` LIKE '%||year|".$xf."||%'

получается ищем просто 'year|2000' или 'year|2000||%'(с чем-то после него) или '%||year|2000'(с чем-то до него) или '%||year|2000||%'(с чем-то до и после него)

на мой взгляд - это не очень хорошо, проще выделить год в отдельное поле и искать по одному условию '2000' а для стран '%Россия%'

Link to comment
Share on other sites

  • 0

Вопрос решил банально. Код:

WHERE {$stop_list} (`xfields` = 'year|".$xf."' OR `xfields` LIKE 'year|".$xf."||%' OR `xfields` LIKE '%||year|".$xf."' OR `xfields` LIKE '%||year|".$xf."||%' OR `xfields` = 'country|".$xf."' OR `xfields` LIKE 'country|".$xf."||%' OR `xfields` LIKE '%||country|".$xf."' OR `xfields` LIKE '%||country|".$xf."||%')

Теперь другая беда. Допустим Фильм совместного производства США и Белгии, у меня это выглядит так:

 

Страна: США, Белгия

 

В таких фильмах если кликать по США, то показываются только те фильмы где ТОЛЬКО США. То есть фильм совместного производства США, Белгия, Канада не будет показываться..

Link to comment
Share on other sites

  • 0

что-то у вас сложноватый запрос получается, возможно это зависит от CMS.

обычно, чтобы найти все строки, в которых встречается слово в одной из колонок достаточно было "WERE 'country' LIKE '%". $xf ."%'..."
у вас походу все хранится в одной строке xfields, где строка вида приблизительно такого ||название|Фильм||год|2000||страна|Россия,США|| - возможно я и ошибаюсь, но это не очень хорошая практика и я бы посоветовал все же разбить на отдельные колонки.

Если сделать это нет возможности, то можно воспользоваться регулярными выражениями

  • Like 1
Link to comment
Share on other sites

  • 0

что-то у вас сложноватый запрос получается, возможно это зависит от CMS.

обычно, чтобы найти все строки, в которых встречается слово в одной из колонок достаточно было "WERE 'country' LIKE '%". $xf ."%'..."

у вас походу все хранится в одной строке xfields, где строка вида приблизительно такого ||название|Фильм||год|2000||страна|Россия,США|| - возможно я и ошибаюсь, но это не очень хорошая практика и я бы посоветовал все же разбить на отдельные колонки.

Если сделать это нет возможности, то можно воспользоваться регулярными выражениями

 

Да, запрос получается сложный.. Просто я только начинаю углубляться в этой cms и не очень понимаю как добиться того чего я хочу)

У меня там по идее 2 доп поля которые мне нужны в поиске, это year и country. Так как страна не может быть с названием "2015" и год не может быть с названием "Россия" тут у меня появляется один плюс - ошибок не может быть. Так вот как делать, чтобы при нажатии на ссылку велся поиск только по этим двум доп полям и если есть совпадения вывести новость - непонятно пока)

Что-то мне подсказывает, что если совместить в этом коде 

WHERE {$stop_list} (`xfields` = 'year|".$xf."' OR `xfields` LIKE 'year|".$xf."||%' OR `xfields` LIKE '%||year|".$xf."' OR `xfields` LIKE '%||year|".$xf."||%')

доп поля year и country, то все сработает. Но совместить не так как я совместил, а по другому)

 

upd:

 

Оказывается нет) Я просто поменял year на country, чтобы проверить. Ведет себя оно так же, не показываются совместные производства...

Edited by Нарек
Link to comment
Share on other sites

  • 0

хм... а можно увидеть как выглядит таблица с нужными вам полями

и механизм запросов, какой-то странный

вообще как я раньше делал выглядело бы вроде этого:

$where = '';$year = getYear();$country = getCountry();if($year) $where .= "AND 'year' LIKE '". $year ."' ";if($country) $where .= "AND 'country' LIKE '%". $country ."%' ";

функции getYear() и getCountry() получают данные из _POST или _GET проверяя, чтобы не было инъекций

и после выполнения подобного кода у нас $where выглядел бы на вроде 
$where .= "AND 'year' LIKE '2005' AND 'country' LIKE '%Россия%' ";
Если например был указан только год или страна, то и выборка будет только по году или стране
 

Link to comment
Share on other sites

  • 0

Если честно я не знаю где смотреть таблицу)

 

Вот кусок кода который отвечает за поиск по доп полям.

elseif ($do == 'xfsearch') {			// ################ Поиск новостей по доп. полям #################						if ($cstart) {				$cstart = $cstart - 1;				$cstart = $cstart * $config['news_number'];			}			$xf = urldecode ( $_GET['xf'] );			if ( $config['charset'] == "windows-1251" AND $config['charset'] != detect_encoding($xf) ) {				$xf = iconv( "UTF-8", "windows-1251//IGNORE", $xf );			}			$xf = @$db->safesql ( htmlspecialchars ( strip_tags ( stripslashes ( trim ( $xf ) ) ), ENT_QUOTES, $config['charset'] ) );			$url_page = $config['http_home_url'] . "xfsearch/" . urlencode ( str_replace("'", "'", $xf) );			$user_query = "do=xfsearch&xf=" . urlencode ( str_replace("'", "'", $xf) );					if (isset ( $_SESSION['dle_sort_xfsearch'] )) $news_sort_by = $_SESSION['dle_sort_xfsearch'];			if (isset ( $_SESSION['dle_direction_xfsearch'] )) $news_direction_by = $_SESSION['dle_direction_xfsearch'];						$sql_select = "SELECT SQL_CALC_FOUND_ROWS p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE {$stop_list}xfields LIKE '%{$xf}%' AND approve=1" . $where_date . " ORDER BY " . $news_sort_by . " " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];			$sql_count = "SELECT FOUND_ROWS() as count";			$allow_active_news = true;
Link to comment
Share on other sites

  • 0

узнать бы чему равна $stop_list и $where_date
$xf судя по всему берется из GET одной цельной строкой, хотелось бы узнать что именно и в каком виде оно приходит

не нашел поля в котором бы хранилась страна
p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason
 

  • Like 1
Link to comment
Share on other sites

  • 0
еще поле p.xfields на всякий случай проверь

 

Неа, не помогает.. Но проблему кажется решил другим способом. 

Получается, что в поле year вводятся только цифры.

 

под 

if (isset ( $_SESSION['dle_direction_xfsearch'] )) $news_direction_by = $_SESSION['dle_direction_xfsearch'];

добавил

$xfsearch = (is_numeric($xf)) ? "xfields LIKE '%{$xf}'" : "xfields LIKE '%{$xf}%'"; 

И в самом запросе поменял 

WHERE {$stop_list}{$xfsearch} OR (`xfields` = 'year|".$xf."' OR `xfields` LIKE 'year|".$xf."||%' OR `xfields` LIKE '%||year|".$xf."' OR `xfields` LIKE '%||year|".$xf."||%') 

Все.

 

Вроде все работает как мне нужно, но вот насколько это правильное решение - без понятия..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy