• ベストアンサー

レコード取得件数の表示位置について

PerlでSQL(SELECT)文を発行し、一致した件数を表示させたいと考えております。whileのループ中で演算子のカウントを利用しレコード件数を取得している為、検索結果の表示より下で表示件数を表示しています。一般のWeb表記の場合、whileの前で、何件ヒットしたかを表示させるのが常識だと考えます。 どのようにロジックを変更すれば、良いのでしょうか?件数だけの為にwhileを2回回すのも、恥ずかしいですし(^^; --------------少略-------------------- my @results; my $count; while(@results = $sth->fetchrow) { print @results, "\n<P>"; $count++; } if ($sth->rows == 0) { print "<font color=red>該当するデータはありません</font>"; }else{ print "<font color = red><B> $count 件見つかりました!"; } --------------少略--------------------

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

while の中で表示せずに、別の配列に入れておいて件数の後に表示するようにすればよいと思います。 my @results; my $count; my @display; while(@results = $sth->fetchrow) { push @display, [@results]; $count++; } if ($sth->rows == 0) { print "<font color=red>該当するデータはありません</font>"; }else{ print "<font color = red><B> $count 件見つかりました!"; print @$_, "\n<P>" foreach @display; }

skypearl
質問者

お礼

教えて頂いた通りやってみたら、問題なく完成しました。ありがとうございました。

その他の回答 (1)

回答No.2

------------------------------------------------------------- my @results; my $count; if ($sth->rows == 0) { print "<font color=red>該当するデータはありません</font>"; }else{ print "<font color = red><b>".$sth->rows."件見つかりました!</b></font><br>"; } while(@results = $sth->fetchrow) { print @results, "\n<P>"; } ------------------------------------------------------------- $sth->rows で件数が取得できますので、最初に出力してしまえば問題はなくなるのではないでしょうか。 while(@results = $sth->fetchrow) はデータ無しの場合は回らないので問題ないかと思います。

skypearl
質問者

お礼

ありがとうございました。無事、完成させることができました。

関連するQ&A

  • DB検索の結果について

    PerlでDB検索をし、結果を画面に表示させるというプログラムを作成しているのですが、なぜか検索結果が1件の時は結果の表示がされないという現象が起こっています。複数件の時は、表示されるのですが。 プログラムは下記のようなものです。 ●入力画面から検索する文字列($name)を取得します。 #my $sql = "SELECT AAA FROM PRODUCT WHERE XXX '%$name%'"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ●一致したデータを書き出します。 print "検索製品は、$name<P>"; while(@results = $sth->fetchrow) { @results = $sth->fetchrow; print @results, "\n<P>"; print $count, " 件完了<P>"; $count++; } print "合計 $count 件、見つかりました!"; <一件の結果> 検索製品は、12345で 1 件見つかりました! <複数件の結果> 検索製品は、12345で 12345製品A 件完了 12345製品B 2件完了 12345製品C 3件完了 12345製品D 4 件見つかりました! 上記のような結果です。検索結果1件の時はデータが表示されず、2件以上の時も表示件数、合計件数は合っていますが、$countの動作がおかしいです。("件完了"になってしまう) コードの記述の仕方に問題があるのでしょうか?おわかりの方がいらっしゃいましたら、ご教授頂けると幸いです。宜しくお願い致します。

  • 配列に入った変数を二度使いたい

    perlでDBデータをセレクトし表示させるプログラムで 以下のように一回目のforループでは正常に表示されます。 二度目に表示させようとすると何もデータがなくなっているようです。 print でも、もちろんなにも表示しません。 配列名を変えてもだめでした。とこが原因なのかわかりません。 ステートメントハンドルとかが関係あるのでしょうか? いろいろ調べたのですが、ちょっとわかりませんでした。 申し訳ないのですが、教えてください。 話をまとめるとDBからセレクトした同じ行のデータを2回表示させたいということです。 よろしくお願いします。 my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS); my $sth=$db->prepare(" select * from server where no = $no "); $sth->execute; #一回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; #二回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array;

    • ベストアンサー
    • Perl
  • 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
  • 日本語だけ文字化け

    Solaris上で、Perl(5.005_03)を用い、DB(Oracle10.2.0)のデータを抽出しブラウザで表示させた際に、日本語のみが??????という感じに、半角の"?"で表示されてしまいます。 Solaris上で、cgiファイルを標準出力したり、Perlのデバッガで表示させると問題なく日本語表示されます。また、ブラウザでもDBから抽出した文字以外の日本語は問題なく表示されます。加えて、OUT関数を用いても、やはりDBから抽出した値のみ?表記になってしまいます。 下記に利用したCGIを書き出してみます。(DB接続以降の記述のみ) ------------------ここから--------------------- my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT AAA FROM XXXXX"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>\n"; print "<TITLE>DBテスト</TITLE>\n"; print "<meta http-equiv=Content-Type content=text/html; charset=Shift_JIS>\n"; print "</HEAD>\n<BODY>\n"; print "DB接続テスト<P>\n"; # display results my @results; my $count; while($count < 2) { @results = $sth->fetchrow; print "あああ"; print "@results\n<P>"; print ,$count++,"行目\n"; } $sth->finish; $dbh->disconnect; print "\n</BODY>\n</HTML>\n"; ------------------ここまで--------------------- ブラウザ表示の結果は、 DB接続テスト ???????? ???????? となってしまいます。"DB接続テスト"は正常に表示されて、print "@results\n<P>";が????に置換わり、"行目\n"が非出力となってしまいます。DB(AAA列)の値が数字や英数は問題なくブラウザ表示されます。 日本語全てが一律文字が置き換わるのであれば、文字コードの問題だと疑うのですが、SELECT文の日本語のみが、?というのはどうしてなのかがわかりません。また、Solaris上でのデバッガーや標準出力は問題なく、ブラウザやOUT関数でファイルに書き出すと、?になるのもわかりません。 もし、ご存知の方がいらっしゃいましたら、教えてくださいm(_ _)m

  • 最大値の数をカウントしたい

    初心者ですが、よろしくお願いします。 Pointの最大値を持つレコードの件数をカウントするために、 $sth = $dbh->prepare(SELECT COUNT(MAX(Point)) FROM table); $sth -> execute(); $count = $sth -> fetchrow_array(); としたのですが、うまくいきません。 COUNT()の中にMAX()を入れられないのでしょうか? だとしたらどのように書けば動くようになるでしょうか? 初歩的な質問かもしれませんが、いろいろ調べてもよくわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • CGIでマイSQLからデータを取得できない。

    Perl初心者です。レンタールサーバでmysqlからデータを取得して表示するプログラムを作りたいのですインターネットで捜したのですがよく分かりませんでした。申し訳ありませんが駄目出しでも結構ですので直すポイントになるようなアドバイス、お願い致します。 #!/usr/bin/perl #変数宣言 print "Content-type: text/html;\n\n"; use DBI; $ds = 'DBI:mysql:XXXXXXXXXXX:localhost'; $user = 'XXXXXXXXXX'; $pass = 'XXXXXXXXXX'; print "test<br>\n"; $db = DBI->connect($ds, $user, $pass) || die "Got error $DBI::errstr when connecting to $ds\n"; print "test<br>\n"; #$sth = $db->prepare("SELECT mei FROM name"); #$sth->execute; # バス経路票の中身を表示したかったたのですが出来ませんでした。 $sth= $db->prepare(qq(SELECT * FROM 'バス経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 経路票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '駅バス停関係票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # バス経路票の中身を表示したかったたのですが出来ませんでした。 print "@basskeiro<br>\n"; # 経路票の中身を表示したかったたのですが出来ませんでした。 print "@keiro<br>\n"; # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 print "@bassteikeiro<br>\n"; print "test<br>\n"; $rc = $sth->finish; $rc = $db->disconnect; exit;

    • ベストアンサー
    • Perl
  • レコード件数の表示

    夜分失礼します。 上記内容について教えてください。 今JAVAを用いてレコード件数(200件)を表示させようとしています。 しかし、レコードセットの表示方法しか知らず、またレコード件数をPHPで表示させる方法くらいしか検索できませんでした。どこがいけないか指摘してください。 以下にコア部分を書きます。 // ドライバクラスをロード Class.forName("org.gjt.mm.mysql.Driver"); // データベースへ接続 String url = "jdbc:mysql://localhost:3306/db"; con = DriverManager.getConnection(url,"root","**********") stmt2 = con.createStatement(); strQuery2 = " select count(*) AS RecordNums from ********** "; ResultSet rs2 = stmt2.executeQuery( strQuery2 ); SumNo = rs2.getFetchSize(); どうしてもSumNo=0となってしまいます。

    • ベストアンサー
    • Java
  • MySQLのcountを使って件数を表示したい

    お世話になります。 MySQL・PHPで検索のプログラムを作成しています。 検索結果の件数についてわからないところがあって質問させていただきました。 どうぞよろしくお願いします。 place・・・エリア 1,2,3,4,5,6・・・と番号が入っています。 1番が大阪、2番が東京・・・のような感じで割り振っています。 欲しい結果は、 大阪(100件) 東京(6524件)・・ ・のような形で、countした値をカッコ内に件数として表示させたいと思っております。 SELECT place,count(*) FROM test_tbl where place IN (1,2,3) GROUP BY place WITH ROLLUP; if(!($rs = mysql_query($query))) { print $query; print "クエリー失敗"; } このような感じで地域をグループ化して件数を表示させたいのですが、 1のエリアも2のエリアも3のエリアも該当するデータがない場合、「0件」という結果が欲しいのですが、 SQLのエラーが帰ってきてしまいます。 「失敗」の部分に「0」を入れれば0件になると思うんですが、こんなふうにしていいものか悩んでいます。 エラーはエラーで表示させたいんですが・・・。 そもそも、考え方自体が間違えてるのか、それとも他の方法があるのか・・・ 全く想像できない状態です。 どうか、アドバイスよろしくお願いします。

    • 締切済み
    • PHP
  • 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
  • 検索結果テーブルの背景色を変更したい

    質問があります。 以下のようにperlで検索結果を表示させているのですが、<td>の背景色を変えたいのです。 ところがbgcolorタグを挿入するとinternal server error を起こしてしまいます。 以下のようなループのなかにbgcolorタグを挿入するのは無理なのでしょうか? perl初心者なもので単純な質問かもしれませんが教えていただけたらと思います。 よろしくお願いします。 ちなみに結果は正常に表示されます。 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; print "<tr>\n"; print "<td>" . $ar[0] . "</td>\n"; print "<td>" . $ar[1] . "</td>\n"; print "<td>" . $ar[2] . "</td>\n"; print "<td>" . $ar[3] . "</td>\n"; print "<td>" . $ar[4] . "</td>\n"; print "<td>" . $ar[5] . "</td>\n"; print "</tr>\n"; }

    • ベストアンサー
    • Perl

専門家に質問してみよう