似乎可能不可能,但是嘿,我不妨问,我可能是错的。想知道是否有任何perl使用一个MySQL调用来更新多行,我正在使用DBI。
非常感谢任何帮助或反馈,这在MSSQL中通过ASP和ASP.net是可能的,所以想知道是否也可以通过MySQL上的perl。
感谢您的反馈!
答案 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();**