『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

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

このQ&Aに関連する最新のQ&A

A 回答 (9件)

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


試してください。

ローカルで実行してエラーにならなければ、他の回答者の方の
対策を取ってみてください。
あと、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

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

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



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

こっちです。
    • good
    • 0

>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

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

>ƒ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

> 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

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


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

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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサブルーチンを認識しません。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプトの最後にまとめてあります。
同じサブルーチンは、他のスクリプトでも利用していますが、
エラーは出ていないのですが。

何が原因か、わかりません。
関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。
他のサブルーチンも認識しません。
KCacthの表示は同じ
&main::サブルーチン名 called になっています。
よろしくお願いします。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプト...続きを読む

Aベストアンサー

下記前提でよいでしょうか。
&lock(); ・・・(lockを呼び出している箇所)

sub lock    ・・・サブルーチン:lockの定義
{
・・・
}
上記は1つのソースファイル上にある。

とすると、考えられるのは、
1.undef (&lock); により未定義にしている。
2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様)
です。上記の2点はOKでしょうか?

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qperlのdbi-connect処理のエラー

active perlでdbi-connect処理から戻ってきません。教えてください。
以下のテスト的なプログラムで試しました。
Xには、数字が入ります。(会社のファイルサーバーになります)
DBI->connectから戻ってきていないようです。(hhhhhhhhが表示されません)
ちなみにDBI->connectをコメントにすれば表示されます。

申し訳ありませんが、どなたかご存知の方いらっしゃらないでしょうか?
エラーがかえってこないと、何が悪いかわかりません。
困っています、宜しくお願いします。

ちなみにPerlは、Ver. 5.8.7.813でdbi,dbd-oracleは、昨日ppmでダウンロードしました。

# DBへコネクトする
my $datasource = 'dbi:oracle:usrDB:xxx.xxx.x.xx:8080' ;
my $usr = 'usrname' ;
my $pass = 'usepass' ;

my $dbh = DBI->connect($datasource,$usr,$pass) ;
print "hhhhhhhhhhhh\n" ;
if( ! $dbh ){
print "gggggggggggg\n" ;
}
$dbh->disconnect();

active perlでdbi-connect処理から戻ってきません。教えてください。
以下のテスト的なプログラムで試しました。
Xには、数字が入ります。(会社のファイルサーバーになります)
DBI->connectから戻ってきていないようです。(hhhhhhhhが表示されません)
ちなみにDBI->connectをコメントにすれば表示されます。

申し訳ありませんが、どなたかご存知の方いらっしゃらないでしょうか?
エラーがかえってこないと、何が悪いかわかりません。
困っています、宜しくお願いします。

ちなみにPerlは、Ver. 5.8.7.813で...続きを読む

Aベストアンサー

http://search.cpan.org/~pythian/DBD-Oracle-1.27/Oracle.pm
ここらへんを見ると
$dbh = DBI->connect("dbi:Oracle:host=xxx.xxx.xxx.xxx;sid=usrDB;port=8080",$user, $pass);
みたいに書くようですよ。ただ、Oracleは使ったことないんで間違っているかもしれません。

ところで、8080ポートに接続しているということはWebプロキシに接続に行っているみたいなんですが、ポート番号は合っていますか?

ちなみに、SQLiteの例ですが、トレースを出したいときは以下のようにします。Oracleでも似たような出力を出すことができると思います。以下、表示がくずれすので空白2文字を全角空白で書いていることに注意。
use strict;
use warnings;
use DBI;

# DB Name
my $db_name = 'sqlite_test.db';

# Disable buffering
$| = 1;

# Connect to the database
my $dbh = DBI->connect(
  'dbi:SQLite:dbname=' . $db_name,
  '', '',
  {  PrintError => 1,  ### Do report errors via warn()
    RaiseError => 0,  ### Don't report errors via die()
    TraceLevel => 5
  }
) or print DBI->errstr;

# Disconnect from the database
$dbh->disconnect;

これを実行すると以下のような出力が出てきます。
DBI::db=HASH(0x9dda3a8) trace level set to 0x0/5 (DBI @ 0x0/0) in DBI 1.605-ithread (pid 4982)
<> FETCH= 5 ('TraceLevel' from cache) at /usr/lib/perl5/DBI.pm line 693
-> STORE for DBD::SQLite::db (DBI::db=HASH(0x9dda3a8)~INNER 'Username' '') thr#9c7d008
....

http://search.cpan.org/~pythian/DBD-Oracle-1.27/Oracle.pm
ここらへんを見ると
$dbh = DBI->connect("dbi:Oracle:host=xxx.xxx.xxx.xxx;sid=usrDB;port=8080",$user, $pass);
みたいに書くようですよ。ただ、Oracleは使ったことないんで間違っているかもしれません。

ところで、8080ポートに接続しているということはWebプロキシに接続に行っているみたいなんですが、ポート番号は合っていますか?

ちなみに、SQLiteの例ですが、トレースを出したいときは以下のようにします。Oracleでも似たような出力を出す...続きを読む

QHTMLからフォルダを開きたい

いつも大変お世話になります<(_ _)>

Webサーバー上にあるWebページ(HTML)の中に、ローカルPCのフォルダを開くリンクを付けたいのですが、
<a href="file://c:\windows">OPEN</a>
としても、何も反応しません。

いろいろ調べたのですが、上記の方法しか見あたりません。

なお、ブラウザのアドレス欄に file://c:\windows と入力すると、フォルダの内容が表示されます。
※Firefoxだと、ファイルの一覧になりますが・・・

何か環境によって挙動が異なるのでしょうか?
それとも、セキュリティ上の観点から最近じゃ出来なくなっているのでしょうか?

是非ともお助け下さい。宜しくお願い致します。

Aベストアンサー

file:///C:/windows/
/は三つでは・・・
 IEの場合はエクスプローラ(ファイルマネージャ)が開くような・・・
 IEはファイルマネージャーと一体のブラウザなので・・・

★実は、ローカルサーバーが必要です。
 apacheでも何でも良いので、WEBデータの入っているフォルダーを
<VIRTUALHOST 127.0.0.1>
C:\Document and settings\my document\web
 とかに指定して、Windowsのhostsファイルで、適当なサーバー名を指定しておきます。
myLocalhost 127.0.0.1
とか・・・

 そうすると
http://myLoclahost/
 で開けます。

 

Qfetchrow_arrayとfetchrow_hashrefの使い方

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは動く)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$sql = "SELECT SYSDATE FROM DUAL \n";
$sth = $dbh->prepare( $sql );
$sth->execute or die "Cannot execute. " . $sth->errstr();
$cnt1 =1;
while (@row = $sth->fetchrow_array()) {
@{$get_date[$cnt1]} = @row;
$cnt1++;
}
---------------
(2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$query = qq{
SELECT SYSDATE FROM DUAL
};
$sth = dbh->prepare($query);
$sth->execute(); # 実行
if($sth->rows() != 1){ # 該当する行数
# エラー処理
}
$rhash = $sth->fetchrow_hashref();
%hash = {%{$rhash}};
$sth->finish();
$get_date = $hash{SYSDATE};
---------------
(2)実行時のerror_log
Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30.
Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi
---------------
(本文長くてすみません)

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは...続きを読む

Aベストアンサー

rowsメソッドと同じく、executeが正しく処理レコード数を返すのは、非select文を実行した場合のみです。
select文の場合、rowsもexecuteも0行と認識するDBDが多いです。
で、これはselect文に限らずですが、処理レコード数が0の場合は、0自体ではなく「0E0」を返します。
これは、0を返すと、実行エラー時の戻り値undefと同様、
if ($sth->execute) {} で失敗したのと同じことになってしまうためです。
select文の行数は、fetchしながら行数をカウントするか、取り込んだ、配列、ハッシュの数をカウントするのが一般的な方法ですね。fetchする前に取得する方法はわかりません。

Qperlを使ってレコード件数を取り出してみると、すごい数が・・・。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\n";

# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
}

実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか?
なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。
プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\...続きを読む

Aベストアンサー

こんにちは。

まず、全然関係ないですが、SELECT文ではCOMMIT不要です。
さて本題ですが、この場合のrowsは何が返るかわかりません。
rowsでレコード数を取り出せるのは下記の場合のみです。
1.doメソッドで実行した場合(条件付き)
2.SELECT以外のSQL。
3.SELECT実行後、すべての行を取り出した後。

ところで、件数取得はCOUNT()じゃダメ?
(^^ゞ

Q日付の比較について

いつもお世話になります。
ファイルに記述された日付に7日を加算した値とlocationtimeで取得した値を比較したいのですが、記述方法が分かりません。
<ファイルは下記のようになっております。>
2006<>03<>28<>明細
これに7を加算した(7日後という意味です)locationtimeでreturn "$year/$mon/$day";の戻り値と比較した比較したいのですが、
どのようにしたらよいのでしょうか?
どなたかご教示お願いいたします。

Aベストアンサー

# あ、こういうことですか?
# まだ違ってたりして・・

use strict;

my $date1='20060328';
my $date2='2006/04/05';
$date2=~ s{\/}{}g;

if($date1 <= $date2){
print '$date1 <= $date2';
}else{
print 'else';
}

Qcgi 実行時のエラー

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend("To:***@***.co.jp\n");
$smtp->datasend("Subject:テストメール\n"); #件名
$smtp->datasend("Content-Type: text/plain; charset=iso-2022-jp\n\n");
$smtp->datasend("テストメール\n");
$smtp->dataend();
$smtp->quit;
というものです。どなたか分かりましたらお願いします。

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend...続きを読む

Aベストアンサー

Net::SMTPモジュールのロードを指示する
use Net::SMTP;
は書いてある?

1行目の
#!/usr/bin/perl
の下あたりに
use Jcode;
って書いてあると思うので、そこを
use Net::SMTP;
use Jcode;
にしましょう。

QCGIでの500エラー

CGIサイトを作成中の者です。
CGIをサーバーに転送して動作確認をしたらサーバーエラーになってしまいます。
サーバーに問い合わせて、以下が原因でエラーになっていることはわかりました。

Unrecognized character \x90 at ./miuinit.pl line 100.
Compilation failed in require at miumgr.cgi line 11.

でもCGI初心者なので、”\x90”が何をさすのか、2番目の文ではどこを直せばいいかわかりません。

サーバー会社では自分でCGIを修正せよとのことです。
よろしくお願いします。

Aベストアンサー

miuinit.pl 100行目
@room2 = ("ミントの部屋", "チェリーの部屋", "ライムの部屋");
で、"" ダブルクォーテーションで閉じられてないか、
全角スペースが、ソースコードに含まれている可能性があります。

この行をよく見て修正してみては?
または、この行ではなく、前の行かもしれない。

QMySQLで改行を含む文の登録のしかた(改行コード

MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。
改行コードはどのように書けばいいですか?

登録したい文:
あいうえお
かきくけこ
さしすせそ

Aベストアンサー

改行コードは¥nで登録すれば良いです。


人気Q&Aランキング