- PR -

postgres + phpで上手くいかないです

1
投稿者投稿内容
のびた
会議室デビュー日: 2007/04/08
投稿数: 5
投稿日時: 2007-04-08 12:42
すいません

fedora6
Apache/2.2.3 (Fedora)
PHP Version 5.1.6
PostgreSQL 8.1.8

phpで動かしてまして
PHP Warning: pg_errormessage(): supplied argument is not a valid PostgreSQL link resource in /home/test/Ko_Web-Master/inc/database.php on line 46

とでるんです・・・
これは なにでエラーになってるのかわからないです

↓database.php↓
<?
// *****************************************************************************
// (C)1999- itconsulting Corporation All rights reserved. System D1 Ver2.1.6
// *****************************************************************************

// --------------------------------------------------------------------------
// ■関数bconnect
// 機能:データベース接続
// --------------------------------------------------------------------------
function dbconnect($dbname){

// 接続できない場合は0.5秒間隔で10回リトライ(約 5 秒)

for($i=1; $i<11; $i++){
$conn_id=@pg_connect($dbname); // データベースに接続する
if($conn_id){break;} // 接続成功!!
usleep(500000); // 0.5 秒
}
if(!$conn_id){
return 0;
}

return $conn_id;
}

// --------------------------------------------------------------------------
// ■関数bdisconnect($conn_id)
// 機能:データベース切断
// --------------------------------------------------------------------------
function dbdisconnect($conn_id){

@pg_close($conn_id); // データベースとの接続切断

}

// --------------------------------------------------------------------------
// ■関数bproc($conn_id,$sql)
// 機能:SQL発行処理
// --------------------------------------------------------------------------
function dbproc($conn_id,$sql){

$result=@pg_exec($conn_id,$sql); // sqlを実行

// $result=@pg_query($conn_id,$sql);

$errmes=pg_errormessage($conn_id);
if($errmes){
print("$sql<br><font size=\"2\" color=\"$GLOBALS[errorcolor]\">$errmes</font><br>");
exit;
}

return $result;
}

// --------------------------------------------------------------------------
// ■関数:recsget($result)
// 機能:レコード件数取得
// --------------------------------------------------------------------------
function recsget($result){

$recs = @pg_numrows($result); // 行数を取得

return $recs;
}

// --------------------------------------------------------------------------
// ■関数:itemget($result,$line,$itemname)
// 機能:項目値取得
// --------------------------------------------------------------------------
function itemget($result,$line,$itemname){

$rbuf=@pg_result($result,$line,$itemname); // 項目値の取得

return $rbuf;
}

// --------------------------------------------------------------------------
// ■関数:get_schema($query);
// 機能:データベースのスキーマを取得
// --------------------------------------------------------------------------
function get_schema($query){

global $items,$iname,$itype,$dbname,$pmax,$select_item,$table;

// ---------------------------------------------------
// テーブル名を取得
// ---------------------------------------------------
$wk=explode(" ",$query);

$wkcnt=sizeof($wk);
for($j=0;$j < $wkcnt;$j++){

$wk2=strtolower($wk[$j]);
if($wk2=="from"){
$jj=$j+1;
$table=$wk[$jj];
break;
}
}

// ---------------------------------------------------
// 項目の名称と属性を取得
// ---------------------------------------------------

$sql="select * from $table limit 1"; // 項目名・属性取得の為、1行仮発行
$result=pg_exec($sql); // select を実行
$items=pg_numfields($result); // フィールド数の取得

// セレクト対象の取得
ereg("select(.*)from",$query,$wk0); // select の対象の部分を取得
$selecter=str_replace(" ","",$wk0[1]); // スペースを削除

if($selecter=="*"){ // select * の場合
for($j=0; $j < $items; $j++){ // 全項目対象
$iname[$j]= pg_fieldname($result, $j); // 名前をセット
$itype[$j]= pg_fieldtype($result, $j); // 属性をセット
}
}else{ // select itemn,itemn・・の場合
$allitems=$items; // 全項目数を退避
$iname=explode(",", $selecter); // itemn,itemn・・の項目をテーブルへ分解
$items=sizeof($iname); // セレクト項目数の再セット

for($j=0; $j < $allitems; $j++){ // 全項目をチェック
$nmwk=pg_fieldname($result, $j); // 項目名の取得

for($i=0;$i < $items;$i++){ // セレクト項目の名前と比較
if($iname[$i]==$nmwk){ // 項目名が一致した場合は属性セット
$itype[$i]= pg_fieldtype($result, $j);
}
}
}
}


} // 関数の終わり

?>

すいません アドバイス欲しいです
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-08 13:26
引用:

のびたさんの書き込み (2007-04-08 12:42) より:

PHP Warning: pg_errormessage(): supplied argument is not a valid PostgreSQL link resource in /home/test/Ko_Web-Master/inc/database.php on line 46

とでるんです・・・
これは なにでエラーになってるのかわからないです


エラーではなく Warning ですね。
リソースが有効でないと言っています。

警告が出ているのは pg_errormessage 関数ですが、
実際には、他の PostgresSQL に関連する関数も正常に動作していないのではないでしょうか。
エラーも握り潰しているようですから、@ を取り除いてテストすることをお勧めします。

# 有効な接続がない限りは、データベースのエラーなんて取りようがないですからね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Wacky
会議室デビュー日: 2006/04/02
投稿数: 14
投稿日時: 2007-04-09 00:02
ところどころ関数が違っているような・・・。

新規に作成しているものですか?
以前動いていたものをfedora6で動かそうとしているのですか?

気になるところは、
(1) dbconnect 関数
$dbname にはどういう値を渡していますか?

(2) dbproc 関数
pg_errormessage ではなく、pg_last_error か pg_result_error

pg_query ではなく、pg_exec を利用しているのですか?

(3) recsget 関数
pg_numrows ではなく、pg_num_rows

(4) itemget 関数
pg_result ではなく、pg_fetch系だと思う。。。

(5) get_schema 関数
pg_numfields ではなく、pg_num_fields
pg_fieldname ではなく、pg_field_name
pg_fieldtype ではなく、pg_field_type


見たところ、DB接続ができていないと思う。
#dbname の引数だと、ユーザは、apache、パスワードなしで
#接続しにいっているのかな?

dbconnect 関数で返された値をきちんとチェックしていないんじゃないかな?

のびた
会議室デビュー日: 2007/04/08
投稿数: 5
投稿日時: 2007-04-09 01:21
引用:

Wackyさんの書き込み (2007-04-09 00:02) より:
ところどころ関数が違っているような・・・。

新規に作成しているものですか?
以前動いていたものをfedora6で動かそうとしているのですか?

気になるところは、
(1) dbconnect 関数
$dbname にはどういう値を渡していますか?

(2) dbproc 関数
pg_errormessage ではなく、pg_last_error か pg_result_error

pg_query ではなく、pg_exec を利用しているのですか?

(3) recsget 関数
pg_numrows ではなく、pg_num_rows

(4) itemget 関数
pg_result ではなく、pg_fetch系だと思う。。。

(5) get_schema 関数
pg_numfields ではなく、pg_num_fields
pg_fieldname ではなく、pg_field_name
pg_fieldtype ではなく、pg_field_type


見たところ、DB接続ができていないと思う。
#dbname の引数だと、ユーザは、apache、パスワードなしで
#接続しにいっているのかな?

dbconnect 関数で返された値をきちんとチェックしていないんじゃないかな?





ありがとうございます
はい 以前動いてたものを動かそうとしてました。
少し指摘していただいた点を見直そうと思います。

がんばってみます
のびた
会議室デビュー日: 2007/04/08
投稿数: 5
投稿日時: 2007-04-09 01:22
引用:

じゃんぬねっとさんの書き込み (2007-04-08 13:26) より:
引用:

のびたさんの書き込み (2007-04-08 12:42) より:

PHP Warning: pg_errormessage(): supplied argument is not a valid PostgreSQL link resource in /home/test/Ko_Web-Master/inc/database.php on line 46

とでるんです・・・
これは なにでエラーになってるのかわからないです


エラーではなく Warning ですね。
リソースが有効でないと言っています。

警告が出ているのは pg_errormessage 関数ですが、
実際には、他の PostgresSQL に関連する関数も正常に動作していないのではないでしょうか。
エラーも握り潰しているようですから、@ を取り除いてテストすることをお勧めします。

# 有効な接続がない限りは、データベースのエラーなんて取りようがないですからね。





ありがとうございます
Warning なんですね。
もう少し いろいろやってみます。
有効な接続手段をですね。
Wacky
会議室デビュー日: 2006/04/02
投稿数: 14
投稿日時: 2007-04-09 13:34
PHP3 で動いていたものを、PHP5 で利用したいんですね。。。

database.php だけでなく、他のファイルも確認した方がよいですよ。
#PHP5 で利用できない関数もあるかもしれませんので、、、
1

スキルアップ/キャリアアップ(JOB@IT)