• ベストアンサー

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

  • Perl
  • 回答数9
  • ありがとう数34

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

まず、ローカル上で実行して正常に実行できているかどうかを 試してください。 ローカルで実行してエラーにならなければ、他の回答者の方の 対策を取ってみてください。 あと、CGIとして動かしてエラーになったときにエラーがブラウザに 表示されるようにするために use CGI::Carp qw(fatalsToBrowser); を入れておいた方がいいと思います。

shaka001
質問者

お礼

use CGI::Carp qw(fatalsToBrowser); を追加したら Software error: Can't call method "prepare" on an undefined value というエラーメッセージが表示されました。"prepare"というメソッドは無いということなんでしょうか?

その他の回答 (8)

  • t-okura
  • ベストアンサー率75% (253/335)
回答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/lib/DBD/mysql.pm#SYNOPSIS
shaka001
質問者

お礼

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

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.8

あら、なんか貼り付けたリンクが変。 MySQL コマンドライン・クライアント http://www.db.is.kyushu-u.ac.jp/rinkou/mysql/command.html こっちです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.7

>Can't connect to MySQL server on 'localhost' (10061 気のせいじゃなくて接続できてないですね。 ・データベースサーバーは動いているか ・データベース名が間違っていないか を確かめてみてください。 Perlからではなく、MySQLのコマンドを使ってデータベースにアクセスできますか? MySQL コマンドライン・クライアント - Mozilla Firefox chrome://browser/content/browser.xul

shaka001
質問者

お礼

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

  • pick52
  • ベストアンサー率35% (166/466)
回答No.6

Perlのバージョンはいくつですか。 まさかPerl4って事はないですよね。 5.6.xか5.8.x以上でなければバージョンアップした方がいいでしょう。 (Perl6はまだ開発中なのでよく分かりませんし) あと、ちゃんとDBが正常に動作していることを確認してください。 DBが動作していないのにアクセスしようとしてもできません。 (アクセスが拒否されていたりすることもあるかも知れません)

shaka001
質問者

お礼

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

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

>ƒGƒ‰[F ->err ->errstr なんか変換がかかっていてよくわかりませんが、まさか回答に あった行をそのまま使いましたか? 自分がデータベースのコネクトに使った変数でないとダメですよ?

shaka001
質問者

お礼

すみません。単なる文字化けでした。最初に書いた空のものでした。 ローカル上で実行してみたのですが、 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に接続できていないような気がするのですが、それ以外は分かりません。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答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 とりあえずこの辺のメソッドを使って原因を探ってください。

shaka001
質問者

お礼

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

shaka001
質問者

補足

すみません ƒGƒ‰[F ->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 となるのであれば、この回答は役に立たないかもしれません。

shaka001
質問者

お礼

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

関連するQ&A

  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • perlでmysqlに接続

    初歩的な質問で申し訳ありません。 perlでmysqlに接続できず困っています(OSはWindowsXPです)。 バージョンは下の通りです。 perl : ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql : MySQL Server 5.0 DOSでppmを入力すると「perl package manager」というウィンドウが立ち上がり、「DBD-SQLite」と「DBI」をインストールすることができました。 サンプルコードは下の通りです。 #!C:/usr/local/Perl/bin/perl use DBI; $user = '*****'; $passwd = '*****'; $db = DBI->connect('DBI:mysql:bulletin_board:localhost', $user, $passwd); $sth = $db->prepare("SELECT * FROM data"); $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows 件\n"; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print "no=$a[0], title=$a[1] name=$a[2] \n"; } $sth->finish; $db->disconnect; DOSで実行すると C:\Program Files\War-ftpd\FTPRoot\usr\f-taka\cgi-bin>perl sqlTest.cgi install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: C:/usr/local/Perl/site/lib C:/usr/local/Perl/lib .) at (eval 4) line 3. Perhaps the DBD::mysql perl module hasn't been fully installed, or perhaps the capitalisation of 'mysql' isn't right. Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge. at sqlTest.cgi line 8 というエラーが出ました。原因は何なのでしょうか。 MySQL側で設定することはあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • perl+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • PerlからSQLiteをうまく扱えません

    以下のような感じで、 Perlから、SQliteのデータベースと、そのテーブルを作成し INSERTさせてみるのを組んでみたのですが うまく行かないようです・・・。 何が原因なのかどうすればうまくいくのか、教えていただけないでしょうか。 よろしく御願いします。 #!/usr/bin/perl use DBI; $dbfilename = "./testdb"; &dbcon; $sth = $db->prepare("INSERT INTO user VALUES(\'1\',\'abc\')"); $sth->execute; $sth->finish; &dbuncon; exit; sub dbuncon { $db->disconnect; } sub dbcon { $makedbflag = '0'; unless (-f $dbfilename) { $makedbflag = "1"; } $db = DBI->connect("dbi:SQLite:dbname=$dbfilename","","",); if($makedbflag eq "1") { &dbmaketable; } } sub dbmaketable { $sql = "CREATE TABLE user (id, name);"; $db->do($sql); }

  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • mysqlのデータをperlで読み込んで????を表示される

    過去にもあった質問なのですが、アドバイスお願いします。 perlからmysqlにアクセスしてデータを読み込むと日本語が「??????」と表示されます。 バージョンは下の通りです。 perl:ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql:5.0 OS:windowsXP mysqlの文字コードはstatusで確かめました。 mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) Connection id: 74 Current database: Current user: ******@localhost SSL: Not in use Using delimiter: ; Server version: 5.0.27-community-nt Protocol version: 10 Connection: localhost via TCP/IP Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis TCP port: 3306 Uptime: 3 hours 39 min 2 sec Threads: 1 Questions: 232 Slow queries: 0 Opens: 26 Flush tables: 1 Open ta bles: 0 Queries per second avg: 0.018 -------------- mysql> SELECT * FROM table1 と打てば、日本語は表示されます。 perlのコードのコードを書きます。 #!C:/usr/local/Perl/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; use DBI; $user = '***'; $passwd = '***'; $sql="SELECT * FROM categ"; ----略(HTMLタグ)------ $db = DBI->connect('DBI:mysql:board:localhost', $user, $passwd); $sth = $db->prepare($sql); $sth->execute; $num_rows = $sth->rows; $categ_num=$num_rows; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print"$a[0] $a[1]<br>"; } $sth->finish; $db->disconnect; ----略(HTMLタグ)------ 結果 0 ????? 1 ????? ブラウザで文字の種類を変えても「?????」のままです。 mysqlのテーブルから取り出した値をjcode.plで変換しても変わらないようです。 &jcode::convert(\$categ[$i], "sjis"); print"<tr><td>no:$i $categ[$i] </td></tr>"; まだ、設定の足りないところがあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • MySQL
  • MySQLとの接続でfetchrow_arrayがwhile文で使えない

    こんばんは、皆さん。 MySQLをPerlから使いたいのですが、 以下のようにやっても、$flagに"OK"が入りませんでした。 つまり、whileは一度もループしないで抜けてしまっているようです。 ------------------------------------------------- use DBI; … sub dbtest{ $dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass"); $sql = "select hoge,fuge from t_name where key='value'"; $sth = $dbh->prepare($sql); $sth->execute; while( ($hoge, $fuge) = $sth->fetchrow_array ){     $flag = "OK"; } $sth->finish; $dbh->disconnect; } ------------------------------------------------- ※実際はユーザ名などは変数にしています。 バージョンは現在、 Perl:v5.8.5 MySQL:5.1.6-alpha となっているようです。 それとちょっと別件ですが、 use autouseの書式は以下でよいのでしょうか? 「use autouse DBI;」 しかし、これだけだとDBIが読み込めてないエラーになるようです。 ご教示よろしくお願いします。

    • ベストアンサー
    • Perl
  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • PerlからMysqlに接続してデータを昇順?降順に並べる方法

    こんばんは。 現在、PerlからMysqlに接続してデータを昇順?降順に並べようと思っております。 しかし、降順に並べる場合、うまく動きません。 詳細を以下に明記しますので、どなたか宜しくお願いします。 テーブル名:test テーブル内のデータ:100個 まず、昇順の場合 少し省略しますが、まず接続します。 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; これで、no5から二つ(つまり、no5とno6のみ)が抽出されると思います。 降順の場合 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no desc limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; こうすると、no6,no5という順に抽出されます。ちなみに、limit 5,2をlimit 5,3とすると、no6,no5,no4と抽出されます。なぜここでlimit 5,2の際にno5,no4でlimit 5,3の際にno5,no4,no3という順に抽出されないのか分かりません。 私がしたいのは、noを降順(no5,no4,no3・・・)という順に表示させたいのです。ただ、降順に表示させるのではなく、例えば上記でlimitで指定したように、あるnoから3つとかしたいのです。 質問が長くなり分かりにくいかも知れないのですが、どなたか力を貸していただけないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう