perlでレコード件数を取得する方法と表示される件数についての疑問

このQ&Aのポイント
  • perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。
  • 質問者はレンタルサーバを使っているが、データベースには3件しかレコードが存在しない。
  • 質問者はSQLの実行が怖いため、原因を知りたいとのこと。
回答を見る
  • ベストアンサー

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

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を実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。 プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

  • MySQL
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

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

logicalpinky
質問者

お礼

こんにちはtaka451213さん。 ここ数日で、perlやDBを少し学習しました。  その結果、SELECT等の問題については、理解でき、問題も解決しました。色々とありがとうございました。 またどうしてもわからないことがあったら、この場を使って聞きたいと思います。そのときはよろしくお願いします。 親切な対応ありがとうござました。

関連するQ&A

  • perlのDBIからmysqlにINSERTINTOをやっても追加されない。help!!

    助けてください、お願いします。 phpadminで管理しているmysqlのDBへ、perlのDBIモジュールを使ってレコードの追加(INSERTINTO)をやっても、phpadminでDBをみてみると追加されていません。 DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。ソースは以下の通りです。 use DBI; $dbh=DBI->connect('DBI:mysql:データベース名:サーバホスト','ユーザ名','パスワード') or die $DBI::errstr; $sthandler = $dbh->prepare("INSERT INTO `table名` (`姓`, `名`, `メールアドレス`, `年齢`) VALUES ('名字', '名前', 'mailaddress', '0')"); $sthandler->execute; $sthandler->finish(); $dbh->commit; $dbh->rollback; $dbh->disconnect; 本当に困っています。どうかお助けください。

    • ベストアンサー
    • MySQL
  • SQLが応答しなくなっているのか、CGIが読み込み中のままになってしまいます。

    SQLを約1600回実行したら、5秒後にページを再読み込みします。 print "<html><body onload=\"setTimeout('location.reload()',5000)\">"; foreach ... {   ...   # 約1600回繰り返す   @result = select("SQL文");   ... } sub select{   my @result = ();   my($dbh, $sth);   $dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;   $sth = $dbh->prepare("$_[0]");   $sth -> execute() or return 0;   $num_rows = $sth->rows;   $num_of_fields = $sth->{NUM_OF_FIELDS};   $result[0] = $sth->rows;   for ($i=1; $i<=$num_rows; $i++) {     @fetchrow_array = $sth->fetchrow_array;     $result[$i] = join ',', @fetchrow_array   }   $sth -> finish();   $dbh -> disconnect();   return @result; } 最初の1,2回は期待通りに動くのですが、 2,3回ほど再読み込みをすると、「読み込み中」のままになってしまいます。 (期待通りに動く場合、1回の読み込みは20秒程度です。) タスクマネージャを見ると、 期待通りに動いているときは、CPU使用率が60%くらいになっていますが、 「読み込み中」のままの時は1%程度になっています。 SQLサーバーから応答がなくなっているのでしょうか? (簡単なSQLにしてみても同じでした。) 原因がわかる方、よろしくお願いします。 WindowsXP SP2 Apache1.3 ActivePerl5.6 MySQL3.23

    • ベストアンサー
    • CGI
  • perlからMySQL5に接続できません

    WindowsでperlからMySQLに接続できません。 perlは以下のようなものです。 結果は「1」と表示されるので、MySQLへの接続ができていないのだと思います。 考えられる原因がわかる方、アドバイスをお願いします。 #!/Perl/bin/perl use DBI; print "Content-type: text/html\; charset=shift_jis\n\n"; print "1"; my($dbh, $sth); $dbh = DBI->connect("DBI:mysql:database=データベース名;host=127.0.0.1", "root", "rootのパスワード",{ RaiseError => 1, AutoCommit => 0 }); print "2"; $sth = $dbh->prepare("select * from テーブル名;"); 以下略 WindowsXP SP2 Apache2.2.4 ActivePerl5.8.8 MySQL5.0

    • ベストアンサー
    • MySQL
  • perl初心者なのですが

    use strict; use CGI; use DBI; my $dbh = DBI->connect("dbi:ODBC:DB_test"); my $NAME1 = CGI->new(); my $ADDRESS1 = CGI->new(); my $LETTER_NUM1 = CGI->new(); my $TEL_NUM1 = CGI->new(); my $NAME = $NAME1->param('name'); my $ADDRESS = $ADDRESS1->param('address'); my $LETTER_NUM = $LETTER_NUM1->param('letter_num'); my $TELL_NUM = $TEL_NUM1->param('tell_num'); my $sth = $dbh->prepare("INSERT INTO table1(name1,address1,letter_num1,tell_num1) values(?,?,?,?)"); $sth->execute($NAME,$ADDRESS,$LETTER_NUM,$TELL_NUM); $sth->finish; $dbh->disconnect; フォームから受け取ったデータをデータベースに格納したいのですが、うまくいきません。誰か教えてください。

  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • 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に接続できず困っています(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
  • PerlでSQLiteを使おうとしてもうまく行きません

    下記のような感じでPerlプログラムからSQLiteのデータベースから読み出すプログラムを組んでみました。 もちろん、実際にデータベースのファイルを作ってあります。 下のように、かなりシンプルで簡単なプログラムですし、 間違ってもいないとは思うのですが・・・ use DBI; $db = DBI->connect("dbi:SQLite:dbname=accountdb","","",); $sth = $db->prepare("SELECT * FROM user"); $sth->execute;#結果を取得しresに代入 print "$sth\n"; $sth->finish; exit; 上を実行した結果は、下記の通りです。 DBI::st=HASH(0x32706c4) closing dbh with active statement handles during global destruction. 私が思うに、データが$sthに帰って来ると思うのですが、 実際にはDBI::st=HASH(*****)のようなものしかかえってきません アドバイスをどうか宜しく御願いします (別カテゴリで似たような質問をさせていただきましたが、これはまた別です・・・)

  • DBIモジュールと Perl5.8

    Perl5.8のエンコードが理解できずに困っております。 MySQLでは、utf8の文字コードのデータがあります。 以下のスクリプトを実行させると、 Wide character in print at C:/usr/local/site/lib/DBI.pm line 1008. となります。 対処方法はあるのでしょうか? use utf8; use strict; use DBI; my $dbh = DBI->connect("dbi:mysql:dbname=test", "root", "", { AutoCommit=>1, PrintError=>1, RaiseError=>1} ); my $fname = "test.txt"; my $sth = $dbh->prepare("select id, namae from test order by id asc;"); $sth->execute(); # 出力ファイルを開く。 open FILE, ">" , $fname or die "Can't open $fname: $!"; # 整形された結果をファイルにダンプする。 my $rows = $sth->dump_results(80, "\n", ",", \*FILE); # 出力ファイルを閉じる。 close FILE or die "Error closing result file: $!\n"; $dbh->disconnect();

    • ベストアンサー
    • Perl
  • 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