Цитата(Splendid @ 20.11.2007, 17:06 ) | | т.е. теперь пользователь может вводить только русские и англ. буквы и цифры...так? |
Ну, он может вводить что захочет, но искаться будут только перечисленные Раньше, вроде бы, так же было.. Разве нет? И "Notice: Undefined variable" по идее должна была выскакивать при аналогичном вводе. Сейчас он ищет то, что находится в кавычках и то, что перечисленно во втором выражении $reg = '/(?:\+|-)?\b[ a-zA-Zа-яёА-ЯЁ0-9-_]+\b/is'; Это выражение можно на словах расписать так: возможно стоит плюс или минус, после которого идут перечисленные в кв. скобках буквы/числа. Если нужно искать всё, что введет пользователь, можно квадратные скобки заменить на "\S". Если хотите ограничить длинну слова (чтобы исключить из поиска слишком короткие слова), можно после квадратных скобок (или \S - что выберете) убрать "+" и поставить "{3,}" - будет искать слова только от трех "букв" и больше. Вместо это проверки | Код | if ($search == '') {echo '</br>'; echo " <center><br> Вы ничего не ввели в окно поиска. Пожалуйста, повторите ввод. </br></center>"; }
|
лучше проверить, что вернула функция. Итак. Исходя из вышесказанного, налепил вот что: | Код | <?php function prepareWhere($search, $fields) { // Разбираем строку на слова $reg = '/"(?=\S)(?:[^"]*|(?R))*(?<=\S)"/is'; preg_match_all($reg, $search, $words1, PREG_PATTERN_ORDER); $search = preg_replace($reg, "", $search); $reg = '/(?:\+|-)?\b[a-zA-Zа-яёА-ЯЁ0-9-_]+\b/is'; preg_match_all($reg, $search, $words2, PREG_PATTERN_ORDER); $words[0] = array_merge($words1[0], $words2[0]); $words_groups = array(); $words_groups['include']=array(); $words_groups['exclude']=array(); $words_groups['any']=array(); // Каждое слово обрабатываем, определяем его тип foreach( $words[0] as $word ) { if( strlen($word) > 0 ) // Если слово не пустое, то продалжаем с ним { $word = trim($word, '"'); $word = mysql_real_escape_string($word); $word = addCslashes($word, '_%'); switch( $word[0] ) { case '+': // Обязательные слова $words_groups['include'][] = substr($word, 1); break; case '-': // Ненужные слова $words_groups['exclude'][] = substr($word, 1); break; default: // Наличие хотя бы одного слова $words_groups['any'][] = $word; } } } // "Группируем" группы слов, учитывая поля $words_rules = array(); $words_rules['include'] = array(); $words_rules['exclude'] = array(); $words_rules['any'] = array(); foreach( $fields as $field ) { // Ненужные слова if( count($words_groups['exclude']) > 0 ) $words_rules['exclude'][] = ' ('.$field.' NOT LIKE "%'. implode('%" AND '.$field.' NOT LIKE "%', $words_groups['exclude']) .'%" OR '.$field.' is null) '; // Наличие хотя бы одного слова if( count($words_groups['any']) > 0 ) $words_rules['any'][] = ' ('.$field.' LIKE "%'. implode('%" OR '.$field.' LIKE "%', $words_groups['any']) .'%") '; } if( count($words_groups['include']) > 0 ) foreach( $words_groups['include'] as $word ) $words_rules['include'][] = ' ('.implode(' LIKE "%'.$word.'%" OR ', $fields).' LIKE "%'.$word.'%") '; // Объединяем результаты if( count($words_rules['include']) > 0 ) $where['include'] = '('.implode(' AND ', $words_rules['include']).')'; if( count($words_rules['exclude']) > 0 ) $where['exclude'] = '('.implode(' AND ', $words_rules['exclude']).')'; if( count($words_rules['any']) > 0 ) $where['any'] = '('.implode(' OR ', $words_rules['any']).')'; if (!empty($where['include']) || !empty($where['exclude']) || !empty($where['any'])) $where = implode(' AND ', $where); else $where = ""; return $where; }
$where = prepareWhere('fgdf', array(''));
if (empty($where)) { echo '</br>'; echo " <center><br> Вы ничего не ввели в окно поиска. Пожалуйста, повторите ввод. </br></center>"; } else { /* можно выполнять поиск, используя приготовненную where */ echo $where; }
?>
|
(поправте как надо второе выражение) PS опять забыл про mysql_real_escape_string(). Обновил Это сообщение отредактировал(а) kasmanaft - 20.11.2007, 14:41
|