繁体   English   中英

运行中的perl脚本现在显示.DBD :: mysql :: db失败:您的SQL语法有错误;

[英]working perl ascript now says .DBD::mysql::db do failed: You have an error in your SQL syntax;

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

DBD :: mysql :: db失败:您的SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册,以在''')ON DUPLICATE KEY UPDATE value ='''附近的import_productfeatures.pl第71行使用正确的语法。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);
  }

您应该使用占位符,而不是将值直接放入字符串中:

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将为您处理正确的转义。

打印$sql的值,以便可以看到正在构建的SQL语句。 然后,您可以查看语法问题是什么,或者将其发布在此处以便我们进行诊断。

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

我想你错过了单引号。

更改

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."'");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM