2013-10-18 89 views
0

我已經創建數據庫頭作爲哈希鍵,並試圖將哈希值(數據類型:數組)插入到MySQL數據庫。但它給出了語法錯誤。 以下是代碼請建議做什麼?使用Perl插入哈希值爲數組到MYSQL數據庫使用Perl

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"; 

這裏是哈希(使用數據::自卸車)

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

爲什麼我的問題被降級? – norbdum

+0

我沒有downvote,但我想這是因爲你沒有顯示什麼是散列,並沒有發佈錯誤。 – jordanm

+0

我沒有投下這個問題,但我會問你的具體語法錯誤。在MySQL中,語法錯誤非常有用 - 它們指向發生語法錯誤的確切位置。 –

回答

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. 使用placeholders@values,所以你不必擔心引述他們
  4. 正確逗號分隔的字段名稱和佔位符序列。

CPAN模塊隱藏了上述背後的邏輯,易於使用的界面。

+0

感謝這樣的詳細解釋和我之前沒有添加哈希的錯誤,但是因爲你可以看到我的**值是**數據類型** array **,什麼可能是出路?還有什麼是在最後一行undef? – norbdum

+1

@mudBorn,'undef'的意思是「使用默認句柄屬性」 - 請參閱[文檔](http:// search .cpan.org/dist/DBI/DBI.pm#do)。如果你的'@ values'是arrayrefs,你需要做一些類似' - > do($ sql,undef,map {$ _-> 0]} @values)'嘗試一下,如果它不起作用,就研究一下,然後再提出一個單獨的問題。 – pilcrow

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); 
+0

你應該真的使用DBI佔位符,而不是直接在字符串中插值。 – friedo

+0

我同意,你說的是我如何寫我的代碼,但我沒有' t想要將OP放在他/她的舒適區域 –

1

正如其他人指出的,你的問題在這裏。

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

讓我們來看看你是如何爲自己工作的。

您試圖從一些文本和一些變量中創建一條SQL語句。每當你這樣做時,最好查看一下正在生成的SQL,看看它是否合理。

所以,你可以做這樣的事情:那您展示您的SQL看起來像這樣

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

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

希望,你可以立即看到這個問題。但是,如果你不能甚至可以複製該語句並將其粘貼到數據庫的命令行工具中。這會給你更多的線索,問題是什麼。