Jump to content
  • 0

Проблема поиска соответствий в базе оператором LIKE


Torawhite
 Share

Question

Здравствуйте! Пишу поиск по базе данных с помощью оператора LIKE. Не могу понять где я ошибся, выборку делаю через PDO. В PHP я начинающий, возможно я не так понял синтаксис:

 

$name "%$name%";
$stm  $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stm->execute(array($name));
$data $stm->fetchAll();

Не совсем ясно значение "%" и "?". % - подразумеваю, чтобы запрос искался, как часть слова. А "?", возможно, переменная.

 Выборку делаю таким образом:

$search = trim($search);$search = stripcslashes($search);$search = htmlspecialchars($search);$sql = 'SELECT * FROM female_articles WHERE title OR text LIKE :search';$data = $pdo->prepare($sql);$data->bindValue (':search', $search);$data->execute();$row = $data->fetch();

Весь код обработчика:

<?php    $root = $_SERVER['DOCUMENT_ROOT'];    include ($root . "/blocks/gb_tw_mag.php");    if (isset($_POST['search'])) {        $search = $_POST['search'];    }        if (isset($_POST['search_select'])) {        $search_select = $_POST['search_select'];    }    if (isset($_POST['search_submit'])) {        $search_submit = $_POST['search_submit'];    }?><!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="description" content="Журнал о стиле и образе жизни"><meta name="keywords" content="Журнал, мужской журнал, женский журнал, интернет-журнал"><title>Torawhite.ru - Store & Magazine | Журнал | Результаты поиска</title>    <?php        include ($root . "/blocks/favicon.php");    ?><!--Таблицы стилей--><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/reset.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/input_reset.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/main.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/fonts.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/header.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/magazine/magazine_css/magazine_left_sidebar.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/magazine/magazine_css/article_block.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/magazine/magazine_css/magazine_right_sidebar.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/magazine/magazine_css/top_nav_magazine.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/bottom_nav.css"><link rel="stylesheet" type="text/css" href="http://www.torawhite.ru/css/footer.css">    <?php        include ($root . "/magazine/magazine_blocks/magazine_scripts_head.php");    ?></head><body>    <div class="wrapper">        <?php            include ($root . "/blocks/header.php");            include ($root . "/magazine/magazine_blocks/top_nav_magazine.php");        ?>        <div class="magazine_container">            <?php                include ($root . "/magazine/magazine_blocks/magazine_left_sidebar.php");            ?>            <div class='article_block_box'>                <?php                    if (isset($search_submit) AND $search_select == 'all') {                                if (empty($search) or strlen($search) < 4) {                            echo "<div class='search_title_attention'>Поисковый запрос не введён, либо он менее 4-х символов!</div>";                        }                        else {                            $search = trim($search);                            $search = stripcslashes($search);                            $search = htmlspecialchars($search);                            $sql = 'SELECT * FROM female_articles WHERE title OR text LIKE :search';                            $data = $pdo->prepare($sql);                            $data->bindValue (':search', $search);                            $data->execute();                            $row = $data->fetch();                            if ($data->rowCount() > 0) {                                        while ($row = $data->fetch())                                        {                                        if ($row["cat"] == 1) {                                        $catb = 'Стиль';                                        $cat_link = 'http://torawhite.ru/magazine/male_articles/style/';                                        }                                        elseif ($row["cat"] == 2) {                                        $catb = 'Спорт';                                        $cat_link = 'http://torawhite.ru/magazine/male_articles/sport/';                                        }                                        elseif ($row["cat"] == 3) {                                        $catb = 'Питание';                                        $cat_link = 'http://torawhite.ru/magazine/male_articles/diet/';                                        }                                        else {                                                                $catb = 'Бизнес';                                        $cat_link = 'http://torawhite.ru/magazine/male_articles/business/';                                        }                                        printf("                                            <div class='article_block'>                                                <div class='cover_img'><a href='$cat_link' target='_self' title='Перейти в рубрику'>$catb</a></div>                                                 <a href='view_article.php?id=%s' target='_self' title='%s'><img src='%s' width='640'></a>                                                 <div class='article_block_name'>                                                     <p><a href='view_article.php?id=%s' target='_self'>%s</a></p>                                                 </div>                                                 <ul class='article_block_date'>                                                     <li>                                                         %s |                                                     </li>                                                 </ul>                                                 <ul class='article_block_author'>                                                     <li>                                                         <a href='%s' target='_self'>%s</a>                                                     </li>                                                 </ul>                                                 <ul class='article_block_eye_box'>                                                     <li>                                                         <img src='http://www.torawhite.ru/images/eye.svg' align='middle'> %s                                                     </li>                                                 </ul>                                                 <div class='article_block_text'>                                                     %s                                                 </div>                                                 <div class='article_block_full_story'>                                                     <a href='view_article.php?id=%s' target='_self'>Читать полностью</a>                                                 </div>                                            </div>", $row["id"], $row["title"], $row["article_img"], $row["id"], $row["title"], $row["article_date"], $row["author_link"], $row["author"], $row["view"], $row["description"], $row["id"]);                                    }                                           }                                    else                                    {                                        echo "<div class='search_title'>По Вашему запросу статей не найдено</div>";                                    }                            }                        }                    else {                        echo "<div class='search_title_attention'>Вы обратились к файлу без необходимых параметров!</div>";                        }                                                                ?>            </div>            <?php                include ($root . "/magazine/magazine_blocks/magazine_right_sidebar.php");                ?>        <div class="clear"></div>            </div>        <?php            include ($root . "/blocks/bottom_nav.php");            include ($root . "/blocks/footer.php");        ?>    </div><?php    include ($root . "/blocks/scripts_body.php");?></body></html>

В итоге мне сразу выдаёт:

else    {     echo "<div class='search_title'>По Вашему запросу статей не найдено</div>";    }

Хотя текст запроса в базе имеется точно! Прошу Вас помочь разобраться.

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Текст запроса покажите, который получается и подробнее об алгоритме поиска.

 

Если нужно, чтоб в выборку попали строки где в столбцах title и text встречалось переданное значение, тогда запрос должен быть следующего вида:

SELECT    *FROM    female_articlesWHERE    title LIKE "%искать%"    OR text LIKE "%искать%"

Попробуйте подправить свой код следующим образом:

$search = trim($search);$search = stripcslashes($search);$search = htmlspecialchars($search);$sql = 'SELECT * FROM female_articles WHERE title LIKE :search1 OR text LIKE :search2';$data = $pdo->prepare($sql);$data->bindValue (':search1', '%'. $search .'%');$data->bindValue (':search2', '%'. $search .'%');$data->execute();$row = $data->fetch();

Для полей title и text желательно создать полнотекстовый индекс. При использовании в поисковом шаблоне оператора LIKE спец символа "%" в первой позиции, обычные индексы будут игнорироваться. 

-- использование индекса, созданного для столбца title невозможно-- желательно создать полнотекстовый индексSELECT * FROM female_articles WHERE title LIKE "%search%";-- будет использован индекс, созданный для столбца titleSELECT * FROM female_articles WHERE title LIKE "search%";
Edited by CoDy
Link to comment
Share on other sites

  • 0

 

Текст запроса покажите, который получается и подробнее об алгоритме поиска.

 

Если нужно, чтоб в выборку попали строки где в столбцах title и text встречалось переданное значение, тогда запрос должен быть следующего вида:

SELECT    *FROM    female_articlesWHERE    title LIKE "%искать%"    OR text LIKE "%искать%"

Попробуйте подправить свой код следующим образом:

$search = trim($search);$search = stripcslashes($search);$search = htmlspecialchars($search);$sql = 'SELECT * FROM female_articles WHERE title LIKE :search1 OR text LIKE :search2';$data = $pdo->prepare($sql);$data->bindValue (':search1', '%'. $search .'%');$data->bindValue (':search2', '%'. $search .'%');$data->execute();$row = $data->fetch();

Для полей title и text желательно создать полнотекстовый индекс. При использовании в поисковом шаблоне оператора LIKE спец символа "%" в первой позиции, обычные индексы будут игнорироваться. 

-- использование индекса, созданного для столбца title невозможно-- желательно создать полнотекстовый индексSELECT * FROM female_articles WHERE title LIKE "%search%";-- будет использован индекс, созданный для столбца titleSELECT * FROM female_articles WHERE title LIKE "search%";

Здравствуйте! Времени не было попробовать. Спасибо за ответ! Не помогло, ничего не ищет, причем даже без переменной - просто вставляю конкретное слово в запрос, которое есть в тексте - результата нет. Полнотекстовые индексы у данных столбцов я проставил.

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