【问题标题】:Advanced Search mysql perl [closed]高级搜索 mysql perl [关闭]
【发布时间】:2013-08-16 02:08:26
【问题描述】:

我是新手。我已经搜索了数周的 Stackoverflow,试图找到高级搜索的代码。
终于创建了我自己的。它工作得很好。我在此处列出它以供可能想要使用它的其他人使用。
问题是:

  • 当没有选择 item_category 时,我默认为 *,但它不起作用。 item_category 是搜索所需的唯一变量?

  • 我需要担心消毒或黑客注射吗?

  • 完全匹配似乎不起作用。它可能在 100 个单词中搜索“FREE”,但找不到匹配项。有什么想法吗?

  • 关于可靠性和速度问题有什么建议吗?

    $ANDOR = param('andor');#创建 AND OR 搜索 if($ANDOR eq ""){ $ANDOR="AND";}

    如果($item_category){ $item_category = "$item_category"; } 其他{ $item_category=" * "; } $statement .= "item_category LIKE '$item_category' ";

    如果($item_state){ $statement .= "$ANDOR item_state LIKE '$item_state'"; } 如果($item_city){ $statement .= "$ANDOR item_city LIKE '$item_city'"; } 如果($db_id){ $statement .= "$ANDOR db_id = '$db_id'"; }

    $keywords=param('keywords');

    如果($关键字) { if(param('searchmatch') eq "exact") { $statement .= " $ANDOR item_name = \"$keywords\" OR item_desc = \"$keywords\" 或 item_desc2 = \"$keywords\" ";#

    } 别的 { $statement .= " $ANDOR "; 我的@keywords = split(/ /,$keywords);

    foreach my $keyword(@keywords)
    {
    $statement .= " item_name LIKE '%$keyword%' 
    OR item_desc LIKE '%$keyword%' 
    OR item_desc2 LIKE '%$keyword%' ";
    }
    

    } }

    $date_begin=param('date_begin'); 如果($date_begin){ $statement .= " $ANDOR 修改时间 > '$date_begin'"; }

    如果($用户){ $statement .= " $ANDOR user LIKE '$user' "; }

    $price_low=param('price_low'); $price_high=param('price_high'); 如果 (($price_low) && ($price_high)){ $statement .= " $ANDOR item_price BETWEEN '$price_low' AND '$price_high' "; } elsif (($price_low) && ($price_high eq "")){ $statement .= " $ANDOR item_price BETWEEN '$price_low' AND * "; } elsif (($price_high) && ($price_low eq "")){ $statement .= " $ANDOR item_price BETWEEN '0' AND '$price_high' "; } 别的 { $statement .= "";

    }

    我的 $sth = $dbh->prepare(qq(SELECT * FROM table WHERE $statement )) 或死 $DBI::errstr; $sth->执行(); 而 ((我的 (@rows)) = $sth->fetchrow_array) { $total_row_count= $sth->rows; $database_rows = 加入(“\|”,@rows); 推(@database_rows,$database_rows); }

【问题讨论】:

    标签: mysql perl search-engine


    【解决方案1】:
    1. '' 不是 where 子句的有效条件。您可以只输入“1”而不是“”,但更好的是省略 where 子句的那部分。

    2. 是的;使用参数绑定。例如

      if ($item_state) {
          $statement .= " $ANDOR item_state LIKE ? ";
          push(@binds, $item_state);
      }
      

      然后让 DBI 正确清理并包含您的参数:

      $sth->execute(@binds);
      
    3. 检查生成的完整查询。我怀疑如果您查看 AND/OR 优先规则,它并没有按照您的想法做,您可能能够明智地使用括号。

    4. 不要这样做。在 CPAN 上寻找可以为您完成后端工作的东西,然后使用适当的参数调用它。在您使用了其他人为此编写的工具之后,您将对您未处理的所有案例有一个很好的了解,然后可以考虑如果您决定重新访问该工具,如何添加您认为缺少的内容再次搜索的想法。

    此时我已经编写了大约 4 次简单的 DB 查询引擎/小型 ORM,其中 3 次使用 perl。每次我学到新东西,但更重要的是每次我记得为什么我应该使用其他已经找到所有边缘案例的人的解决方案。

    【讨论】:

    • Re (3),你猜对了。 AND 的优先级高于 OR,因此“精确”搜索子句需要括号。
    • 谢谢。修改后的代码效果很好。就是不知道怎么发……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多