为什么';当我建立一个Mysql查询时,我的变量插值是否正确?
我正试图从一个Perl程序中用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][[:>:]]' "; #
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,除了回答“我如何插入这个字符串”之外,还要加上“但是你真的不应该首先在那里插入一个字符串”。在你的消息中包含错误总是很有帮助的。:)在邮件中包含错误总是很有帮助的。:)