Jump to content
  • 0

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


Torawhite
 Share

Question

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

Никак не могу разобраться с циклом foreach. Необходимо перебирать массив, в котором слова поискового запроса и выводить полученные результаты на страницу. Но после всей обработки поискового запроса, функция count() мне выдаёт нулевое значение массива, в котором должны быть извлечены данные, соответствующие поисковому запросу.

Код обработчика такой:

<?phpif (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>";}?>

Функции, которые используются:

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

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Лень читать весь код, но в первом блоке переменная $array не определена. Может потому и 0?

function dataToArray($data) {$array = array();while (($row = $data->fetch()) !=false)$array[] = $row;return $array;}

Скорее всего тут дело в том, что я не до конца разобрался, как работают функции. Решил, что функция, описанная, выше, вернёт мне переменную $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);}

где return dataToArray($data); используется в самом низу. Совсем запутался... Видимо, нужно занести результат работы функции в переменную, Вы правы. плюс мне дали почитать про область видимости переменной Возможно, ещё тут где-то напортачил. поэтому мне phpstorm и выдавал ошибку в переменной $pdo, которая была в отдельном файле подключения к Базе данных, пока я всё подключение не перенес в функцию

 

Лень читать весь код, но в первом блоке переменная $array не определена. Может потому и 0?

function dataToArray($data) {$array = array();while (($row = $data->fetch()) !=false)$array[] = $row;return $array;}

Скорее всего тут дело в том, что я не до конца разобрался, как работают функции. Решил, что функция, описанная, выше, вернёт мне переменную $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);}

где return dataToArray($data); используется в самом низу. Совсем запутался... Видимо, нужно занести результат работы функции в переменную, Вы правы. плюс мне дали почитать про область видимости переменной Возможно, ещё тут где-то напортачил. поэтому мне phpstorm и выдавал ошибку в переменной $pdo, которая была в отдельном файле подключения к Базе данных, пока я всё подключение не перенес в функцию

 

С матчастью у меня проблемы :unsure:

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy