#! 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
になってしまいます。どこかコードが違っているのでしょうか?
No.3ベストアンサー
- 回答日時:
まず、ローカル上で実行して正常に実行できているかどうかを
試してください。
ローカルで実行してエラーにならなければ、他の回答者の方の
対策を取ってみてください。
あと、CGIとして動かしてエラーになったときにエラーがブラウザに
表示されるようにするために
use CGI::Carp qw(fatalsToBrowser);
を入れておいた方がいいと思います。
use CGI::Carp qw(fatalsToBrowser);
を追加したら
Software error:
Can't call method "prepare" on an undefined value
というエラーメッセージが表示されました。"prepare"というメソッドは無いということなんでしょうか?
No.9
- 回答日時:
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 …
どうやらコロンでいいようです。
今まで書いていませんでしたが、mysql6.0.5を使っています。
ポート番号が違っていたようです。
3306ではなく3307にしたら解決しました。よく考えたらPHPからもアクセスできないし、MYSQLAdministratorという管理ツールからもアクセスできなかったしDBIの不具合ではないと早く気づくべきでした。
皆様ありがとうございました。
No.8
- 回答日時:
No.7
- 回答日時:
>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
パスワード入力
でアクセスできます。
No.6
- 回答日時:
Perlのバージョンはいくつですか。
まさかPerl4って事はないですよね。
5.6.xか5.8.x以上でなければバージョンアップした方がいいでしょう。
(Perl6はまだ開発中なのでよく分かりませんし)
あと、ちゃんとDBが正常に動作していることを確認してください。
DBが動作していないのにアクセスしようとしてもできません。
(アクセスが拒否されていたりすることもあるかも知れません)
perlは5.8.7
windowsの「サービス」というので、MYSQLが開始になっているのを確認しました。
それと、コマンドプロンプトで
mysql -u root -p
Enter password:パスワード
と入力すればmysqlが使えます。
No.5
- 回答日時:
>ƒ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に接続できていないような気がするのですが、それ以外は分かりません。
No.4
- 回答日時:
> 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
というメッセージが表示されました。
No.2
- 回答日時:
ANo.1 の回答に追加ですが、
#!C:/perl/bin/perl.exe
でダメなら
#!/usr/bin/perl
および
#!/usr/local/bin/perl
も試してみてください。
No.1
- 回答日時:
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には接続できていないようでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- PHP php エラー 2 2022/10/23 16:43
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- UNIX・Linux postfix smtpサーバーリレーがTLSハンドシェーク失敗 1 2022/08/15 15:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MS-Access と接続する方法を教...
-
fetchrow_arrayとfetchrow_hash...
-
ArduinoのジャイロモジュールMP...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
Excel VBA 『Call』で呼び出す...
-
ユーザー定義関数に#NAME?が返...
-
大量の標準モジュールを解放す...
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
標準モジュールを削除したい。(...
-
Excel VBA 定義されたプロージ...
-
LCD ディスプレイを Raspberry ...
-
VBSがコンパイルエラーになりま...
-
ActivePerl付属のPPMでモジュー...
-
Excel VBAで、ユーザーフォーム...
-
VBAで「メモリが不足しています」
-
VHDLにおける「generic」について
-
ACCESSのVBAでPrivate Sub ~en...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fetchrow_arrayとfetchrow_hash...
-
Oracleのデータベースに接続で...
-
perlでdb(mysql)に接続
-
perlのdbi-connect処理のエラー
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
"JScript"が見つかりません!
-
VBSがコンパイルエラーになりま...
-
VBでグローバル変数を宣言するには
-
エクセルVBAでシートモジュール...
-
「デバイスは PRN を初期化でき...
-
VBA This Workbookモジュール...
-
モジュールの最大数はいくつな...
-
LCD ディスプレイを Raspberry ...
-
Excel VBAで、ユーザーフォーム...
-
VBAで旧字体を異字体に一括で変...
-
VBAでoutlook365が起動しません。
-
Access VBA標準モジュールにつ...
おすすめ情報