0

我得到了这个 perl 脚本,直到最近它都可以正常工作。我收到此错误消息。

DBD::mysql::db do failed: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 import_productfeatures.pl 第 71 行的第 2 行的 ''') ON DUPLICATE KEY UPDATE value=''' 附近使用。 DBD::mysql::db 失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获得正确的语法,以便在 import_productfeatures.pl 第 71 行的第 2 行的 ''') ON DUPLICATE KEY UPDATE value=''' 附近使用。

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

You should use placeholders, instead of putting the values directly into the string:

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 will handle the correct escaping for you.

于 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 回答