0

この perl スクリプトを入手しましたが、最近まで問題なく動作していました。このエラーメッセージが表示されます。

DBD::mysql::db do failed: SQL 構文にエラーがあります。' '') ON DUPLICATE KEY UPDATE value=''' at line 2 at import_productfeatures.pl line 71. DBD::mysql::db do failed: SQL 構文にエラーがあります。' '') ON DUPLICATE KEY UPDATE value=''' at line 2 at import_productfeatures.pl line 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);
  }
4

3 に答える 3

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 は正しいエスケープを処理します。

于 2012-12-02T17:55:25.420 に答える
3

の値を出力して、$sql作成中の SQL ステートメントを確認できるようにします。次に、構文の問題が何であるかを確認するか、ここに投稿して診断できるようにします。

ただし、それ以上に、信頼できない外部データを使用して SQL ステートメントを作成するのではなく、パラメーター化されたクエリを使用する必要があります。SQL インジェクションにさらされることになります。適切に行う方法の例については、 http://bobby-tables.com/perl.htmlを参照してください。

于 2012-12-02T16:30:24.343 に答える
-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."'");
于 2012-12-02T16:36:58.027 に答える