2010-01-10 13 views
2

Pourquoi ce code échoue-t-il en mode silencieux? Comment puis-je l'obtenir pour me montrer exactement ce qu'est l'erreur SQL?Pourquoi mon utilisation de DBI-> connect Perl échoue-t-elle silencieusement?

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

J'ai modifié le code pour ressembler à ceci:

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

qui, au lieu de me permettre d'utiliser $dbh sans affectation, il échouera comme prévu, mais il ne me dit pas exactement pourquoi il est défaillant. Les valeurs de $db_name etc, sont toutes définies avec des valeurs valides autant que je peux voir.

Je connais la vraie erreur (le serveur MySQL n'est pas en cours d'exécution) mais pour référence future, je voudrais voir la vraie erreur dans le cas où je provoque un échec d'authentification par exemple.

+0

Encore une fois, s'il vous plaît nous montrer des scripts complets (bien que masquer le nom d'utilisateur et mot de passe!). Les réponses à vos dernières questions ont trait à des choses que vous n'avez pas montrées. –

+0

@brian Je suis désolé. Je ne ferai plus cette erreur. –

Répondre

8

Vous ne voyez pas pourquoi le connect échoue parce que vous ne faites pas ce que le DBI vous montre à faire. L'erreur sera dans la variable $DBI::errstr:

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

Assurez-vous de lire la documentation pour toutes les fonctions ou les méthodes que vous souhaitez utiliser. :)

+0

Okie doke, je vais l'utiliser à partir de maintenant. –

+0

Je vois maintenant ta propre réponse. Je suppose que vous l'avez découvert en même temps que je l'écrivais parce que je pense que vous avez soumis votre réponse légèrement avant la mienne. Ne vous sentez pas mal d'accepter votre réponse si c'est la bonne (pas que je me plains) :) –

+0

Haha, ne vous inquiétez pas, j'aime mieux votre code. –

2

Aha, l'erreur est stockée dans $DBI::errstr, donc je peux modifier mon code comme ceci:

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

Selon la documentation, il échoue en silence par la conception.

+1

Vous n'avez pas à assumer. C'est expliqué dans les documents DBI. :) –

+0

@brian Ah, bien sûr. Quelle bêtise de ma part, je devrais toujours relire la documentation pour m'assurer que je ne manque rien. –

1

Passez RaiseError => 1 en option lors de la connexion, puis votre script mourra en cas d'erreur. Mon magasin Perl a une configuration standard de:

{ 
    RaiseError => 1, 
    PrintError => 0, 
    AutoCommit => 1, 
    mysql_auto_reconnect => 1, 
} 
+0

Nice. Comment définir une configuration standard? –

+1

Il pourrait y avoir un moyen officiel; vous pourriez sous-classer DBI et remplacer la méthode connect. Nos projets ont leurs propres modules de distribution DBH spécialisés qui chargent la configuration de YAML. – rjh

+0

Pas de problème, merci pour le conseil. –

0

Votre utilisation de 'ou' est une erreur de syntaxe. Le code répertorié ne devrait pas fonctionner du tout.

Vous voulez:

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

Notez que or die... fait partie de la déclaration d'origine, et non une nouvelle déclaration.

+0

Oups, faute de frappe. Bien repéré. J'ai corrigé ça maintenant. Mais peut-être que votre réponse aurait dû être un commentaire? –

+0

Ne tapez pas de code. Coupez et collez le code réel que vous utilisez. Je l'ai mentionné plusieurs fois déjà, mais vous abusez un peu du temps des gens pour répondre au problème que vous présentez, comme l'erreur de syntaxe, plutôt que de montrer le code que vous utilisez. Vous pouvez obtenir de meilleures réponses et alléger le fardeau des personnes qui vous aident gratuitement, alors faites-le s'il vous plaît. :) –

+0

@brian Oui vous avez totalement raison, je suis tellement désolé d'avoir perdu votre temps; Je peux seulement imaginer combien tu détestes me harceler à ce sujet. ;) –

0

Essayez d'inclure la valeur de $! dans votre message de die.

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

Voir $! in perldoc perlvar.

+0

Ah, intéressant. –

+1

Cela ne va pas aider, car DBI ne définit pas $! Voir la documentation: "Si la connexion échoue (voir ci-dessous), elle renvoie' undef' et définit à la fois '$ DBI :: err' et' $ DBI :: errstr' (elle ne définit pas explicitement '$!'.). " – bazzilic

1

Voici mon utilisation de rjh's answer. Je pense que je préfère cette approche sur l'die, mais pas encore sûr ...

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });