3

このコードがサイレントに失敗するのはなぜですか? SQL エラーの内容を正確に表示するにはどうすればよいですか?

$dbh=DBI->connect($db_name,$db_user,$db_pass);

コードを次のように変更しました。

$dbh=DBI->connect($db_name,$db_user,$db_pass)
    or die("could not connect to db: $db_name");

unassigned の使用を許可する代わりに、$dbh期待どおりに失敗しますが、失敗する理由を正確に教えてくれません。などの値は$db_name、私が見る限り、すべて有効な値で設定されています。

実際のエラー (MySQL サーバーは実際には実行されていません) は知っていますが、今後の参考のために、たとえば認証エラーを引き起こしている場合に備えて、実際のエラーを確認したいと思います。

4

6 に答える 6

8

DBIが示すことを実行していないため、connect失敗する理由がわかりません。エラーは変数にあります:$DBI::errstr

$dbh = DBI->connect($data_source, $username, $password)
     or die $DBI::errstr;

使用する関数またはメソッドのドキュメントを必ずお読みください。:)

于 2010-01-10T15:32:27.560 に答える
2

エラーは に保存されて$DBI::errstrいるので、次のようにコードを変更できます。

$dbh=DBI->connect($db_name,$db_user,$db_pass)
    or die("could not connect to db: $DBI::errstr");

ドキュメントによると、意図的にサイレントに失敗します。

于 2010-01-10T14:53:04.377 に答える
1

接続時にオプションとしてRaiseError=>1を渡すと、スクリプトはエラーで終了します。私のPerlショップの標準構成は次のとおりです。

{
  RaiseError => 1,
  PrintError => 0,
  AutoCommit => 1,
  mysql_auto_reconnect => 1,
}
于 2010-01-10T15:08:38.607 に答える
1

これがrjhの答えの私の使い方です。アプローチよりもこれを好むと思いますdieが、まだわかりません...

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });
于 2010-01-11T14:55:35.280 に答える
0

$! の値を含めてみてください。あなたの死ぬメッセージで。

$dbh = DBI->connect($db_name, $db_user, $db_pass)
  or die("could not connect to db ($db_name): $!");

$を参照してください。perldoc perlvar で

于 2010-01-11T08:42:52.170 に答える
0

「または」の使用は構文エラーです。リストされたコードはまったく実行されません。

あなたがしたい:

$dbh=DBI->connect($db_name,$db_user,$db_pass) 
    or die("could not connect to db: $db_name");

or die...新しいステートメントではなく、元のステートメントの一部であることに注意してください。

于 2010-01-10T15:18:51.657 に答える