【问题标题】:insert hash having values as array to MYSQL database using Perl使用 Perl 将具有值作为数组的哈希值插入 MYSQL 数据库
【发布时间】:2013-10-27 08:25:00
【问题描述】:

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

【问题讨论】:

  • 为什么我的问题被降级了?
  • 我没有投反对票,但我猜这是因为您没有显示哈希中的内容并且没有发布错误。
  • 我没有否决这个问题,但我会询问您语法错误的细节。在 MySQL 中,语法错误非常有用 - 它们指向发生语法错误的确切位置。
  • 此外,您似乎正在将列列表和值列表传递到 INSERT 中,而不用逗号分隔,正如 MySQL 所要求的那样,但我只是猜测。向我们展示语法错误,这可能会证实我的猜测。
  • 对不起,伙计们,我的问题没有正确陈述:(

标签: mysql perl hash


【解决方案1】:

你想要这样的东西:

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 模块可以将上述逻辑隐藏在易于使用的界面后面。

【讨论】:

  • 感谢您提供如此详细的解释以及我之前未添加哈希的错误,但您可以看到我的 值是 数据类型为 array ,有什么出路?最后一行的undef是什么??
  • @mudBorn,undef 的意思是“使用默认句柄属性”——参见the documentation。如果您的@values 是数组引用,则需要执行->do($sql, undef, map { $_->[0] } @values) 之类的操作。尝试一下,如果不起作用,请研究一下,然后提出一个单独的问题。
【解决方案2】:

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

看起来您只是简单地获取数组,将其填充到字符串中,然后将其作为您的查询。在 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);

【讨论】:

  • 您应该真正使用 DBI 占位符,而不是直接在字符串中插入值。
  • 我同意,你说的是我如何编写代码,但我不想让 OP 太脱离他/她的舒适区。
【解决方案3】:

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

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)

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

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2014-07-21
    • 2012-12-07
    • 2016-05-25
    • 2014-07-23
    相关资源
    最近更新 更多