Perl DBI MySQL - '字段列表'中的未知列

时间:2012-10-15 13:42:00

标签: mysql perl dbi

我已经看到这个unknown column in 'field list'是一个经常出现的问题,通常有一个简单的解决方案。在我的情况下,我唯一能想到的是我的一些变量需要引号,但考虑到我从数组中提取数据,我最初的反应是错误的。 我正在尝试在Perl中创建表,因此结果。

我可以使用:

创建一个表(前面已声明$table
$dbh->do("create table if not exists $table ( id int(5) not null auto_increment, 
                                              time int(2) default null, 
                                              result_1 varchar(30), 
                                              result_2 varchar(30), 
                                              result_3 varchar(30), 
                                              rating int(2) default null, 
                                              primary key (id))");

但是在插入我的'结果'时:

my @results = ('abc','def','ghi');
my $r_1 = $results[0];
my $r_2 = $results[1];
my $r_3 = $results[2]; # (these results print out fine)
my $time = time;
my $insert = $dbh->prepare("insert into $table values(id,$time,$r_1,$r_2,$r_3,'')");
$insert->execute;

我收到错误:

DBD::mysql::st execute failed: Unknown column 'abc' in 'field list' at ...

从数组插入结果时是否需要添加额外的引号?或者还有其他问题(可能很简单!)我还没有看到过?

3 个答案:

答案 0 :(得分:4)

您应始终使用placeholders与DBI准备或quote您的变量。切勿将它们直接放在SQL字符串中!

$dbh->do(
  'insert into $table values(?, ?, ?, ?, ?)', 
  undef,
  $time, $r_1, $r_2, $r_3, '',
);

答案 1 :(得分:4)

你的问题是引用,正如你所怀疑的那样。但是,您不应手动将引号插入字符串中。相反,这是正确的方法:

my @results = ('abc','def','ghi');
my $r_1 = $results[0];
my $r_2 = $results[1];
my $r_3 = $results[2]; # (these results print out fine)
my $time = time;
my $insert = $dbh->prepare("insert into $table values(id,?,?,?,?,'')");

$insert->execute($time,@results);

这样做的好处是:

  • 您不必处理引用,甚至不需要知道是否需要引用变量。
  • Perl中未定义的内容在数据库中自动变为空。
  • 效率更高,因为execute多次使用不同的值。您只需prepare一次。

答案 2 :(得分:2)

您需要在SQL插入语句中引用字符串文字('abc'等)。如上所述,您的SQL语句将扩展$ r_1等未引用的内容,从而产生如下内容: 当您需要insert into my_table values(id,abc ...)

insert into my_table values(1,"abc",...)

或许下面的例子可以解释这个问题:

  DB<1> $foo = 'abc'
  DB<2> x "hello $foo"
0  'hello abc'
  DB<5> x "hello \"$foo\""
0  'hello "abc"'