我已经创建了数据库头作为哈希的键,并尝试将哈希值(数据类型:数组)插入到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' );
答案 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);
那将
$table_name
以及所有@fields
@values
使用placeholders,因此您无需担心引用它们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)
希望您能立即看到问题。但是,如果你不能,你甚至可以复制该语句并将其粘贴到数据库的命令行工具中。这会给你更多关于问题的线索。