【问题标题】:having trouble search through mysql database无法通过 mysql 数据库搜索
【发布时间】:2011-12-02 18:28:07
【问题描述】:

我有两个关于脚本和搜索的问题。我有这个脚本:

$searchTerms = explode(' ', $varSearch);
$searchTermBits = array();
foreach($searchTerms as $term){
    $term = trim($term);
    if(!empty($term)){
        $searchTermBits[] = "column1 LIKE '%".$term."%'";
    }
}

$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits)."");

我有一个列 1,其数据名称为“在这里攀岩欢呼”

如果我输入“攀岩”,这个数据就会显示出来。这很完美,但如果我只输入“Rocks”,它就不会显示。这是为什么呢?

另外,如何为要搜索的关键字添加另一个“column2”?

谢谢!

【问题讨论】:

    标签: php mysql arrays search


    【解决方案1】:

    在该字符串中搜索“rocks”不起作用,因为数据中不存在字符串“rocks”。看着它,对你来说是有道理的,因为你知道“rock”的复数形式是“rocks”,但是数据库不知道。

    您可以尝试的一个选项是从搜索字词中删除 S,但您会遇到其他问题 - 例如,“berry”的复数形式是“berries”,如果您删除 S,您将搜索“berrie”,这不会让你更进一步。

    您可以通过添加更多行来添加更多搜索词

    $searchTermBits[] = "column1 LIKE '%".$term."%'";
    

    并将".$term." 替换为您要搜索的内容。例如,

    $searchTermBits[] = "column1 LIKE '%climb%'";
    

    另一件需要注意的事情...正如所写,您的代码容易受到 SQL 注入的影响。举个例子……如果网站访问者输入搜索词'; DROP TABLE tablename; 你的数据刚刚被清除了怎么办。

    您应该做的是修改您的 searchTermBits[] 行,使其看起来像:

    $searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'";
    

    这将防止任何不良行为损害您的数据。

    【讨论】:

    • '; drop table' 位在 mysql_query 中为真,因为该函数将允许 1 个且仅 1 个查询运行。但是,您可以遇到' or (1=1) UNION select password, username, email from users -- 类型的查询,其中敏感数据会流式传输到屏幕上。
    • 我考虑过sql注入。因为简单,我没有在这里展示。但谢谢你仍然提到它。另外,我不喜欢只使用“爬升”,因为这将是一个动态页面,我将使用多个单词并且在我的数据库中有多个单词。但是我正在尝试获取它,以便在搜索岩石时显示岩石,我怎么能做这样的脚本?
    • “爬升”线是一个例子。您可以拥有任意数量的 $searchTermBits[] = "..." 行 - 您正在创建一系列条件。因此,您可以添加 $term1、$term2、$term3 等。
    【解决方案2】:

    假设您提供的数据是准确的,它不应该匹配,因为您使用的是“Rocks”并且字符串中的单词是“rock”。默认情况下mysql不做区分大小写的匹配,所以可能不是这样。

    另外,为了避免 sql 注入,你绝对应该使用 mysql_real_escape_string 来转义你的内容。

    添加第二列也很容易。只需为每个搜索词在数组中添加两个条目,一个用于 column1,一个用于 column2。

    【讨论】:

      【解决方案3】:
      1. 您的 column1 数据 rock cheer climbing here 您的搜索条件 %Rocks% 它根本不适合,因为 rocks 不在您的 column1 数据中

      2. 您可以像添加 column1 一样添加 column2,然后使用 AND 运算符将它们放在一起 (column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

      提示: 如果您的表/模式使用 xx_xx_ci 排序规则(那么这是不区分大小写的意思,mysql 不关心大小写)但如果不是,那么您需要确保搜索词必须区分大小写(mysql 区分大小写)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多