Почему при использовании Perl DBI-> connect происходит молчание? - PullRequest
3 голосов
/ 10 января 2010

Почему этот код молча терпит неудачу?Как мне получить его, чтобы показать мне точно, что такое ошибка 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");

Что вместо того, чтобы позволить мне использовать $dbh неназначенный, он потерпит неудачу, как ожидалось, но он не говорит мне точно, почему он терпит неудачу.Насколько я вижу, все значения $db_name и т. Д. Установлены с допустимыми значениями.

Я знаю реальную ошибку (сервер MySQL на самом деле не работает), но для дальнейшего использования я бы хотелчтобы увидеть истинную ошибку в случае, если я вызываю ошибку аутентификации, например.

Ответы [ 6 ]

8 голосов
/ 10 января 2010

Вы не видите, почему connect терпит неудачу, потому что вы не делаете то, что показывает DBI . Ошибка будет в переменной $DBI::errstr:

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

Убедитесь, что вы прочитали документацию для любых функций или методов, которые вы хотите использовать. :)

2 голосов
/ 10 января 2010

Ага, ошибка сохраняется в $DBI::errstr, поэтому я могу изменить свой код следующим образом:

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

В соответствии с документацией, он молча терпит неудачу.

1 голос
/ 11 января 2010

Вот мое использование ответа rjh . Я думаю, что предпочитаю это, чем подход die, но пока не уверен ...

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });
1 голос
/ 10 января 2010

Передайте RaiseError => 1 в качестве опции при подключении, тогда ваш скрипт умрет при ошибках. Магазин My ​​Perl имеет стандартную конфигурацию:

{
  RaiseError => 1,
  PrintError => 0,
  AutoCommit => 1,
  mysql_auto_reconnect => 1,
}
0 голосов
/ 11 января 2010

Попробуйте включить значение $! в твоем сообщении.

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

Смотрите $! в perldoc perlvar .

0 голосов
/ 10 января 2010

Использование вами 'or' является синтаксической ошибкой. Указанный код не должен работать вообще.

Вы хотите:

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

Обратите внимание, что or die... является частью исходного утверждения, а не нового утверждения.

...