まず、最も重要なことは、SQL文字列に変数を直接補間しないことです。そのため、SQLインジェクション攻撃の可能性が残ります。これらの変数がユーザー入力に由来しない場合でも、データを台無しにする可能性のある危険なバグの可能性が残ります。
MySQL DBDドライバーは複数のステートメントをサポートしますが、安全機能としてデフォルトでオフになっています。 mysql_multi_statements
を参照してください ClassMethods
の下 DBD::mysqlドキュメントのセクション。
しかし、両方の問題を同時に解決し、より移植性の高い、はるかに優れたソリューションは、プリペアドステートメントとプレースホルダー値を使用することです。
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 );
}
ステートメントを準備する必要があるのは1回だけで、プレースホルダーの値はDBDドライバーによって置き換えられます(適切に引用されることが保証されます)。
プレースホルダーの詳細については、DBIドキュメント をご覧ください。 。