为什么';当我建立一个Mysql查询时,我的变量插值是否正确?

为什么';当我建立一个Mysql查询时,我的变量插值是否正确?,mysql,perl,Mysql,Perl,我正试图从一个Perl程序中用mysql编写一个正则表达式。我想要这样的查询: WHERE a.keywords REGEXP '[[:<:]]something[[:>:]]' 其中a.keywords REGEXP'[[::]] 但是,在Perl中,当我进行此查询时,连接时会出现错误: for($i=0;$i<$count;$i++){ $where = $where . "'[[:<:]]$andkeywords[$i][[:>:]]' "; #

我正试图从一个Perl程序中用mysql编写一个正则表达式。我想要这样的查询:

WHERE a.keywords REGEXP '[[:<:]]something[[:>:]]'
其中a.keywords REGEXP'[[::]]
但是,在Perl中,当我进行此查询时,连接时会出现错误:

for($i=0;$i<$count;$i++){
    $where = $where . "'[[:<:]]$andkeywords[$i][[:>:]]' ";  #errors

<代码> >($i=0;$i)我从未真正相信这样的字符串中变量的自动调整。您可能需要考虑明确地进行这样的连接:

for($i=0;$i<$count;$i++){
    $where=$where . "'[[:<:]]" . $andkeywords[$i] . "[[:>:]]' ";

<代码> >($i=0;$i)我从未真正相信这样的字符串中变量的自动调整。您可能需要考虑明确地进行这样的连接:

for($i=0;$i<$count;$i++){
    $where=$where . "'[[:<:]]" . $andkeywords[$i] . "[[:>:]]' ";

对于($i=0;$i本例中的原因是“$andkeywords[$i][[:>:]]”被解释为多维数组,而:>:不是有效的数组索引

我个人更喜欢Mykroft的方法,但你也可以通过避开最后一个开口括号来达到同样的效果,如下所示:

$where=$where."'[[:<:]]$andkeywords[$i]\[[:>:]]' ";
$where=$where.“[[::]]”;

本例中的原因是“$andkeywords[$i][[:>:]]”被解释为多维数组,而:>:不是有效的数组索引

我个人更喜欢Mykroft的方法,但你也可以通过避开最后一个开口括号来达到同样的效果,如下所示:

$where=$where."'[[:<:]]$andkeywords[$i]\[[:>:]]' ";
$where=$where.“[[::]]”;

为了完整起见,这也适用:

for ($i = 0; $i < $count; $i++) {
    $where .= "'[[:<:]]${andkeywords[$i]}[[:>:]]' ";
}
($i=0;$i<$count;$i++)的
{
$where.=“[[::]]”;
}
${blah}
在字符串外部无效,但在可插入字符串内部,它等效于
$blah


我本以为这种模式比其他答案更常见,不过……毕竟,你还想怎么键入
“foo${var}bar”
?显然
“foo$var\bar”
不起作用,因为
\b
是一个公认的转义序列。

为了完整起见,这也起作用:

for ($i = 0; $i < $count; $i++) {
    $where .= "'[[:<:]]${andkeywords[$i]}[[:>:]]' ";
}
($i=0;$i<$count;$i++)的
{
$where.=“[[::]]”;
}
${blah}
在字符串外部无效,但在可插入字符串内部,它等效于
$blah

我本以为这种模式比其他答案更常见,不过……毕竟,你还想怎么键入
“foo${var}bar”
?显然
“foo$var\bar”
不起作用,因为
\b
是公认的转义序列。

请为每个正则表达式值使用
DBI
参数,而不是插值。为什么

  • 对于允许使用的字符不再有任何限制。当前,如果
    @和关键字
    的任何元素包含引号、反斜杠或特殊正则表达式字符,则会出现问题。例如,关键字
    “O'Reilly”
    将导致数据库错误
  • 人们将无法构造恶意关键字来泄露他们不应该看到或破坏的信息。(想象一下,如果用户输入
    ”;删除数据库;“
    ”作为关键字。)这称为SQL注入攻击,而web上充斥着易受其影响的编码糟糕的网站。不要让你的网站成为其中之一
  • 即使没有从用户输入的数据中填充
    @和关键字
    ,使用DBI参数几乎不需要额外的努力,您的代码在未来未知环境中也可以安全使用

    请为每个正则表达式值使用
    DBI
    参数,而不是插值。为什么

  • 对于允许使用的字符不再有任何限制。当前,如果
    @和关键字
    的任何元素包含引号、反斜杠或特殊正则表达式字符,则会出现问题。例如,关键字
    “O'Reilly”
    将导致数据库错误
  • 人们将无法构造恶意关键字来泄露他们不应该看到或破坏的信息。(想象一下,如果用户输入
    ”;删除数据库;“
    ”作为关键字。)这称为SQL注入攻击,而web上充斥着易受其影响的编码糟糕的网站。不要让你的网站成为其中之一
  • 即使没有从用户输入的数据中填充
    @和关键字
    ,使用DBI参数几乎不需要额外的努力,您的代码在未来未知环境中也可以安全使用


    如果您能包含任何错误消息的文本,那将非常有用

    有些事告诉我

    for($i=0;$i<$count;$i++){
        $where=$where . "'[[:<:]]" . $andkeywords[$i] . "[[:>:]]' ";
        ...
    }
    

    对于($i=0;$i),如果您能包含任何错误消息的文本,这将非常有用

    有些事告诉我

    for($i=0;$i<$count;$i++){
        $where=$where . "'[[:<:]]" . $andkeywords[$i] . "[[:>:]]' ";
        ...
    }
    

    for($i=0;$iI在同一帖子中看到“官方正确方式”和“TMTOWTDI”会产生认知不和谐;)在同一帖子中看到“官方正确方式”和“TMTOWTDI”会产生认知不和谐;)谢谢你,jrh,除了回答“我如何插入这个字符串”之外,还要补充一句“但是你真的不应该首先在那里插入一个字符串”。谢谢你,jrh,除了回答“我如何插入这个字符串”之外,还要加上“但是你真的不应该首先在那里插入一个字符串”。在你的消息中包含错误总是很有帮助的。:)在邮件中包含错误总是很有帮助的。:)