工作perl ascript现在说.DBD :: mysql :: db失败了:你的SQL语法有错误;

时间:2012-12-02 16:26:05

标签: mysql perl

我得到了这个perl脚本,直到最近它一直很好用。 我收到此错误消息。

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

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);
  }

3 个答案:

答案 0 :(得分: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将为您处理正确的转义。

答案 1 :(得分:3)

打印出$sql的值,以便您可以看到正在构建的SQL语句。然后你可以看到语法问题是什么,或者在这里发布它以便我们可以诊断它。

然而,更重要的是,您应该使用参数化查询,而不是使用不受信任的外部数据构建S​​QL语句。你将自己留给SQL注入。有关如何正确执行此操作的示例,请参阅http://bobby-tables.com/perl.html

答案 2 :(得分:-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."'");