我得到了这个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);
}
答案 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语句。然后你可以看到语法问题是什么,或者在这里发布它以便我们可以诊断它。
然而,更重要的是,您应该使用参数化查询,而不是使用不受信任的外部数据构建SQL语句。你将自己留给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."'");