• 締切済み

PerlCGIでクエリの検索結果が途中で途切れる。

PerlCGIでクエリの検索結果が途中で途切れる。 環境: Windows 7 Home Premium 32bit Mem: 3.24GB Apache for win 2.2 Perl: v5.10.1 built for MSWin32-x86-multi-thread access の mdb を ODBC 接続し perl cgi をフロントエンドとして クエリを表示させようとしています。 クエリの表示自体はエラーなくできましたが、検索結果が全て表示されません。 # 本来は 200件以上あるはずなのに、半分以下しか表示されない。 感触として、バッファかなにかのバイト制限のような気もするのですが、 全ての検索結果を表示するためにはどうすればよいのかご教示いただけないでしょうか? コードは以下のとおりです。 -------------------------------------------------------- #!c:/perl/bin/perl.exe use Win32::ODBC; print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\n"; $db= new Win32::ODBC("DSN=kaigai"); $str_sql = "SELECT q_prestounyu.hiduke, q_factory_master.koujyoryakumei, q_prestounyu.keiyaku, " ; $str_sql .= "q_prestounyu.hinban, q_pres_master.ryakumei, q_prestounyu.nyukousu "; $str_sql .= "FROM (q_prestounyu INNER JOIN q_pres_master ON q_prestounyu.presno = q_pres_master.presno) "; $str_sql .= "INNER JOIN q_factory_master ON q_prestounyu.koujyo = q_factory_master.koujyono "; $str_sql .= "WHERE (((q_prestounyu.hiduke)>=#2010/1/10# And (q_prestounyu.hiduke)<=#2010/1/31#)) "; $str_sql .= "ORDER BY q_prestounyu.hiduke;"; print "$str_sql<BR>\n"; $i=0; $db->Sql($str_sql); # 取得したレコードセットの数だけループして表示 while ( $db->FetchRow() ){ $i ++; undef %FIELDS; # 各フィールドのデータをハッシュに格納 %FIELDS= $db->DataHash(); print "$i "; print "$FIELDS{'hiduke'} $FIELDS{'koujyoryakumei'}\n"; print "$FIELDS{'keiyaku'} $FIELDS{'hinban'}\n"; print "$FIELDS{'ryakumei'} $FIELDS{'nyukousu'}<BR>"; } # データベースを閉じる $db->Close( ); print "</body></html>"; exit;

  • Perl
  • 回答数3
  • ありがとう数6

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

> ブラウザからのcgi出力ではなく、コンソール上で、 > perl hoge.cgi と実行しても結果が変わりませんでしたので、 > HTML構文のエラーの可能性は低いと思っています。 説明不足でした。HTML の構文エラーを疑ったわけではなく、 最後に改行がないと、出力したテキストがすべて出力されないと いう経験があったので、それを疑いました。 コンソールで実行された場合も同じとのことですが、</body></html> は表示されるのでしょうか。それともレコードを何件か出力したところで 終了するのでしょうか。 </body></html>が出ているのでしたら、データベースからのデータの取り出し に問題がありそうです。 一度 プログラムの先頭に use strict; use warnings; をつけて実行してみてはいかがでしょうか。

  • taporu
  • ベストアンサー率44% (46/104)
回答No.2

関係ないのですがメモリ4GBではないですか?

furu_2
質問者

補足

物理的には4GBですが、OSが認識している容量を書いているだけです。 perl の gc では、この辺はあんまり関係ないと思いますが・・・

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

最後の print を print "</body></html>\n"; としても、だめでしょうか。

furu_2
質問者

補足

ご回答ありがとうございます。 ブラウザからのcgi出力ではなく、コンソール上で、 perl hoge.cgi と実行しても結果が変わりませんでしたので、 HTML構文のエラーの可能性は低いと思っています。

関連するQ&A

  • DBの検索

    #!C:\Perl\bin\perl use DBI; $shouhinmei="手袋"; $db=DBI->connect("DBI:mysql:example_DB:localhost","user","password",{RaiseError => 0,PrintError => 1}); if(!$db){ print "接続は失敗です\n"; exit; } $sql="select * from shouhin_tbl"; $sql.="where shouhinmei='" . $shouhinmei . "'"; $sth=$db->prepare($sql); if(!$sth->execute){ print "SQLの失敗です\n"; exit; } *********************************** *********************************** $sth->finish; $db->disconnect; この***で囲まれた部分に、次のような処理を行いたいのですが、どのように書いたらいいのでしょうか。 『selectのSQLが成功したとき、DBのshouhinmeiフィールドに「手袋」がすでにあるならば、そのshouhinmei_idをブラウザに表示させ、』 shouhinmeiフィールドに「手袋」がなければ、 $sql="insert into shouhin_tbl(shouhinmei)"; $sql.="values('" . $shouhinmei . "')"; として追加させたいのですが、『』はどう書いたらいいか教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Win32::ODBC。後ろスペースを切らずにデータを読み込みたい

    ActivePerlからODBC経由でACCESSデータを取得するプログラムを作成しています。 作成中の下記プログラムですと、TABLE_AのKOUMOKU_A が  ' '(半角スペース)がの場合     → ''(スペースなし)  'BBB '(後ろスペースあり)の場合 → 'BBB'(後ろスペースなし) で返ってきます。 登録されているすべての文字列を読み込みたいのですが、 何が原因で後ろスペースが切られるのかがわかりません。 ご存じのかた、ご教授願いますm(__)m 例) ============================================ use Win32::ODBC; $sql = "select KOUMOKU_A from TABLE_A;"; while ( $db->FetchRow() ){ undef %FIELDS; # データをハッシュに格納 %FIELDS=$db->DataHash(); print "'".$FIELDS{KOUMOKU_A}."'\n"; } ============================================

  • PerlとWin32::ODBCを使ってDBにアクセスするときに出るエラー

    こんばんわ。最近、Perlを使い始めたばかりの初心者です。解決方法がわからないので、教えて下さい。 PerlとWin32::ODBCを使ってDBにアクセスするプログラムを組んでいるます。DB接続まではうまくいくのですが、それ以降に以下のようなエラーがでます。モジュールが足りないようなのですが、どのようにして解決すればよいかわかりません。以下にエラーとコードを記入します。 コード: #!/usr/local/bin/perl $DSN = "DSN=DB1;UID=kaki388"; use Win32::ODBC; if (!($0 = new Win32::ODBC($DSN))){ print Win32::ODBC::Error(); print "失敗"; exit(); } print "成功"; $sql = "SELECT * FROM tbl1"; $0->run("$sql"); $0->sql("$sql"); @fn = $0->FieldNames(); while($0->FetchRow()){ undef %Data; %Data = $0->DataHash(); print "$Data{$fn[$i]}<BR>\n"; } $0->Close; エラーコード: 2004/08/26(11:49:14) W-SV 127.0.0.1 [80] E200042 "Can't locate object method "run" via package "Win32::ODBC=HASH(0x275020)" (perhaps you forgot to load "Win32::ODBC=HASH(0x275020)"?) at odbc.cgi line 11. " よろしくお願い致します。

    • ベストアンサー
    • Perl
  • PHPで絞り込み検索結果の件数を表示する

    同じ質問が数多くあるようですが、どうにもうまくいかない為恐縮ですが質問させて頂きました。 私はPHPとMYSQLを使ってホームページを作成しております。 やりたいことは、DBのTBに数百ある情報をPHPで幾つかの条件で絞り込み検索をかけることで、それ自体はできたのですが、何件の結果が抽出されたかを表示することができません。 例:○○件の検索結果が表示されました。 ←こんな感じにしたいのです。 他の質問を参考に以下のように記述をしたのですがどうにもうまくいきません。 $sql ="SELECT*FROM estate WHERE 価格 BETWEEN $price1 AND $price2'"; print 'sql_num_fields( $sql ) . "\n"件の検索結果が表示されました'; どのような点が問題なのか教えていただけますでしょうか? できればソースを教えていただけると助かります。

    • ベストアンサー
    • PHP
  • PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。

    以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php  // データベースサーバへの接続・データベースの選択  $db = mysql_connect('localhost','test','password');  $db_name = 'test';  mysql_select_db($db_name,$db);  // 処理対象テーブル  $tbl_name1 = "client_master";  $tbl_name2 = "jobmaster0717";    // 内部結合(INNER JOIN句)  $str_sql1 = "SELECT * FROM {$tbl_name1}"       . " INNER JOIN {$tbl_name2}"       . " ON {$tbl_name1}.company_ID"       . "  = {$tbl_name2}.client_ID;";  $rs1 = mysql_query($str_sql1,$db);  print "\"{$str_sql1}\"<br>\n";  // 結果セットの表示  show_rs($rs1,$db);  print "<br>\n";  // 結果セット(結果ID)の開放  mysql_free_result($rs1);    // データベースサーバの切断  mysql_close($db); ?>

  • データベース接続エラー

    質問させて頂きます。 環境はWin98SE ACTIVEPERLです。 mysql4.0です。 次のコードなんですか、 DB接続の部分とSQL実行の部分のエラー処理を消すと正常に動作します。 Perlの場合、どのようにエラー処理を記入したらいいのでしょうか? [コード] #!c:\perl\bin\perl.exe # DBI利用宣言 use DBI; print "Content-type: text/html\n\n"; print "<html><body>\n"; # MySQLに接続 $db=DBI->connect('DBI:mysql:test:localhost','',''); if(!$db){  print "MySQL接続エラー\n";  exit; } # ステートメントハンドルの作成:SQL文の指定 $sth = $db->prepare("select * from test_t"); # SQL実行 if(!$sth->execute()){  print "SQL実行エラー\n";  exit; } # 検索結果を表示 while (@rec = $sth->fetchrow_array()) {  print "id=" . $rec[0] . "\n";  print "name=" . $rec[1] . "\n";  print "<BR>\n"; } # ステートメントハンドルクリア $sth->finish();

    • ベストアンサー
    • Perl
  • Perl MSSQLに接続してSQLのVer情報を

    すみません。素人です。 Perl MSSQLに接続してSQLのバージョン情報を取得したいです。 コードを実行すると下のようなエラーが発生します。 Can't use string ("1") as a HASH ref while "strict refs" in use at C:\testPerl\test.pl SQLServer Mangement Studioでクエリー(select @@VERSION)を実行すると下のような情報を取得できます。 ******** (列名なし) Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Workgroup Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1) ********* どうも取得したデータ構造の指定がまずいように思いますが、どうすれば取得できますでしょうか? コード ------------------- use strict; use warnings; use Data::Dumper; use Win32::OLE; use Data::Dumper::Concise; use Win32::OLE::variant; use Win32::OLE::Const 'Microsoft ActiveX Data Objects 2.0 Library'; # DBサーバー名とDB名設定 my $server = "localhost"; my $db = ""; my $id = "sa"; my $ps = "testSa"; # エラー時に本処理を中止し、Perlがエラーメッセージを出力し、本プロセスが終了する。 Win32::OLE->Option(Warn => 3); # SQL Server 認証設定 my $connStr = "Provider=sqloledb;". "Data Source=$server;". "Initial Catalog=$db;". "User ID=$id;". "Password=$ps;"; # DB接続 my $objDB = Win32::OLE->new("ADODB.Connection"); $objDB->Open($connStr); $objDB->{Errors}->{Count} and die "cannot connect '$connStr'"; my $rs = Win32::OLE->new("ADODB.Recordset"); $rs->Open("select \@\@VERSION", $objDB); print "取りあえずなんか出力しようと試みる----------1\n"; print "$rs->{Fields}"."\n"; print "$rs->{Fields}->{Count}"."\n"; print "$rs->{Fields}->{Count}->{Item}->{1}"."\n"; while(!$rs->EOF ){ print "$rs->{Fields}->{Count}->{Value}"."$rs->{Fields}->{Item}->{Value}\n"; $rs->MoveNext(); } print "取りあえずなんか出力しようと試みる----------1\n"; ## DB切断 $objDB->Close();

  • SQL、between の指定方法について

    こんにちは、SQLについての質問なのですが、 PHPで以下のように、テキストボックスを指定して、値を検索 するような作りにしています。 print "<table><tr align=center>"; print "<td align=left>◎日付検索<br>"; print "<input type=text name=s_hiduke></td>\n"; print "<td align=left>◎入力者<br>"; print "<input type=text name=s_name></td>\n"; $where = ''; if($s_hiduke != ""){ $where .= $where ? "and s_hiduke~'$s_hiduke' ":"where  s_hiduke~'$s_hiduke' "; } if($s_name != ""){ $where .= $where ? "and s_name~'$s_name' ":"where  s_name~'$s_name' "; } if (!$sql) { $sql = "select * from syuhou_table ".$where;} else {$sql = str_replace("\\","",$sql);} 今回日付の部分にテキストボックスをもう一つ追加し、「5/10~5/15」 のように期間指検索が定出来るようにする為以下のようにソースを 変更したのですが上手く動作しません… print "<input type=text name=s_hiduke>~<input type=text name=s_hiduke2>&nbsp;&nbsp;</td>\n"; $where = ''; if($s_hiduke != ""){ $where .= $where ? "and s_hiduke~'$s_hiduke',  s_hiduke2~'$s_hiduke' ": "where s_hiduke between    s_hiduke~'$s_hiduke' and s_hiduke2~'$s_hiduke' "; } 何処を直せば正常に動くのか、お分かりになる方がいらっしゃいま したら、アドバイス頂けませんでしょうか。 長々とした文章になってしまい申し訳ございませんが、よろしく お願いいたします。

  • phpでmysqlを検索、計算

    PHPでmysql内のデータを、条件で絞込み、 一致するものの平均と個数を画面で表示したいのですが、 エラーが表示され、検索結果を表示することができません 現在書いているコードは以下になります ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <html> <head> <title>検索結果</title> </head> <body> <?php ~~省略~~ $Name = $_POST['namae']; $Day = $_POST['hiduke']; $conn = mysql_connect($url,$user,$pass); $sdb = mysql_select_db($db,$conn); $sql1 = select avg(score) from seiseki where name = "$Name" and day like "$Day*"; $sql2 = select count(score) from seiseki where name = "$Name" and day like "$Day*"; $sql3 = select count(score) from seiseki where name = "$Name" and day like "$Day*" and score = 1; $res1 = mysql_query($sql1); $res2 = mysql_query($sql2); $res3 = mysql_query($sql3);  print "<table border=1 cellpadding=0 cellspacing=0>\n";  print "<tr>\n";  print "<td>合計</td>";  print "<td align=right>{$sql2}回</td>;"  print "</tr>\n";    print "<tr>"; print "<td>1</td>";  print "<td align=right>{$sql3}回</td>;"  print "</tr>\n";    print "<tr>\n";  print "<td>平均</td>";  print "<td align=right>{$sql1}</td>";  print "</tr>\n";  print "</table>\n"; mysql_free_result($res,&res2,&res3); mysql_close($conn); ?> </body> </html> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー seisekiテーブルにはnameとdayとscoreがあり、 nameはyamadatarouのようにローマ字で dayは20110110のように数字で scoreには1~4の数字が入っています nameは完全一致、dayは前方一致で sql1では数字の平均、sql2では合計回数、sql3では1の回数をカウントしています 30行目「$sql1 = select avg(score) ~ ~ ~」のあたりに記述エラーがあると表示されるので、 おそらく検索方法の文法が間違っているのですが、 色々調べてみても記述の仕方がこの方法以外見つかりません 何か記述方法の間違いや別の記述方法がありましたら、ご教授お願いいたします また、現在エラーは表示されていませんが、 print近辺も見ようみ真似での記述ですので、間違いなどがありましたら ご教授いただけないでしょうか

    • ベストアンサー
    • PHP
  • 検索結果テーブルの背景色を変更したい

    質問があります。 以下のように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

専門家に質問してみよう