2010-01-03 6 views
6

가능하지 않을 수도 있지만, 나도 물어 볼 수 있습니다. 잘못 될 수 있습니다. 어쨌든 perl이 한 번의 MySQL 호출을 사용하여 여러 행을 업데이트 할 것인지 궁금 해서요. DBI를 사용하고 있습니다.Perl : 하나의 MySQL 호출로 다중 행을 업데이트하십시오.

도움이나 의견을 크게 주시면 고맙겠습니다. 이것은 ASP와 ASP.net을 통해 MSSQL에서 가능하므로 MySQL의 perl을 통해 가능한지 궁금합니다.

의견을 보내 주셔서 감사합니다.

+0

, 하나에 두 개의 업데이트를 결합 할 이유가 없습니다를; 실제로해야 할 업데이트와 같은 예제를 줄 수 있습니까? – ysth

답변

14

가장 중요하고 중요한 것은 SQL 문자열에 변수를 직접 삽입해서는 안됩니다. 따라서 SQL 주입 공격 가능성이 열리게됩니다. 이러한 변수가 사용자 입력에서 비롯되지 않더라도 위험한 버그로 인해 데이터가 망가질 수 있습니다.

MySQL DBD 드라이버는 기본적으로 안전 기능으로 해제되어 있지만 여러 문을 지원합니다. DBD :: mysql 문서의 Class Methods 섹션 아래에있는 mysql_multi_statements을 참조하십시오.

그러나 두 가지 문제를 동시에 해결하고 더 이식성이 뛰어난 훨씬 더 나은 솔루션은 준비된 문과 자리 표시 자 값을 사용하는 것입니다.

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

당신은 한 번만 문을 준비해야하고, 자리 값이 대체 (제대로 인용 보장)된다하여 :

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

그리고, 어떤 종류의 루프에서 데이터를 얻을 DBD 드라이버

자리 표시 자에 대한 자세한 내용은 DBI docs을 참조하십시오.

+3

"DBD 드라이버"는 DBD :: mysql과 같이 DBI가 사용하는 백엔드 전용 드라이버입니다. 어떤 경우에도 연결에 대해 걱정할 필요는 없습니다. 동일한 '$ dbh'를 사용하여 명령문을 실행하는 동안 동일한 데이터베이스 연결과 '한 번 준비'를 사용하게됩니다. friedo가 시연하는 많은 모델을 실행하면 각 쿼리를 개별적으로 구문 분석 (준비)해야하는 오버 헤드를 피할 수 있으므로 많은 쿼리를 단일 문자열로 전달하는 것보다 효율적입니다. –

+3

@ mastermind : 보간법은 응용 프로그램이 무엇이든 상관없이 항상 나쁜 것입니다. 많은 취약점이 사용자 장난보다는 프로그래머 오류로 인해 발생합니다. – Ether

3

friedo가 제안한 것처럼 mysql_multi_statements는 필요하지 않습니다.

당신은 당신이 당신의 UPDATE 명령이 포함 된 루프를 호출하기 전에 자동 커밋 모드를 해제해야합니다

귀하의 예제에서
**$dbh->{AutoCommit} = 0;** 
while($condition) { 
    my $myParam = something(); 
    ... 
    $sth->execute($myParam); #your prepared UPDATE statement 
    ... 
} 
**$dbh->commit();** 
관련 문제