2011-12-15 7 views
2

DBI();私のmysql DBD挿入呼び出しはsuddentlyで静かに失敗します

このインサートがエラー1に失敗する原因は何ですか.SELECT呼び出しはOKで、資格情報の問題ではありません。

$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass"); 
my $sth = $dbh->prepare("INSERT INTO call_fields VALUES (?, ?, ?, ?)") or die print "$DBI:errstr"; 
$sth->execute("NULL", 0, 0, "testing") or die print "er $DBI::errstr"; 

のMySQL 5.5 のver。これはPerl 5の、バージョン14、MSWIN32-x64の

NOTEのために建て転覆1(v5.14.1):この構文はOK作品:

$ dbh-> do(q/call_fieldsの値(null、0,0、 "testing")/を挿入するか死ぬか "$ dbh :: errstr";

+0

これらの記載されていない列についての制限はありますか? –

+0

'$ DBI:errstr'は' $ DBI :: errstr'に置き換えて 'silence'を行います。 :-) –

+0

これはstdoutに1だけ表示します – Tom

答えて

3

、ここにあなたのコードは、あなたが与えられてきた提案の全て(と一緒にを使用するように書き換えられ私が作ったいくつかの変更点)。

私は各行で行った変更についてコメントしました。

# Declared $dbh 
# Removed unnecessary quote marks. 
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass); 

# Removed unnecessary call to print 
# Replaced $DBI::errstr with $sth->errstr 
my $sth = $dbh->prepare('INSERT INTO call_fields VALUES (?, ?, ?, ?)') 
    or die $sth->errstr; 

# Replaced string "NULL" with undef (which DBI treats as NULL) 
# Removed unnecessary call to print 
# Replaced $DBI::errstr with $sth->errstr 
$sth->execute(undef, 0, 0, 'testing') or die $sth->errstr; 

は、私はそれが実際にあなたの問題を解決し、不要なprint通話やundefに「NULL」を切り替えるの除去だ疑い。

さらに、私は、データベースに接続するときにRaiseErrorフラグを設定し、b)INSERTステートメントに列名を追加してから、ステートメントから最初の空の列を完全に削除することを強くお勧めします。

+0

申し訳ありませんが、それでも関連するエラーメッセージは表示されません:( – Tom

2

あなたのエラー印刷:

... or die print "er $DBI::errstr"; 

右見ていません。アランは、前述のように

は、あなたは二重のコロンを固定しますが、実行されて死亡した印刷への呼び出しは、これに1(どこか1つの==成功した印刷...)

変更あなたのダイ構文を返すです。

... or die "er $DBI::errstr"; 

あなたはこのような何かを取得する必要があります:

er {DBI_ERROR_MESSAGE} at {Script_Name} line XXX. 

をあなたは書きました:

$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass"); 
my $sth = $dbh->prepare("INSERT INTO call_fields VALUES (?, ?, ?, ?)") or die print "$DBI:errstr"; 
$sth->execute("NULL", 0, 0, "testing") or die print "er $DBI::errstr"; 

と別の例:

$dbh->do(q/insert into call_fields values(null,0,0,"testing") /) or die "$dbh::errstr"; 

これは、 "りんごとオレンジ" の比較です。最初の文字列は "NULL"という文字列を挿入していますが、2番目の文字列はNULL値を挿入しています。

私は最初の準備された入力値を取得しているあなたのcall_fieldsテーブルが文字列を受け入れていないと仮定し、$ sth-> executeは失敗しています。

+0

空白のエラーが返されます。 – Tom

4

声明

die print "$DBI:errstr"; 

容疑者です。 Alan Haggai Alaviがコメントで指摘したように、あなたはコロンを欠いています。それは$DBI::errstrでなければなりません。また、dieprintにチェーンするので、stdERR(stdoutではなく)に1を表示しています。 printは、正常に印刷された場合は1を返し、dieに戻されて表示されます。

また、print-in stdoutを表示するか、少なくともprintで定義されていない値の警告を表示する必要がありますが、use warningsを使用していないと、サイレントになります。 (それは:errstrを印刷することがあります。)ので

die $DBI::errstr; 

があなたの状況を改善する必要があります。それがまだない場合

use strict; 
use warnings; 

を追加すると、さらにそれが改善されます。

+0

これはなぜうまくいくのですか?$ dbh-> do(q/call_fieldsの値(null、0,0、 "testing")/)に挿入するか、 "$ dbh :: errstr"; – Tom

+0

@tomおそらく最初のフィールドはヌル値を受け取りますが、以前に追加したように "NULL"という文字列ではないからです。あなたのスクリプトに厳密かつ警告を追加しましたか?そうでない場合は、今すぐ実行して、すべてのエラーを解決してください。 – TLP

6

RaiseError connection attributeを設定し、DBIにエラー処理をさせます。

NULLという引用符付きの文字列ではなく、PerlのSQL NULL value is represented as undefです。あなたが与えられたすべての情報を照合しようとしているだけで少し混乱していることを期待して

use strictures; 
use DBI qw(); 
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass, { RaiseError => 1 }); 
my $sth = $dbh->prepare('INSERT INTO call_fields VALUES (?, ?, ?, ?)'); 
$sth->execute(undef, 0, 0, 'testing'); 
+0

助けてくれない - エラーが叫ばれない – Tom

関連する問題