使用Perl将值作为数组插入到MYSQL数据库中

时间:2013-10-18 13:11:02

标签: mysql perl hash

我已经创建了数据库头作为哈希的键,并尝试将哈希值(数据类型:数组)插入到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' ); 

3 个答案:

答案 0 :(得分: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. 安全地quote the identifiers $table_name以及所有@fields
  3. @values使用placeholders,因此您无需担心引用它们
  4. 正确地用逗号分隔字段名称和占位符序列。
  5. CPAN模块隐藏了如上所述的易于使用的界面。

答案 1 :(得分: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);

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

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