2012-12-02 36 views
0

我得到了這個perl腳本,直到最近它才用得很好。 我收到此錯誤消息。perl ascript現在說.DBD :: mysql :: db失敗:您的SQL語法有錯誤;

DBD :: mysql :: db do失敗:您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本在2號線在import_productfeatures.pl線71 DBD :: mysql的「使用‘’附近) 對重複密鑰更新值=」「」正確的語法手冊:: DB做失敗:您的SQL語法有錯誤;檢查對應於你的MySQL服務[R版本正確的語法在import_productfeatures.pl線在2號線附近使用「‘’) 對重複密鑰更新值=」「」 71

foreach my $feature (@features) { 
    my $cat_featureid = $feature->{CategoryFeature_ID}; 
    my $value = $feature->{Presentation_Value}; 
    my $sql = "INSERT INTO products_features (product_id, feature_id, value) 
     VALUES (".$prodid.", ".$cat_featureid.", ".$dbh->quote($value).") 
     ON DUPLICATE KEY UPDATE value=".$dbh->quote($value); 
    $dbh->do($sql); 
    } 
+0

我才意識到腳本工作,如果我分析。我還與100個文件測試了一個文件,它works.But它往往扔在年底的錯誤,當我問它做的一切65222 files.Can它是暫停問題..我不太瞭解perl。 – naf

+3

瞭解如何使用預準備語句。 –

+0

65222接近65535,最大的16位無符號整數。也許有某種資源泄漏?每萬次請求重新連接到數據庫會怎麼樣? – ikegami

回答

3

打印手冊取出$sql的值,以便您可以看到您正在構建的SQL語句。然後你可以看到語法問題是什麼,或者在這裏發佈它,以便我們可以診斷它。

然而,比這還要多,你應該使用參數化查詢,而不是建立與不可信外部數據的SQL語句。你正在開放SQL注入。請參閱http://bobby-tables.com/perl.html以瞭解如何正確執行此操作的示例。

-1

我覺得你錯過了單引號。

變化

my $sql = "INSERT INTO products_features (product_id, feature_id, value) 
     VALUES (".$prodid.", ".$cat_featureid.", ".$dbh->quote($value).") 
     ON DUPLICATE KEY UPDATE value=".$dbh->quote($value); 

my $sql = "INSERT INTO products_features (product_id, feature_id, value) 
     VALUES (".$prodid.", ".$cat_featureid.", '".$dbh->quote($value)."') 
     ON DUPLICATE KEY UPDATE value='".$dbh->quote($value."'"); 
+0

上面沒有工作..腳本拋出一個錯誤startight away.it通常運行一段時間。 – naf

6

你應該使用佔位符,而不是直接把值到字符串:

my $sql = "INSERT INTO products_features (product_id, feature_id, value) 
    VALUES (?,?,?) 
    ON DUPLICATE KEY UPDATE value=?"; 
my $sth = $dbh->prepare($sql); 

foreach my $feature (@features) { 
    my $cat_featureid = $feature->{CategoryFeature_ID}; 
    my $value = $feature->{Presentation_Value}; 

    $sth->execute($prodid,$cat_featureid,$value,$value); 
} 

$sth->finish(); 

DBI將處理正確轉義爲你。

+3

更好的是,$ dbh->在循環之外準備語句。 – jordanm

+0

你是對的。這將是性能提升。我會更新我的答案 – Demnogonis

相關問題