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

DBIが変数を準備または引用する場合は、常にプレースホルダーを使用する必要があります。SQL文字列に直接入れないでください。

$dbh->do(
  'insert into $table values(?, ?, ?, ?, ?)', 
  undef,
  $time, $r_1, $r_2, $r_3, '',
);
于 2012-10-15T13:49:28.860 に答える
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で定義されていないものは、データベースで自動的にnullになります。
  • executeさまざまな値を何度も使用できるため、より効率的です。あなたはprepare一度だけする必要があります。
于 2012-10-15T13:49:49.523 に答える
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 に答える