0

我创建了数据库标头作为散列的键,并尝试将散列值(数据类型:数组)插入 mysql 数据库。但它给出了语法错误。以下是代码,请建议做什么???

my @keys = keys %hash; #keys used as database headers
my @values=values %hash; #value to be inserted
my $sth=$dbh->prepare("INSERT INTO `$table`(@keys) VALUES (@values)");
$sth->execute() or die "ERROR writing to database: $DBI::errstr $dbh->errstr";

这是哈希(使用 Data::Dumper)

$VAR1 = bless( { '120493acNo' => [ '1' ], 'a120064amount' => [ '133' ], '120310amount' => [ '23' ]}, 'CGI' ); 
4

3 回答 3

5

你想要这样的东西:

my $dbh = DBI->connect(..., {RaiseError => 1});

my $sql = 'INSERT INTO ' . $dbh->quote_identifier($table_name) .
                ' (' . join(',', map { $dbh->quote_identifier($_) } @fields) . ') ' .
          'VALUES (' . join(',', map { '?' }) @values)                     . ')';

$dbh->do($sql, undef, @values);

那将

  1. 打开RaiseError,因此您不必显式检查 DBI 错误
  2. 安全地引用标识符 $table_name和所有@fields
  3. 为使用占位符@values因此您不必担心引用它们
  4. 字段名称和占位符的正确逗号分隔序列。

有一些 CPAN 模块在易于使用的界面后面隐藏了上述逻辑。

于 2013-10-18T13:39:51.533 回答
1

我将按照我的猜测进行:由于您没有向我们展示任何细节,因此很难确定。

看起来您只是在获取数组,将其填充到字符串中,然后进行查询。在 Perl 中,表示为字符串的数组只是一个空格分隔的值列表:

@x = (1,2,3,4,5);
$y = "@x";
print "$y\n";

表明这里的 $y 是“1 2 3 4 5”;

但是 MySQL 要求 INSERT 语句中的列名和值列表用逗号分隔。因此,这可能是您将遇到语法错误的地方:

INSERT INTO table_name (cola colb colc) VALUES (value value valuec); -- < ILLEGAL SYNTAX

只需用逗号分隔就可以了(除非还有其他问题):

$stmt = "INSERT INTO `$table` (" . join(',', @keys) . ") VALUES (" 
    . join(',', @values) . ")";
my $sth=$dbh->prepare($stmt);
于 2013-10-18T13:35:12.583 回答
1

正如其他人指出的那样,您的问题就在这里。

my $sth=$dbh->prepare("INSERT INTO `$table`(@keys) VALUES (@values)");

让我们来看看你是如何为自己解决这个问题的。

您正在尝试从一些文本和一些变量创建 SQL 语句。每当您这样做时,最好查看正在生成的 SQL,看看它是否合理。

所以你可以做这样的事情:

my $sql = "INSERT INTO `$table`(@keys) VALUES (@values)";
print $sql;

这将向您显示您的 SQL 看起来像这样:

INSERT INTO `my_table` (col1 col2 col3) VALUES (value1 value2 value3)

希望您能立即看到问题所在。但如果不能,您甚至可以复制该语句并将其粘贴到数据库的命令行工具中。这将为您提供有关问题所在的更多线索。

于 2013-10-18T14:35:59.360 回答