Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl MySQL全文搜索_Mysql_Perl_Full Text Search_Dbi - Fatal编程技术网

Perl MySQL全文搜索

Perl MySQL全文搜索,mysql,perl,full-text-search,dbi,Mysql,Perl,Full Text Search,Dbi,我是这个网站的新手 我有下面的代码来搜索带有全文索引的三列。(searchdatabase.title,searchdatabase.keywords,searchdatabase.description) $SQL\u QUERY=prepare(“$SQL\u QUERY”); $cursor->execute; 由于我对Perl全文搜索和SQL的了解有限,在上面的代码之前,我有以下代码来执行一些SQL注入预防,并使用空格“+”进行搜索 $datasent =~ s/ / +/g; $da

我是这个网站的新手

我有下面的代码来搜索带有全文索引的三列。(searchdatabase.title,searchdatabase.keywords,searchdatabase.description)

$SQL\u QUERY=prepare(“$SQL\u QUERY”);
$cursor->execute;
由于我对Perl全文搜索和SQL的了解有限,在上面的代码之前,我有以下代码来执行一些SQL注入预防,并使用空格“+”进行搜索

$datasent =~ s/ / +/g;
$datasent =~ s/ / +/g;
$datasent =~ s/\n//g;
$datasent =~ s/<//g;
$datasent =~ s/\x00//g;
$datasent =~ s/\r//g;
$datasent =~ s/\x1a//g;
$datasent =~ s/\;//g; 
$datasent =~ s/\*//g; 
$datasent =~ s/\'//g; 
$datasent =~ s/\"//g; 
$datasent=~s/+/+/g;
$datasent=~s/ / +/G
$datasent=~s/\n//g;
$datasent=~s/是这里的方法。它会帮你处理逃跑的事情

my $sql = <<'CURSOR_1';
select distinct url, keywords, description, title
from searchdatabase where
match ( searchdatabase.title, searchdatabase.keywords, searchdatabase.description )
against (? IN BOOLEAN MODE)
order by authority_rank desc, rank desc limit 10 offset $page;
CURSOR_1
对于
$page
这将不起作用,因为它不是WHERE子句的一部分。相反,您应该确保它包含一个数字,以防它来自外部

die 'offset needs to be numeric' if $page =~ /\D/;

由于您是新用户,以下是有关代码的一些注释:

  • 始终
    使用严格的
    使用警告
    ——它们让你的生活更轻松
  • 然后用
    my
  • $ALL_CAPS
    变量通常用于Perl中的全局变量
  • 在DBI上下文中,语句句柄通常命名为
    $sth
  • 不要在
    &foo()
    中使用符号AND,它不会按您的想法操作
  • 插值不需要将单变量放在双引号中

除了@simbabque的伟大建议,让我解释一下
+
替代

默认情况下,全文搜索
BOOLEAN
模式可能不会达到预期效果。“默认情况下(当未指定+或-时),该词是可选的,但包含该词的行的评级更高…”请参阅

因此,如果您的用户搜索
redapple
,他们将获得mysql决定的具有“red”或“apple”优先级的任何内容。你可能会认为这不是他们想要的。因此,在后端,您可以将用户的搜索替换为
+red+apple
,它告诉mysql搜索“red AND apple”

这就是我所拥有的

$datasent =~ s/[+\-<>)(]/ /g;     #These have special meaning in the sql search that people probably don't want.
$datasent =~ s/(".*?"|\S+)/+$1/g; #Add '+' for the boolean search and pay attention to quotes.
$datasent=~s/[+\-)(]//g;#这些在sql搜索中有着人们可能不想要的特殊意义。
$datasent=~s/(“*?”|\s+/+$1/g;#为布尔搜索添加“+”,并注意引号。

谢谢你的建议,我已经编辑了代码,使其适合。现在更好了吗?非常感谢,让限制和偏移在布尔模式下具有占位符和占位符成功了!@TsubasaKato很高兴我能提供帮助。请学习如何接受解决问题的答案:)是的,这就是我想先弄明白的。我忘了在$datasent部分添加一点。我编码了
$datasent=“\+$datasent”位于+替换行前面。这是正确的吗?在类似的代码中,我首先去掉所有的“+”和“-”符号,然后重新添加它们,注意带引号的字符串。我可以用这些信息来更新我的答案,但是现在还没找到。谢谢你的建议。我会设法按照你的建议去做。
die 'offset needs to be numeric' if $page =~ /\D/;
$datasent =~ s/[+\-<>)(]/ /g;     #These have special meaning in the sql search that people probably don't want.
$datasent =~ s/(".*?"|\S+)/+$1/g; #Add '+' for the boolean search and pay attention to quotes.