我已经看到这个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 ...
从数组插入结果时是否需要添加额外的引号?或者还有其他问题(可能很简单!)我还没有看到过?
答案 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);
这样做的好处是:
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"'