【问题标题】:Perl DBI MySQL - unknown column in 'field list'Perl DBI MySQL - '字段列表'中的未知列
【发布时间】:2012-10-15 21:49:49
【问题描述】:

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

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

【问题讨论】:

  • 感谢所有答案!帮助解释了一切,两个人都像魅力一样工作。我喜欢不必声明所有结果 ;) 编辑:使用 @results 可以同时使用这两种方法,但 dan1111 先说它

标签: mysql perl dbi


【解决方案1】:

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

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 中未定义的内容在数据库中自动变为 null。
  • 效率更高,因为您可以execute 多次使用不同的值。您只需prepare 一次。

【讨论】:

    【解决方案2】:

    您应该始终使用 placeholders 与 DBI 的准备或 quote 您的变量。永远不要将它们直接放在你的 SQL 字符串中!

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

    【讨论】:

      【解决方案3】:

      您需要在 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"'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-01
        相关资源
        最近更新 更多