アプリ版:「スタンプのみでお礼する」機能のリリースについて

#! 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
になってしまいます。どこかコードが違っているのでしょうか?

A 回答 (9件)

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 となるのであれば、この回答は役に立たないかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
print "Content-Type: text/plain\n\n";
の追加でInternal Server Errorは出なくなりました。この1文が無くても動くものもあるので入れていませんでした。

しかし、肝心のDBには接続できていないようでした。

お礼日時:2008/08/26 21:39

ANo.1 の回答に追加ですが、


#!C:/perl/bin/perl.exe
でダメなら
#!/usr/bin/perl
および
#!/usr/local/bin/perl
も試してみてください。
    • good
    • 0

まず、ローカル上で実行して正常に実行できているかどうかを


試してください。

ローカルで実行してエラーにならなければ、他の回答者の方の
対策を取ってみてください。
あと、CGIとして動かしてエラーになったときにエラーがブラウザに
表示されるようにするために

use CGI::Carp qw(fatalsToBrowser);

を入れておいた方がいいと思います。
    • good
    • 0
この回答へのお礼

use CGI::Carp qw(fatalsToBrowser);
を追加したら

Software error:
Can't call method "prepare" on an undefined value
というエラーメッセージが表示されました。"prepare"というメソッドは無いということなんでしょうか?

お礼日時:2008/08/26 22:23

> 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

とりあえずこの辺のメソッドを使って原因を探ってください。

この回答への補足

すみません
ƒGƒ‰[F ->err ->errstr
こっちでした。

補足日時:2008/08/27 17:41
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
早速、追加してみました。
エラー: ->err ->errstr
というメッセージが表示されました。

お礼日時:2008/08/27 17:28

>ƒGƒ‰[F ->err ->errstr



なんか変換がかかっていてよくわかりませんが、まさか回答に
あった行をそのまま使いましたか?

自分がデータベースのコネクトに使った変数でないとダメですよ?
    • good
    • 0
この回答へのお礼

すみません。単なる文字化けでした。最初に書いた空のものでした。

ローカル上で実行してみたのですが、

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 &quot;prepare&quot; 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に接続できていないような気がするのですが、それ以外は分かりません。

お礼日時:2008/08/28 21:47

Perlのバージョンはいくつですか。


まさかPerl4って事はないですよね。

5.6.xか5.8.x以上でなければバージョンアップした方がいいでしょう。
(Perl6はまだ開発中なのでよく分かりませんし)

あと、ちゃんとDBが正常に動作していることを確認してください。
DBが動作していないのにアクセスしようとしてもできません。
(アクセスが拒否されていたりすることもあるかも知れません)
    • good
    • 0
この回答へのお礼

perlは5.8.7

windowsの「サービス」というので、MYSQLが開始になっているのを確認しました。
それと、コマンドプロンプトで
mysql -u root -p
Enter password:パスワード
と入力すればmysqlが使えます。

お礼日時:2008/08/29 16:35

>Can't connect to MySQL server on 'localhost' (10061



気のせいじゃなくて接続できてないですね。
・データベースサーバーは動いているか
・データベース名が間違っていないか
を確かめてみてください。

Perlからではなく、MySQLのコマンドを使ってデータベースにアクセスできますか?

MySQL コマンドライン・クライアント - Mozilla Firefox
chrome://browser/content/browser.xul
    • good
    • 0
この回答へのお礼

DB名は間違っていませんでした。

>Perlからではなく、MySQLのコマンドを使ってデータベースにアクセスできますか?
mysql -u root -p
パスワード入力
でアクセスできます。

お礼日時:2008/08/29 17:18

あら、なんか貼り付けたリンクが変。



MySQL コマンドライン・クライアント
http://www.db.is.kyushu-u.ac.jp/rinkou/mysql/com …

こっちです。
    • good
    • 0

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);
では、コロン ':' ですが、よいのでしょうか。

参考URL:http://search.cpan.org/~capttofu/DBD-mysql-4.008 …
    • good
    • 0
この回答へのお礼

どうやらコロンでいいようです。

今まで書いていませんでしたが、mysql6.0.5を使っています。
ポート番号が違っていたようです。
3306ではなく3307にしたら解決しました。よく考えたらPHPからもアクセスできないし、MYSQLAdministratorという管理ツールからもアクセスできなかったしDBIの不具合ではないと早く気づくべきでした。
皆様ありがとうございました。

お礼日時:2008/08/30 23:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!