[PHP-users 21679]Re: pg_field_typeでタイムアウト
komura
komura @ ma9.seikyou.ne.jp
2004年 5月 15日 (土) 18:34:15 JST
komura です。
On Sat, 15 May 2004 15:48:34 +0900
坂本 光弘 <msakamoto @ ybm.jp> wrote:
> 私なりに原因を調べてみたところ「pg_field_type」関数部分で異常に処理時
> 間がかっているようです。検証方法としては、以下のソースの
> 「pg_field_type」に関するところをばっさりコメントアウトして確認してみ
> ました。
> また、「pg_field_type」がきちんと想定した内容で返ってきていない場合も
> あるようです。
> どなたか、レコード数が多くても「pg_field_type」を問題なく動作させる方
> 法ご存知の方いらっしゃいませんか?
pg_field_type() は PHP の内部で pg_connect() の結果の接続を使用しています。
このため、pg_close() で先に pg_connect() で取得した接続を閉じてしまうと
うまく結果を取得することができなくなります。
pg_close() は pg_connect() で接続を開いた場合、スクリプト終了後、自動的に
接続を閉じますので、通常は呼び出す必要はないということが PHP マニュアルに
書かれています。
http://jp.php.net/manual/ja/function.pg-close.php
接続を閉じないと気持ち悪いのであれば、関数( 今回は GetShowPGData() )の
最後で呼び出すようにすれば動作すると思います。
> //
> //与えられたクエリーを表示する。
> //
> function GetShowPGData($sql){
> // レコードセットを得る
> $con = pg_connect("dbname=weblog user=pgsql");
> if ($con == false) {
> printf("データベースには接続できませんでした。理由: %s<br>\n",$php_errormsg);
> exit;
> }
>
> //クエリーの実行
> $res = pg_query($con, $sql);
> if ($res == false){
> printf("クエリー失敗。理由: %s<br>\n",pg_errormessage($con));
> exit;
> }
以下の pg_close() を削除
> //データベースのクローズ
> pg_close($con);
> //フィールド名を表示
> //レコードセットの行数を得る
> $rowcnt = pg_numrows($res);
> print "<table border>\n";
>
> //レコードセットの行数分ループする
> for ($row_num=0; $row_num<$rowcnt; $row_num++){
> print "<tr>\n";
> if ($row_num == 0) {
> //最初だけフィールド名を表示
> $colcnt = pg_num_fields($res);
> print "<th>順位</th>";
> for ($col_num=0;$col_num<$colcnt;$col_num++) {
> print "<th>" . pg_field_name($res,$col_num) . "</th>";
> }
> print "</tr>\n<tr>\n";
> }
>
> //レコードを表示
> $rec = pg_fetch_array($res, $row_num, PGSQL_NUM);
> $jyunni = $row_num + 1;
> print "<td align=\"right\">$jyunni</td>";
>
> for ($col_num=0; $col_num<$colcnt; $col_num++) {
> if ($rec[$col_num] == null){
> $rec[$col_num]=" ";
> }
>
> switch (pg_field_type($res,$col_num)){
... 省略 ...
> }
> }
> print "</tr>\n";
> }
> print "</table>\n";
必要であれば、ここで接続を閉じる
//データベースのクローズ
pg_close($con);
> }
--
komura <komura @ ma9.seikyou.ne.jp>
PHP-users メーリングリストの案内