- ベストアンサー
perlからmysqlに接続できない
#! c:/perl/bin/perl use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
まず、ローカル上で実行して正常に実行できているかどうかを 試してください。 ローカルで実行してエラーにならなければ、他の回答者の方の 対策を取ってみてください。 あと、CGIとして動かしてエラーになったときにエラーがブラウザに 表示されるようにするために use CGI::Carp qw(fatalsToBrowser); を入れておいた方がいいと思います。
その他の回答 (8)
- t-okura
- ベストアンサー率75% (253/335)
CPAN のドキュメントだと $dsn = "DBI:mysql:$database"; $dsn = "DBI:mysql:database=$database;host=$hostname"; $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port"; のようにデータベース名とホスト名の間は、セミコロン ';' に なっています。 > $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); では、コロン ':' ですが、よいのでしょうか。
お礼
どうやらコロンでいいようです。 今まで書いていませんでしたが、mysql6.0.5を使っています。 ポート番号が違っていたようです。 3306ではなく3307にしたら解決しました。よく考えたらPHPからもアクセスできないし、MYSQLAdministratorという管理ツールからもアクセスできなかったしDBIの不具合ではないと早く気づくべきでした。 皆様ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
あら、なんか貼り付けたリンクが変。 MySQL コマンドライン・クライアント http://www.db.is.kyushu-u.ac.jp/rinkou/mysql/command.html こっちです。
- sakusaker7
- ベストアンサー率62% (800/1280)
>Can't connect to MySQL server on 'localhost' (10061 気のせいじゃなくて接続できてないですね。 ・データベースサーバーは動いているか ・データベース名が間違っていないか を確かめてみてください。 Perlからではなく、MySQLのコマンドを使ってデータベースにアクセスできますか? MySQL コマンドライン・クライアント - Mozilla Firefox chrome://browser/content/browser.xul
お礼
DB名は間違っていませんでした。 >Perlからではなく、MySQLのコマンドを使ってデータベースにアクセスできますか? mysql -u root -p パスワード入力 でアクセスできます。
- pick52
- ベストアンサー率35% (166/466)
Perlのバージョンはいくつですか。 まさかPerl4って事はないですよね。 5.6.xか5.8.x以上でなければバージョンアップした方がいいでしょう。 (Perl6はまだ開発中なのでよく分かりませんし) あと、ちゃんとDBが正常に動作していることを確認してください。 DBが動作していないのにアクセスしようとしてもできません。 (アクセスが拒否されていたりすることもあるかも知れません)
お礼
perlは5.8.7 windowsの「サービス」というので、MYSQLが開始になっているのを確認しました。 それと、コマンドプロンプトで mysql -u root -p Enter password:パスワード と入力すればmysqlが使えます。
- sakusaker7
- ベストアンサー率62% (800/1280)
>ƒGƒ‰[F ->err ->errstr なんか変換がかかっていてよくわかりませんが、まさか回答に あった行をそのまま使いましたか? 自分がデータベースのコネクトに使った変数でないとダメですよ?
お礼
すみません。単なる文字化けでした。最初に書いた空のものでした。 ローカル上で実行してみたのですが、 Content-Type: text/plain [Thu Aug 28 21:42:55 2008] xx.cgi: DBI connect('db1:localhost','root',...) faile d: Can't connect to MySQL server on 'localhost' (10061) at xx.cgi line 14 エラー: ->err ->errstr <h1>Software error:</h1> <pre>Can't call method "prepare" on an undefined value at xx.cgi line 19. </pre> <p> For help, please send mail to this site's webmaster, giving this error message and the time and date of the error. </p> [Thu Aug 28 21:42:55 2008] xx.cgi: Can't call method "prepare" on an undefined v alue at xx.cgi line 19. と表示されました。なんとなく、MYSQLに接続できていないような気がするのですが、それ以外は分かりません。
- sakusaker7
- ベストアンサー率62% (800/1280)
> Can't call method "prepare" on an undefined value このメッセージからすると、データベースへの接続に失敗して $dbに期待する内容がはいってないですね。 なんで失敗したのかまではこれだけではわかりませんが。 第3章 クラスメソッドを使いこなす [Perl講座 -Smart] "connectは、接続に失敗すると、$DBI::errと$DBI::errstrにエラー情報をセットし、undefを返します。connectの返すステータスを確認し、失敗していたら$DBI::errstrを表示させるとよいでしょう。 $dbh = DBI->connect($dsn, $user, $password); if ( ! $dbh ){ print "エラー: $dbh->err $dbh->errstr\n"; }" http://www.rfs.jp/sb/perl/dbi/03.html とりあえずこの辺のメソッドを使って原因を探ってください。
お礼
回答ありがとうございます。 早速、追加してみました。 エラー: ->err ->errstr というメッセージが表示されました。
補足
すみません ƒGƒ‰[F ->err ->errstr こっちでした。
- _--_--_-_-
- ベストアンサー率47% (8/17)
ANo.1 の回答に追加ですが、 #!C:/perl/bin/perl.exe でダメなら #!/usr/bin/perl および #!/usr/local/bin/perl も試してみてください。
- _--_--_-_-
- ベストアンサー率47% (8/17)
Internal Server Error ということは CGI でしょうか。 次のことを試してみてください。 1. print "Content-Type: text/plain\n\n"; を追加する。 2. インタプリタのパスが合っているか確認する。 #! c:/perl/bin/perl となっていますが、 #!C:/perl/bin/perl.exe とするとどうでしょうか (ここは自信がありません)。 3. パーミッションを 705 または 755 にする。 4. サーバの設定が正しいかどうか確認する。 もし Apache ならば httpd.conf を編集し、あるいは .htaccess ファイルを編集し、Options に ExecCGI を追加する。 それから、use CGI::Carp qw(fatalsToBrowser); を追加すると参考になるかもしれません。既にご存知でしたら申し訳ありません。 もしも、他のプログラムが正しく動き、ご質問にある DB を使ったプログラムのみが Internal Server Error となるのであれば、この回答は役に立たないかもしれません。
お礼
回答ありがとうございます。 print "Content-Type: text/plain\n\n"; の追加でInternal Server Errorは出なくなりました。この1文が無くても動くものもあるので入れていませんでした。 しかし、肝心のDBには接続できていないようでした。
お礼
use CGI::Carp qw(fatalsToBrowser); を追加したら Software error: Can't call method "prepare" on an undefined value というエラーメッセージが表示されました。"prepare"というメソッドは無いということなんでしょうか?