Perl:使用一个MySQL调用更新多行

时间:2010-01-03 09:14:45

标签: mysql perl

似乎可能不可能,但是嘿,我不妨问,我可能是错的。想知道是否有任何perl使用一个MySQL调用来更新多行,我正在使用DBI。

非常感谢任何帮助或反馈,这在MSSQL中通过ASP和ASP.net是可能的,所以想知道是否也可以通过MySQL上的perl。

感谢您的反馈!

2 个答案:

答案 0 :(得分:14)

首先也是最重要的,你绝对不应该直接将变量插入到SQL字符串中。这留下了SQL注入攻击的可能性。即使这些变量不是来自用户输入,也会留下可能导致数据混乱的危险错误。

MySQL DBD驱动程序支持多个语句,但默认情况下它被关闭作为安全功能。请参阅DBD :: mysql文档中Class Methods部分下的mysql_multi_statements

但是,一个更好的解决方案是同时解决这两个问题并且更加便携,就是使用预处理语句和占位符值。

my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?");

然后,将您的数据放入某种循环中:

while( $whatever) { 
    my ( $EC, $MR, $EM ) = get_the_data();
    $sth->execute( $EC, $MR, $EM );
}

您只需准备一次语句,并且DBD驱动程序将替换占位符值(并保证正确引用)。

详细了解DBI docs中的占位符。

答案 1 :(得分:4)

你不需要mysql_multi_statements,正如Friedo建议的那样。

在调用包含UPDATE命令的循环之前,需要关闭AutoCommit模式:

**$dbh->{AutoCommit} = 0;**
while( $condition ) {
   my $myParam = something();
   ...
   $sth->execute( $myParam ); #your prepared UPDATE statement
   ...
}
**$dbh->commit();**