【问题标题】:Adding backticks to a variable in perl在 perl 中为变量添加反引号
【发布时间】:2018-12-10 06:35:05
【问题描述】:

我有 MYSQL 数据库,其字段名称包含连字符。尝试使用 Perl 将数据从 XML 插入数据库。我在 %HEAD 中有 XML 键是列标题,值是对应的数据。

my %HEAD= ('REGISTRATION-NUMBER' => 'AAACT2727QXM003',
           'RETURN-YEAR' => '2013', 
           'MONTH' => 'July', 
           'LTU' => 'Yes',
           'NIL-RETURN' => 'No',
           'ASSESSEE-NAME' => 'TATA MOTORS LIMITED');

my @HEADER_keys= keys %HEAD;


foreach $key(@HEADER_keys) {    
    $value= $HEAD{$key};
    my $sth = $dbh->prepare("INSERT INTO indirect_taxes($key) VALUES ($value)");
    $sth->execute() or die $sth->errstr;
}

或者代替foreach

my @HEADER_values= values %HEAD;
my $sth = $dbh->prepare("INSERT INTO indirect_taxes(?) VALUES (?)");

$sth->execute_array(\@HEADER_keys, \@HEADER_values) or die "the failure cause: $DBI::errstr";

由于键包含连字符,我收到 MYSQL 语法错误。来自Can a table field contain a hyphen?

获得语法但使用 perl 无法将反引号添加到变量 $key 或 @HEADER_keys。

请建议一种在 $keys 中添加反引号的方法。

【问题讨论】:

  • 我对 Perl 一无所知,但我认为您应该编辑您的问题并解释究竟是什么阻止了您添加反引号。您是否需要保留未引用的名称以用于其他用途?
  • 您应该使用placeholders 而不是插值变量。
  • @Alvaro 在 perl 反引号中执行命令,命令完成后继续执行 perl 脚本。
  • @mudBorn - 即使在字符串中?好吧,我说的很明显:我对 Perl xD 一无所知
  • @ÁlvaroG.Vicario:没有。

标签: mysql perl


【解决方案1】:

尝试在 $key 附近使用 sql 占位符 ? 来避免 sql injection

foreach my $key(keys %HEAD) {
  my $sql = sprintf("INSERT INTO indirect_taxes (%s) VALUES (?)",
      $dbh->quote_identifier($key));
  my $sth = $dbh->prepare($sql);
  $sth->execute($HEAD{$key})
      or die $sth->errstr;
}

【讨论】:

  • 为什么只有一个占位符?
  • @TLP 占位符作为值,你也想用它作为键吗?
  • AFAIK 你只能用值占位符准备语句
  • 可能取决于驱动程序。
  • 您的解决方案仍然受到 SQL 注入的影响 -- 想象一下 $key 中的反引号 -- 所以我使用 $dbh->quote_identifier 修复了它。
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多