Хочу по отдельности каждое слово. Но ведь в той части кода что привел я (те 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, время: 01:35. |