Здравствуйте!
Никак не могу разобраться с циклом foreach. Необходимо перебирать массив, в котором слова поискового запроса, и выводить полученные результаты на страницу. Но после всей обработки поискового запроса функция count() мне выдаёт нулевое значение массива, в котором должны быть извлечены данные, соответствующие поисковому запросу.
Код обработчика такой:
if (isset($submit)) {
if (empty($query) or strlen($query) < 6) {
echo "<div class='search_title_attention'>Поисковый запрос не введён, либо он менее 3-х символов кириллицы<br>или менее 6-ти символов латиницы!</div>";
} else { // Начало вывода
print_r($query);
$words = clearQuery($query);
print_r($words);
if ($select == 'all') {
searchArticles($words);
$count = count($array);
echo $count;
}
}
} else {
echo "<div class='search_title_attention'>Вы обратились к файлу без необходимых параметров!</div>";
}
Функции, которые используются:
/*Функция обрезки окончаний слов*/
function dropBackWords($word) {
$reg = "/(а|я|о|е|ь|и|ы|ая|яя|ое|ее|ый|ать|ять|еть|уть|у|ю|ем|ешь|ете|ет|ут|ют|ал|ял|ала|яла|али|яли|ул|ула|ули)(\s|$)/ui"; //данная регулярная функция будет искать совпадения окончаний
$word = preg_replace($reg,'',$word);
return $word;
}
/Функция уничтожения стоп-слов/
function stopWords($query) { //тут мы обрабатываем весь поисковый запрос
$reg = "/(^|\s)(а|без|более|бы|был|была|были|было|быть|в|вам|вас|весь|во|вот|все|всего|всех|вы|где|да|даже|для|до|его|ее|если|есть|еще|же|за|здесь|и|из|или|им|их|к|как|ко|когда|кто|ли|либо|мне|может|мы|на|надо|наш|не|него|нее|нет|ни|них|но|ну|о|об|однако|он|она|они|оно|от|очень|по|под|при|с|со|так|также|такой|там|те|тем|то|того|тоже|той|только|том|ты|у|уже|хотя|чего|чей|чем|что|чтобы|чье|чья|эта|эти|это|я)($|\s)/ui"; //данная регулярка отрежет все стоп-слова отбитые пробелами
$query = preg_replace($reg,'',$query);
return $query;
}
/Функция подготовки поискового запроса/
function clearQuery($query) {
$query = stripcslashes($query);
$query = htmlspecialchars($query);
$words = explode(" ",$query);
$words = stopWords($words);
$i = 0;
$keywords = "";
foreach ($words as $word) {
$word = trim($word);
$regv = '/^([а-я0-9]+)$/i';
$count = (preg_match($regv, $word)) ? 6 : 3;
if (strlen($word)<$count) {
unset($word);
} else {
if (strlen($word)>8) {
$keywords[$i]=dropBackWords($word);
$i++;
} else {
$keywords[$i]=$word;
$i++;
}
}
}
return $keywords;
}
function dataToArray($data) {
$array = array();
while (($row = $data->fetch()) !=false)
$array[] = $row;
return $array;
}
function searchArticles($words) {
$query_search = "";
foreach ($words as $key => $value) {
if (isset($words[$key - 1])) {
$query_search .= " OR ";
$query_search .= "(title LIKE '%' . $value . '%' OR text LIKE '%' . $value . '%')";
}
}
try {
$pdo = new PDO("mysql:host=xxx; dbname=xxxx", "xxx", "xxx");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "<p>Запрос на выборку данных из бызы не прошёл. Напишите об этом администратору <a href='mailto:admin@torawhite.ru'>admin@torawhite.ru</a>.</p><br>ERROR: " . $e->getMessage();
exit;
}
$sql = 'SELECT * FROM male_articles WHERE :query_search';
$data = $pdo->prepare($sql);
$data->bindParam(':query_search', $query_search);
$data->execute();
return dataToArray($data);
}
Ещё прошу развеять сомнения насчёт подключения к базе данных - я так понимаю, что подключение нужно обязательно использовать в функции, обозначить подключение вначале самой страницы результатов не даст?
echo $count;
Выводит 0, а должен найти запись. В поисковый запрос ввожу только то, что точно есть в базе данных.
Недавно писал про возможные варианты за недорого. Вполне возможно. что Вы платите больше 149 руб. в месяц.
Для использования phpmorphy не требуется выделенный сервер (словари в бинарниках). Так что, полнотекстовый поиск MySQL + phpmorphy вполне жизнеспособная связка на shared-хостинге.
– romeo Feb 18 '15 at 09:44Иногда этого бывает недостатчно. Вы простом запросе
SELECT * FROM male_articles LIMIT 10получаете валидную кириллицу или вопросы/абракадабру?У Вас всё получилось? Я писал Вам код не с чистого листа, а с апробацией у себя. Если по-прежнему выводится пустой массив, то забейте в базу тестовые данные на латинице и вместо поискового запроса
– romeo Feb 18 '15 at 12:36жил был пёсвбейте на латинице. Если получили результат, то манипулируйте с кодировками. Да, и смотрите в ответ, я добавил комментарии к коду.Дополнил ответ.
Да, и мы с Вами нарушаем регламент хэшкода. Вопросы должны быть атомарны: один вопрос - один ответ.
И если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом) + можно ещё лайк.
P.S. Напишите мне на почту. Мне кое-что интересно.
– romeo Feb 18 '15 at 14:52