【问题标题】:Adding filters to dynamic search engine php将过滤器添加到动态搜索引擎 php
【发布时间】:2013-11-25 14:12:32
【问题描述】:

我正在为我的数据库添加过滤器,但我不知道,谷歌也没有真正提供帮助,所以我感谢所有建议 =)

我想添加名称和价格等过滤器,并按升序和降序排列。

我的数据库有 4 列,id(int15)、brand/model(varchar50)、picture(longblob)、price (varchar50)。

关于如何解决这个问题的任何建议(最好有一些例子,因为我是初学者)? 目前,我在下面创建了 asc 和 desc 表单,但我不知道如何集成到我的 php 代码中。我已将表单名称设置为“results

我目前拥有的是 index.php

<form action="search.php" type="text"  method="POST">
Name: <input type ="text" name="search_name" size='30' /> 
<input type="submit" value="Search">
<br><br>
<b>Arrange Price by :</b>

<select name="results">
<option value="">Select...</option>
<option value="asc">Ascending</option>
<option value="desc">Descending</option>
</select>

<?php

if (isset($_POST['search_name'])) {
        $search_name = $_POST['search_name'];

        if (!empty($search_name)){

            if (strlen($search_name)>=3) {

            $query = "SELECT * FROM `shoes` WHERE `brand/model` LIKE '".mysql_real_escape_string($search_name)."%' ORDER BY `price` ASC";
            $query_run = mysql_query($query);
            $query_num_rows = mysql_num_rows($query_run);

            if ($query_num_rows>=1) {
                echo $query_num_rows.' Results found:<br>';

                while ($query_row = mysql_fetch_array($query_run)) {


                        $picture = $query_row['picture'];
                        echo "</br>";
                        echo $query_row ['brand/model']; 
                        echo str_repeat('&nbsp;', 15); // adds 5 spaces
                        echo $query_row ['price'];
                        echo "</br>";
                        echo "</br>";
                        //header("content-type: image/jpeg");
                        echo "<img src='image.php?id=".$query_row['id']."' width='300' height='200' />";
                        echo "</br>";



                }
            } else {
                echo 'No Results Found.';
            }
        } else {
            echo 'Text field must be more than 3 characters.';
        }

    } else {
        echo 'Text Field Cannot be Empty!';
    }
}

?>

【问题讨论】:

    标签: php mysql database searchable


    【解决方案1】:

    尝试使用此代码,

    • 我所做的更改是,将您的字段名称的锚点创建为表头
    • 默认情况下标题是ASC顺序,如果我们点击它,它会变成DESC顺序
    • sql 查询然后使用 GET 中的字段名称对记录进行排序
    • 搜索词也会保存在 GET 请求中,以便我们可以将其保留在前面
    • 由于搜索词有时在 GET 中收到,有时在 POST 中收到,因此在此处使用 REQUEST 来获取数据

        if (!empty($search_name)){
    
            if (strlen($search_name)>=3) {
    
                if(empty($_REQUEST['searchTrm']))
                    $_REQUEST['searchTrm'] = 'price';
    
                if(empty($_REQUEST['order']))
                    $_REQUEST['order'] = 'ASC';
    
                $query = "SELECT * FROM `shoes` WHERE `brand/model` LIKE '".mysql_real_escape_string($search_name)."%' ORDER BY ".$_REQUEST['searchTrm']." ".$_REQUEST['order'];
    
                $query_run = mysql_query($query);
                $query_num_rows = mysql_num_rows($query_run);
    
            if ($query_num_rows>=1) {
                echo $query_num_rows.' Results found:<br>';
    ?>
            <table border=1>
                <tr>
                    <td>
                        <?php
    //use your sql field name as searchTrm value
    if($_REQUEST['searchTrm'] == 'brand/model' && $_REQUEST['order'] == 'DESC') { ?>
                            <a href='?searchTrm=brand/model&order=ASC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'ASC'>Brand Name</a>
                        <?php } else { ?>
                            <a href='?searchTrm=brand/model&order=DESC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'DESC'>Brand Name</a>
                        <?php } ?>
                    </td>
                    <td>
                        <?php if($_REQUEST['searchTrm'] == 'price' && $_REQUEST['order'] == 'DESC') { ?>
                            <a href='?searchTrm=price&order=ASC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'ASC'>Price</a>
                        <?php } else { ?>
                            <a href='?searchTrm=price&order=DESC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'DESC'>Price</a>
                        <?php } ?>
                    </td>
                    <td>Image</td>
                </tr>
                <?php
                while ($query_row = mysql_fetch_array($query_run)) {
                     $picture = $query_row['picture'];
                    ?>
                    <tr>
                        <td><?php echo $query_row['brand/model'];?></td>
                        <td><?php echo $query_row['price'];?></td>
                        <td><img src='image.php?id=<?php echo $query_row['id'];?>' width='300' height='200' /></td>
                    </tr>
                    <?php
                }
            ?> </table> <?php
            } else {
                echo 'No Results Found.';
            }
        } else {
            echo 'Text field must be more than 3 characters.';
        }
    
    } else {
        echo 'Text Field Cannot be Empty!';
    }
    }
    

    【讨论】:

    • 嗨,我是否将所有 searchTrm 替换为我想要的字段?
    • 您必须使用您想要的字段创建那些没有 td,即每个 td 将通过您的搜索词代表一个字段
    • 你好,谢谢你的回复,但是我输入代码后我的图片没有显示
    • 检查了代码,唯一漏掉的就是$picture = $query_row['picture'];,不知道是否重要,已编辑答案,请立即查看
    • 嗨 deepika,对不起,它不起作用,图片不会出来=(图片在这里:imgur.com/H3Qrus0
    【解决方案2】:

    只要您清理输入以防止 SQL 注入,就可以使用 POST。为了进一步保护自己,您可以使用准备好的语句。另外,我看到您正在使用 mysql_* API。我强烈建议您改用 MySQLi 或 PDO。在这种情况下,我将重点介绍 MySQLi,因为它看起来好像您正在使用 MySQL(尽管 PDO 也适用于 MySQL)。

    对于搜索组件:

    如果字段已被索引,则最好搜索它们。数据库将在幕后使用它来更快地获取您的数据。但是,像您一样使用带有通配符 (%) 的 LIKE % &lt;your search string&gt; % 将否定您放置在列上的任何索引。这是因为在搜索的左侧使用通配符不允许 MySQL 使用索引。 (长话短说,除非它扫描整个表,否则它根本无法确定文本是否匹配。)听起来您需要的是一个FULLTEXT 索引,您可以使用MATCH...AGAINST 语法运行查询。如果需要,您可以在索引列上使用 LIKE,但删除左侧通配符,例如:SELECT * FROM ...... LIKE 'your search value'% .....

    因此,我建议您从这里开始研究以下概念/主题:

  • 使用 MySQLi(或 PDO)在 PHP 中准备语句
  • 列索引(特别是用于搜索目的的FULLTEXT 索引)
  • 全文搜索 MyISAM 表 (MySQL
  • FULLTEXT 的内部“评分”以及如何使用它
  • 布尔和自然语言搜索。
  • 添加您想要的搜索过滤器是一个不错的功能,但它比您尝试做的要多一些。 (相信我,Google 会为您提供大量信息和这些主题。这是练习和习惯使用 MySQL 的新功能的问题。)

    【讨论】:

      【解决方案3】:

      • 使用 PDO 或 Mysqli 准备好的语句。 • 我将使用正则表达式过滤输入(删除所有非单词、数字和一些字符)。

      example: $string = preg_replace('~[^\w\s-_\.,]~','',$string);
      

      • 我将使用全文搜索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        相关资源
        最近更新 更多