高级搜索mysql perl

高级搜索mysql perl,mysql,perl,search-engine,Mysql,Perl,Search Engine,我是个新手。我已经搜索Stackoverflow几个星期了,试图找到高级搜索的代码。 终于创造了我自己。它工作得很好。我在这里列出它是为了其他可能想使用它的人。 问题是: 当没有选择任何项目类别时,我默认为*但它不起作用。 item_category是搜索所需的唯一变量 我是否需要关注消毒或黑客注射 精确匹配似乎不起作用。它可能正在搜索100个单词的“FREE”,但找不到匹配项。有什么想法吗 对可靠性和速度问题有什么建议吗 $ANDOR=参数'ANDOR';创建AND或OR搜索 如果$ANDOR

我是个新手。我已经搜索Stackoverflow几个星期了,试图找到高级搜索的代码。 终于创造了我自己。它工作得很好。我在这里列出它是为了其他可能想使用它的人。 问题是:

当没有选择任何项目类别时,我默认为*但它不起作用。 item_category是搜索所需的唯一变量

我是否需要关注消毒或黑客注射

精确匹配似乎不起作用。它可能正在搜索100个单词的“FREE”,但找不到匹配项。有什么想法吗

对可靠性和速度问题有什么建议吗

$ANDOR=参数'ANDOR';创建AND或OR搜索 如果$ANDOR等式{$ANDOR=AND;}

如果$item\u类别{ $item\u category=$item\u category; }else{$item_category=*;} $statement.=项目\类别,如“$item\类别”

如果$item_状态{ $statement.=$ANDOR类似于“$item_state”的item_state”; } 如果$item_城市{ $statement.=$ANDOR item_city类似于“$item_city”; } 如果$db_id{ $statement.=$ANDOR db_id='$db_id'; }

$keywords=参数'keywords'

如果$keywords { ifparam“searchmatch”eq精确 { $statement.=$ANDOR item\u name=\$keywords\或item\u desc=\$keywords\ 或项目描述2=\$keywords\

} 其他的 {$statement.=$ANDOR; my@keywords=split/,$keywords

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

$date_begin=参数'date_begin'; 如果$date\u开始{ $statement.=$ANDOR modification_time>“$date_begin”; }

如果$user{ $statement.=$ANDOR类似于“$user”的用户; }

$price_low=参数'price_low'; $price_high=参数‘price_high’; 如果$price\u低和$price\u高{ $statement.=$AND或项目价格介于$price\u low'和$price\u high'之间; } elsif$price\u low和$price\u high均衡器{ $statement.=$AND或项目价格介于“$price\u low”和*”之间; } elsif$price\u高和$price\u低均衡器{ $statement.=$ANDOR项目价格介于'0'和'$price\u high'之间; } 其他的 { $statement.=

}

我的$sth=$dbh->prepareqqSELECT*来自$statement所在的表 或者死$DBI::errstr; $sth->execute; 而我的@rows=$sth->fetchrow\u数组 { $total\u row\u count=$sth->rows; $database_rows=join\|,@rows; 推送@database\u rows,$database\u rows; }

不是where子句的有效条件。您可以将1替换为,但更好的是省略where子句的这一部分

对,;使用参数绑定。e、 g

if ($item_state) {
    $statement .= " $ANDOR item_state LIKE ? ";
    push(@binds, $item_state);
}
然后,要使DBI正确清理并包含您的参数:

$sth->execute(@binds);
检查生成的完整查询。我怀疑,如果你看一下和/或优先规则,它不会像你想的那样,你也许可以明智地使用括号

不要这样做。在CPAN上查找一些为您做后端工作的东西,并使用适当的参数调用它。在你使用了其他人为此编写的工具之后,你会对所有你没有处理的情况有一个很好的了解,然后可以考虑如何添加你认为缺少的内容,如果你决定再次进行搜索


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

Re 3,你猜对了。并且具有比或更高的优先级,因此精确的搜索子句需要parens。谢谢。修改后的代码效果很好。只是不知道如何发布它。。。