23.05.2013, 11:19
|
Аспирант
|
|
Регистрация: 13.05.2013
Сообщений: 39
|
|
Хочу по отдельности каждое слово. Но ведь в той части кода что привел я (те 6 строк внизу) формируется запрос и добавляется AND(OR) между словами.
А в том что вы привели, уже идет сам поиск. Или я не прав?
|
|
23.05.2013, 13:57
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
В том что я привел идет вставка из поля поиска, и туда вставляется все, что в строке поиска не разделяя никакими or, and и как я написал выше разделять нужно переменную $Search
допустим $Search='вася пупкин';
и
$Search or $Search
будет
вася пупкин or вася пупкин - хоть как ты меняй or на and всеравно будет целоиковое 'вася пупкин'
а не
вася or пупкин or вася or пупкин
и вставить в середину можно только разбивая переменную $Search и переписывая этот кусок кода.
Да и выше я написал что можно и не разделять, если использовать полнотекстовой поиск, но нужно будет все равно тот кусок менять, а еще и индексы бд. В общем в любом случае вам работать именно с тем куском кода который я привел.
А то, что вы привели - там совершенно в другом месте выставляется оператор, и к вашей задаче никак не относится.
|
|
25.05.2013, 01:03
|
Аспирант
|
|
Регистрация: 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;
}
Ну или как лучше всего совместить эти два условия?
|
|
25.05.2013, 02:12
|
Аспирант
|
|
Регистрация: 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.
|
|
25.05.2013, 11:33
|
Аспирант
|
|
Регистрация: 13.05.2013
Сообщений: 39
|
|
Может просто для description новую переменную организовать и все. В принципе поиск по словам только для этого поля необходим.
|
|
25.05.2013, 15:47
|
Аспирант
|
|
Регистрация: 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 я хз.
|
|
25.05.2013, 23:40
|
Аспирант
|
|
Регистрация: 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.
|
|
26.05.2013, 01:21
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
mbstring небось не включена
mb_strlen на strlen
или включать mbstring
|
|
|
|