Корректная работа с циклом foreach при подключении к базе данных через PDO

Рейтинг: 0Ответов: 1Опубликовано: 18.02.2015

Здравствуйте!

Никак не могу разобраться с циклом 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, а должен найти запись. В поисковый запрос ввожу только то, что точно есть в базе данных.

Ответы

Ответов пока нет.