Хочу по отдельности каждое слово. Но ведь в той части кода что привел я (те 6 строк внизу) формируется запрос и добавляется AND(OR) между словами.
А в том что вы привели, уже идет сам поиск. Или я не прав? |
В том что я привел идет вставка из поля поиска, и туда вставляется все, что в строке поиска не разделяя никакими or, and и как я написал выше разделять нужно переменную $Search
допустим $Search='вася пупкин'; и $Search or $Search будет вася пупкин or вася пупкин - хоть как ты меняй or на and всеравно будет целоиковое 'вася пупкин' а не вася or пупкин or вася or пупкин и вставить в середину можно только разбивая переменную $Search и переписывая этот кусок кода. Да и выше я написал что можно и не разделять, если использовать полнотекстовой поиск, но нужно будет все равно тот кусок менять, а еще и индексы бд. В общем в любом случае вам работать именно с тем куском кода который я привел. А то, что вы привели - там совершенно в другом месте выставляется оператор, и к вашей задаче никак не относится. |
Вроде нашел обработку каждого слова. Еще один маленький вопрос. Как организовать цикл для массива
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; } Ну или как лучше всего совместить эти два условия? |
Почему не работает поиск если сделать так
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 =""; |
Может просто для description новую переменную организовать и все. В принципе поиск по словам только для этого поля необходим.
|
я бы делал через полнотекстовой поиск, т.к. можно отсортировать по релевантности
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упер, работает как надо! :dance: Вроде бы. Огромное спасибо. Но если раскомментировать 5 строку, то поиск перестает работать. |
mbstring небось не включена
mb_strlen на strlen или включать mbstring |
Часовой пояс GMT +3, время: 23:27. |