Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.05.2013, 11:19
Аспирант
Отправить личное сообщение для andreydial Посмотреть профиль Найти все сообщения от andreydial
 
Регистрация: 13.05.2013
Сообщений: 39

Хочу по отдельности каждое слово. Но ведь в той части кода что привел я (те 6 строк внизу) формируется запрос и добавляется AND(OR) между словами.
А в том что вы привели, уже идет сам поиск. Или я не прав?
Ответить с цитированием
  #12 (permalink)  
Старый 23.05.2013, 13:57
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

В том что я привел идет вставка из поля поиска, и туда вставляется все, что в строке поиска не разделяя никакими or, and и как я написал выше разделять нужно переменную $Search

допустим $Search='вася пупкин';
и
$Search or $Search
будет
вася пупкин or вася пупкин - хоть как ты меняй or на and всеравно будет целоиковое 'вася пупкин'
а не
вася or пупкин or вася or пупкин
и вставить в середину можно только разбивая переменную $Search и переписывая этот кусок кода.
Да и выше я написал что можно и не разделять, если использовать полнотекстовой поиск, но нужно будет все равно тот кусок менять, а еще и индексы бд. В общем в любом случае вам работать именно с тем куском кода который я привел.
А то, что вы привели - там совершенно в другом месте выставляется оператор, и к вашей задаче никак не относится.
Ответить с цитированием
  #13 (permalink)  
Старый 25.05.2013, 01:03
Аспирант
Отправить личное сообщение для andreydial Посмотреть профиль Найти все сообщения от andreydial
 
Регистрация: 13.05.2013
Сообщений: 39

Вроде нашел обработку каждого слова. Еще один маленький вопрос. Как организовать цикл для массива
if (!empty($Search))
	 {
		 $arrWHEREs = array
		(
			" name LIKE ('%{$Search}%')",
			" address LIKE ('%{$Search}%')",
			" description LIKE ('%{$Search}%')",
			" link LIKE ('%{$Search}%')",
			" vlink LIKE ('%{$Search}%')",
			" email LIKE ('%{$Search}%')",
			" type LIKE ('%{$Search}%')",
			" age LIKE ('%{$Search}%')",
			" gender LIKE ('%{$Search}%')",
			" price LIKE ('%{$Search}%')",
			" date LIKE ('%{$Search}%')",
		);
		 $search = " ( ".implode(" or ", $arrWHEREs)." ) ";
	} else $search ="";

В который встроить такую обработку
if($search) {
	    //получаем массов чистых слов
	    $words = clearWords($search);
	    //добавляем ограничители для формирования условия WHERE к каждому слову
	    foreach($words as $k=>&$v) $v="'".$v."%'";
	    //формируем условие WHERE
	    $where = implode(" OR header like ".clearWords($search);
	    //отрезаем первое " OR" из условия
	    $where = preg_replace("/^\sOR/","",$where);
	    //формируем окончательный запрос к БД
	    //$query = "SELECT * FROM table WHERE ".$where;
	}


Ну или как лучше всего совместить эти два условия?
Ответить с цитированием
  #14 (permalink)  
Старый 25.05.2013, 02:12
Аспирант
Отправить личное сообщение для andreydial Посмотреть профиль Найти все сообщения от andreydial
 
Регистрация: 13.05.2013
Сообщений: 39

Почему не работает поиск если сделать так
if (!empty($Search))
	 {
	 	$words = clearWords($Search);
	 	foreach($words as $k=>&$v) $v="'".$v."%'";
		 {$arrWHEREs = array
		(
			" name LIKE ('%{clearWords($search)}%')",
			" address LIKE ('%{clearWords($search)}%')",
			" description LIKE ('%{clearWords($search)}%')",
			" link LIKE ('%{clearWords($search)}%')",
			" vlink LIKE ('%{clearWords($search)}%')",
			" email LIKE ('%{clearWords($search)}%')",
			" type LIKE ('%{clearWords($search)}%')",
			" age LIKE ('%{clearWords($search)}%')",
			" gender LIKE ('%{clearWords($search)}%')",
			" price LIKE ('%{clearWords($search)}%')",
			" date LIKE ('%{clearWords($search)}%')",
		);}
		 $search = " ( ".implode(" or ", $arrWHEREs)." ) ";

	} else $search ="";

Последний раз редактировалось andreydial, 25.05.2013 в 02:17.
Ответить с цитированием
  #15 (permalink)  
Старый 25.05.2013, 11:33
Аспирант
Отправить личное сообщение для andreydial Посмотреть профиль Найти все сообщения от andreydial
 
Регистрация: 13.05.2013
Сообщений: 39

Может просто для description новую переменную организовать и все. В принципе поиск по словам только для этого поля необходим.
Ответить с цитированием
  #16 (permalink)  
Старый 25.05.2013, 15:47
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

я бы делал через полнотекстовой поиск, т.к. можно отсортировать по релевантности
if(!empty($Search)){
	$arrWHEREs=array();
	$Searchs=preg_split('/\s+/',$Search,-1,PREG_SPLIT_NO_EMPTY);
	for($i=0,$s=sizeof($Searchs);$i<$s;$i++){
//		if(mb_strlen($Searchs[$i])<2)continue; // раскомментировать если не нужны слова менее 2х символов пример: 'маша и петя' - 'и' не войдет в выборку
		$arrWHEREs=array_merge($arrWHEREs,array
			(
				" name LIKE ('%{$Searchs[$i]}%')",
				" address LIKE ('%{$Searchs[$i]}%')",
				" description LIKE ('%{$Searchs[$i]}%')",
				" link LIKE ('%{$Searchs[$i]}%')",
				" vlink LIKE ('%{$Searchs[$i]}%')",
				" email LIKE ('%{$Searchs[$i]}%')",
				" type LIKE ('%{$Searchs[$i]}%')",
				" age LIKE ('%{$Searchs[$i]}%')",
				" gender LIKE ('%{$Searchs[$i]}%')",
				" price LIKE ('%{$Searchs[$i]}%')",
				" date LIKE ('%{$Searchs[$i]}%')",
			));
	}
	$search=" ( ".implode(" or ", $arrWHEREs)." ) ";
}else $search="";

что там у вас в защите от xss и обеспечивает ли та защита защиту от sqlinj я хз.
Ответить с цитированием
  #17 (permalink)  
Старый 25.05.2013, 23:40
Аспирант
Отправить личное сообщение для andreydial Посмотреть профиль Найти все сообщения от andreydial
 
Регистрация: 13.05.2013
Сообщений: 39

Сообщение от edison Посмотреть сообщение
я бы делал через полнотекстовой поиск, т.к. можно отсортировать по релевантности
if(!empty($Search)){
	$arrWHEREs=array();
	$Searchs=preg_split('/\s+/',$Search,-1,PREG_SPLIT_NO_EMPTY);
	for($i=0,$s=sizeof($Searchs);$i<$s;$i++){
//		if(mb_strlen($Searchs[$i])<2)continue; // раскомментировать если не нужны слова менее 2х символов пример: 'маша и петя' - 'и' не войдет в выборку
		$arrWHEREs=array_merge($arrWHEREs,array
			(
				" name LIKE ('%{$Searchs[$i]}%')",
				" address LIKE ('%{$Searchs[$i]}%')",
				" description LIKE ('%{$Searchs[$i]}%')",
				" link LIKE ('%{$Searchs[$i]}%')",
				" vlink LIKE ('%{$Searchs[$i]}%')",
				" email LIKE ('%{$Searchs[$i]}%')",
				" type LIKE ('%{$Searchs[$i]}%')",
				" age LIKE ('%{$Searchs[$i]}%')",
				" gender LIKE ('%{$Searchs[$i]}%')",
				" price LIKE ('%{$Searchs[$i]}%')",
				" date LIKE ('%{$Searchs[$i]}%')",
			));
	}
	$search=" ( ".implode(" or ", $arrWHEREs)." ) ";
}else $search="";

что там у вас в защите от xss и обеспечивает ли та защита защиту от sqlinj я хз.
Спасибо, сейчас попробую ваш вариант. Защиту меня не просили смотреть, посему это потом как нибудь. Просили только слова разделить.

Cупер, работает как надо! Вроде бы. Огромное спасибо.
Но если раскомментировать 5 строку, то поиск перестает работать.

Последний раз редактировалось andreydial, 25.05.2013 в 23:59.
Ответить с цитированием
  #18 (permalink)  
Старый 26.05.2013, 01:21
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

mbstring небось не включена
mb_strlen на strlen
или включать mbstring
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск