1

我已经看到这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 ...

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

4

3 回答 3

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一次。
于 2012-10-15T13:49:49.523 回答
4

您应该始终在 DBI 的准备或引用变量时使用占位符。永远不要把它们直接放在你的 SQL 字符串中!

$dbh->do(
  'insert into $table values(?, ?, ?, ?, ?)', 
  undef,
  $time, $r_1, $r_2, $r_3, '',
);
于 2012-10-15T13:49:28.860 回答
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"'
于 2012-10-15T13:49:27.457 回答