PHP + PostgreSQLat PHP
PHP + PostgreSQL - 暇つぶし2ch72:電動ナナシ
2001/03/15(木) 03:54
>>70
> ・$connectionを公開していないのでpg_set_client_encoding()などを行えない。

simpleQuery とかで simpleQuery("SET clientencoding TO 'EUC_JP'"); とか
して対処できない?
simpleQuery は単純に pg_execute(${simpleQuery の引数}) しているだけ
だからこれで動くと思うんだけど。

> ・query()もsimpleQuery()もその中でpg_numrows()を実行しているのに、
>  再度numRows()を実行しなければ行数が分からない。

ソース見てちょっとびっくり。この辺の扱いって実装ごとに異なっているんだ。
ううむ・・・。

PostgreSQL 前提だと、Qeury のたびに DB_pgsql のインスタンス(仮に $pgsql と
するよ)の $numrows に行数が格納される。で、$pgsql->numrows[$result] で
アクセスできる。

肝心の $result だけど、simpleQuery の場合は単純にその戻り値を使えばいいし、
query() の場合には戻ってきた DB_result 型のオブジェクトの $result に
アクセスすればいい。例えば $resultObj->result とか。


73:電動ナナシ
2001/03/15(木) 03:55
> ・Selectする手段がquery(), simpleQuery(), execute()と複数あり、迷ってしますう。

simpleQuery と query はともに直ちに実行可能な SQL 文を渡して処理するメソッド。
ただ、前者の場合には戻り値が pg_result で利用可能な結果識別子なのに対して、
後者は DB_result 型のオブジェクトが返るところが違うようだね。

execute() は prepare() とセットで実行されることが前提。で、prepare() に渡す
SQL 文には、? と & という特別なバインド変数を定義できて、前者の場合には
第二引数で渡された値(配列中の値)が、後者の場合には渡された値と同じ名前を
もつファイルの中身を SQL 文の中に結合することができるみたい。

> ・遅い(単純なページで、ページあたり+20~+30msかかる)

>>71 さんのおっしゃる通りだと思う。
あとは Zend Cache 使うとか・・・。


74:Error 401
2001/03/15(木) 13:20
あぁぁー、すごい勘違いをしてた。
インスタンス変数って、プライベートだと思っていたら、パブリック
だったんですね。
道理で、アクセッサメソッドが無いわけだ。

それから、各メソッドの説明どうもです > 電動ナナシさん
prepare() & execute()の機能には、ビックリです。
>prepare():
>Prepares a query for multiple execution with execute(). With
>PostgreSQL, this is emulated.
じゃ分からんぞ(w

75:Error 401
2001/03/15(木) 13:31
>>72
>simpleQuery とかで simpleQuery("SET clientencoding TO 'EUC_JP'"); とか
>して対処できない?

simpleQuery("SET client_encoding TO 'EUC_JP'")
でOKでした。

76:Error 401
2001/03/15(木) 14:07
恥ずかしい質問なのでsage。
$ret = $db->simpleQuery("set client_encoding to 'EUC_JP'");
if ($ret != DB_OK) {
  exit;
}
とやったところ、エラーが発生してもexitしない。
これは、エラーが発生したときに、$retに文字列が入っていて、
比較するときに文字列->数値という変換がなされ、
if (0 != 0)
という比較になるので、このifブロックには絶対に入らない。
正しくは、
if ($ret !== DB_OK)
とする必要がある。

・・・という解釈は正しいですか?

77:Error 401
2001/03/15(木) 14:39
さらに疑問が。

(1)のエラー判定は、こうするしかないのでしょうか?
ほかに判断の方法はありますか?

require("DB.php");

$db = DB::connect("pgsql://localhost/testdb");
if (DB::isError($db)) {
  exit;
}

$sql = "select emp_code, emp_name from emp";
$res = $db->query($sql);
if (get_class($res) != "db_result") {    // (1)
  exit;
}
//echo $db->numrows[$res->result] . "<br>\n";
echo "<table>\n";
while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
&nbsp;&nbsp;echo "<tr><td>$row[role_name]</td><td>$row[emp_name]</td></tr>\n";
}
echo "</table>\n";


78:電動ナナシ
2001/03/15(木) 15:56
>>76-77
ちょっと今余裕がないので、1点だけ。

simpleQuery() は Protected な Method なんだと思う。

何でかというと、simpleQuery() の戻り値は実装依存になって、実装の詳細を
隠蔽しようという DB クラスの意図に反するから。

じゃあなんで simpleQuery() なんてあるのかというと、クラスを拡張するときに
実装を意識しないといけないときのためにあるんだと思う。言い換えれば、
extend したクラスからのみこのメソッドは用いられるということ。

だから DB クラスを普通のアプリケーションから使うときには query() を使って
DB_result 型の結果を取得し、fetchRow() するのが正しい使い方になるんだと思う。

ここのサンプルコードも見てみて。query() 使っているよ。
"Best Practices: Database Abstraction"
URLリンク(www.phpbuilder.com)

エラー判定については後でね。


79:Error 401
2001/03/15(木) 16:44
>>78
電動ナナシさん、毎度どうもです。
PHPBuilderの記事をざっと読みました。
# ここ、良い記事がたくさんありそうですね。

そして、わかった&考えたこと。

・ DB.phpの思想は、DB::isError($obj)でエラー判定をする。
・ そして、DB::errorMessage($obj)でエラーメッセージを獲得する。
・ mysql.phpは確かに、query()が失敗すると、raiseError()している。
・ ところが、なぜだかpgsql.phpでは、query()が失敗すると、直接エラー
 メッセージを返している。
・ なので、DB::isError(query())というお決まりパターンが使えない。

他のDBのライブラリを全部見たわけではありませんが、DB.phpの
isError()の実装を見る限り、pgsql.phpの実装に一貫性が欠けている
気がします。

80:Error 401
2001/03/15(木) 16:57
うーん、ソースをちらっと眺めたところ、DB::isError() -> DBerrorMessage()
のしくみがきちんと機能するのは、MySQLだけみたいな気が。

>>79は間違っているのかなぁ?


81:Error 401
2001/03/15(木) 16:59
というか、ソースなんぞ見なくても、サクサクプログラミングできるのが
PEARの目標だと思うのだけれど・・・。

82:電動ナナシ
2001/03/15(木) 17:34
>>81
そうなんだよね。まだまだ発展途上。ドキュメントもないし。
そのうちクラス図を作って公開する予定。

>>80
>>79 は合ってる。それで正解。というか DB に限らず PEAR 共通の例外機構のような
ものを作りたいみたいなんだよね。で、
・メソッド実行して、成功なら普通のオブジェクトを、失敗なら PEAR_error 型の
 オブジェクトを返す
・オブジェクトについて isError($returnedObject) で成功・失敗を判定
という風にしたいような感じなんだなあ。

MySQL と OCI8 は確かにエラーが起きると raiseError() して DB_error 型
(こいつは PEAR_error を継承している)を生成して返すようになっているけど、
DB_pgsql.php はそうなっていないという点が問題みたい。

広川さん(DB_pgsql の開発者)に連絡するか、自分でパッチ送って submit すると
喜ばれるんじゃない?自分も暇が出来たらやってみよう。


83:電動ナナシ
2001/03/15(木) 17:37
あー、でも PostgreSQL ってエラーコードがない(errorMessage() で取得する
しかない)んだよね。それで実装されてないって可能性が大きいかも。

DB_pgsql.php の errorNative() のコメントを見てそう思った。


84:Error 401
2001/03/15(木) 21:18 L14mApPU
PHP-jp見てて、
URLリンク(lxr.php.net)
を発見しました。

・・・ォィォィ、おもいっきり、実装かわっとるやん。

とりあえず、simpleQuery()でエラーが発生した場合、raiseError()
しているのを確認しました。
# pgsql.phpには、query()が無くなってます。

PHPもPostgreSQLも最近始めたばかりで、php-mlの近藤氏が
どのような人かは知りませんが(でも、発言力ありそうな雰囲気)、

> ソースコードをみて、バリバリ自社で保守するだけの
> 技術力と体力のあるとこは別だけど、私なんか、とて
> も使う気になれません。テストも終ってないコードを
> 使う位なら、レベルは低くても責任もってユーザー
> サポートできる自前のツールの方がいいです。

というのは悲しいね。
DBの抽象化ライブラリとして現在も標準添付されているし、
おそらく将来もそうであろう「PEAR」なんだから、
どんどん使って、ノウハウを溜め込み、その思想を学ぶ
べきなんじゃないかなぁ、なーんて、思いますけど。

sourceforge.netを見ても、PHPのDB abstract libraryは
両手でも足りないくらい(ウソかも)あり、とても全てを
評価するなんて出来ません。

みんながそれぞれ、ちょっとづつ違うDBライブラリを作るなんて、
それこそ非生産的です。

# ところで、PEARのアノニマスCVSリポジトリってあるんでしょうか?

85:Error 401
2001/03/15(木) 21:38
> # ところで、PEARのアノニマスCVSリポジトリってあるんでしょうか?

検索したら、ありました。(先に検索しろ>自分)

cvsweb:
URLリンク(cvs.php.net)

pserverもありました。

86:電動ナナシ
2001/03/15(木) 22:03
>>84
あなた、すごいね。:-)

近藤さんの言いたいことも分かるけど、
> みんながそれぞれ、ちょっとづつ違うDBライブラリを作るなんて、
> それこそ非生産的です。
これに大いに賛成。

ただ近藤さんが一番心配しているのは SQL (DDL/DML) の互換性の問題だと思う。
サブセレクト(副問い合わせ)の対応の有無とか、トランザクションの
構文とか、ロックの構文とか実装によって全然違うからね。
# 先の PG_CLIENT_ENCODING もその問題の一つ。

だからデータ操作まで完全に抽象化するのに Pear じゃダメというのはある程度
理解できる。

ただ、アクセス方法やエラーハンドリングを標準化する意義は十分あると
思うなあ。JDBC に批判的なように、近藤さんはこの手の抽象化ライブラリ
全般に不信感があるのかもしれない。
# ODBC では確かにひどい目にあったな。

コードの信頼性は、チャレンジャー(人柱)の犠牲によって獲得していく
しかないだろうね。すると人柱が一番多いのはどれだ?という話になると
思う。今のところ PHPLib > Pear >> その他 という感じかなあ。


87:Error 401
2001/03/16(金) 10:59 .KTK4KoY
>>86

Abstract DB Libraryの目的(ターゲット)としては、例えば
SQL92 Entry Levelとかを想定して、実装していけばいいん
じゃないかなー、なんて思います。
ここ数年Oracleをやってきたんですが、最近PostgreSQLを始めて、
特にそう思います。

PEARのDBライブラリは、OracleのBC4Jなどと違って(BC4Jの
場合、DMLを一切使わずにプログラミングします。もちろん、
使おうと思えば使えます)、DMLは自分で書く、というスタンス
なので、DBの違いによるSQLの違いはライブラリ側で吸収する
必要が無いのです。
DBライブラリは、SQLをDBに送って、結果のレコードセットなり、
完了値を戻せばよいのです。

PHP-jpを見てて思うのは、クライアントアプリケーションの機能を
実現するためのコードと、ライブラリのコードをごっちゃに論じて
いる気がします。

現時点で言えば、例えばOracleとPostgreSQLを同じDBライブラリを
使って同じコードで、どちらのDBでも動くようにしようと思うのなら、
ViewやストアードサブプログラムやトリガーなどのDBエンジン内の
仕組みを駆使するしかありません。もちろん、それらのDBエンジン
側のプログラムやDDLのコードは、各DBで違うのですけど。

PEAR(というか、抽象化DBライブラリ)を使えば、クライアント
アプリケーションのコードは同一で、複数DB対応は可能だと思います。

もちろん、DB管理ツールなどは、同一のコードなどは望むべくも無く、
ゴリゴリにターゲットDBに依存しまくったものじゃないと使い物に
ならないんじゃないかなー。

なんか、とりとめが無くなってきたのでこのへんで。

88:Error 401
2001/03/16(金) 11:04
>>86
>ただ、アクセス方法やエラーハンドリングを標準化する意義は十分あると
>思うなあ。JDBC に批判的なように、近藤さんはこの手の抽象化ライブラリ
>全般に不信感があるのかもしれない。

それは、よーくわかります。

>コードの信頼性は、チャレンジャー(人柱)の犠牲によって獲得していく
>しかないだろうね。すると人柱が一番多いのはどれだ?という話になると
>思う。今のところ PHPLib > Pear >> その他 という感じかなあ。

私はPHP4.0.4から入ったので、PHPLibは使ったことないのですが、
それに慣れて、しかも発言力ある人たちが、「Pearは不安定だ、
未完成だ、使えないぞー」と声高に(というのは私が受け取った
印象ですが)言うのは、やめて欲しいなー、という感じですね。


89:Error 401
2001/03/16(金) 11:08
PearはCVSで追っかけることが出来るようになったんですが、
なにしろ、時間が無い・・・。来週末までに、今作っているシステムを
完成しないといけないんです(グチ)。

誰か最新版を追っかけて、評価する人いないかなー。
# 結局、他人を頼るのかいっ! (w

90:Error 401
2001/03/16(金) 12:10
新しいマニュアルをダウンロードしたら、PEARの章が出来てました。
忙しい人の為に、目次を引用。

V PEAR: the PHP Extension and Application Repository
23 章 PEARについて
- PEARとは?

24 章 PEAR コーディング標準
- インデント
- 制御構造
- 関数のコール
- 関数の定義
- コメント
- コードの読み込み
- PHPコードのタグ
- ヘッダのコメント部
- CVS タグ
- URLの例
- 定数の名前

LXXXIII PEAR リファレンスマニュアル
- PEAR PEAR基底クラス
- PEAR_Error PEARエラー処理機能の基底クラス

やはり、PEARのエラーハンドリングの思想は、エラーオブジェクトを
返す、というので正解でした。

91:電動ナナシ
2001/03/16(金) 13:18
>>84
query() は DB_common.php に移動したみたいだね。で、query() では simpleQuery() を
中で呼び出して使っている。こっちの方がエレガントでいいよなあ。
# Refactoring だね。:-)

>>87
思いっきり同意。
「何をクラスライブラリで共通化するか」という議論が抜け落ちている感じがするね。


92:47
2001/03/16(金) 18:23 0/o1UMNg
たびたび申し訳ないです。
>>48>>50で教えていただきました方法を試してみました。
GRANT SELECT ON (VIEWのテーブル名) TO PUBLIC;
ですが、この場合PUBLICとは誰にでも許可するというような意
味合いと解釈したのですが、実際にはまだエラーが続いてしまい
ます。
nobodyは上記publicとは全く別者なのでしょうか?
GRANT SELECT ON (VIEWのテーブル名) TO nobody;
とする必要があるのでしょうか?(実際試してみればいいとは思
うのですが、何か解説等があれば教えていただきたく思いました。)

93:ゾリ大佐
2001/03/16(金) 18:38 7X0S2/Ts
>>92 ...to public なら、全てのユーザーに許可されます。
postgresアカウントでcreateuser nobodyしてみました?

94:47
2001/03/16(金) 21:26 4ESozwmw
>>93 ありがとうございます。
おっしゃる通り、nobody自体のアカウントが作成してありませんでした。
目標とする結果はブラウザ上に現れませんでしたが、今回は間違いなくDB
への接続は出来ているようです。
私のスクリプトが間違っていると思われ、ブラウザ上には何もエラーメッセ
ージは出ませんが、画面は真っ白でした。

今度こそ、ゆっくりスクリプトの方に挑戦してみます。

また判らないことありましたらお伺いさせていただきます。

95:47
2001/03/16(金) 23:20 Dq2EXQwY
只今スクリプトの間違いを訂正して、ようやくDBからのデータ出力が出来ました。
まだ勉強を始めたばかりのため、複雑なSQL文やPHPのスクリプトは書けませんが、
取り敢えずブラウザ上にデータが表示されたことには感動しました。

96:名無しさん@お腹いっぱい。
2001/03/17(土) 16:01 O8m0NJyM
お尋ねです。PHPで金額の表示をしたいのですがどうすればいいでしょうか。
例)1000 → 1,000 のように。
お願いします。

97:名無しさん
2001/03/17(土) 17:12
>>96
number_format()

98:名無しさん@お腹いっぱい。
2001/03/17(土) 19:14 O8m0NJyM
>>97
金額の表示OKでした。
どうもありがとうございました。

99:Error 401
2001/03/19(月) 16:04 JUrUc3Rc
なかなかよさそうなページ発見。
URLリンク(www.zend.com)

英語では、「抽象化DBクラス」を「Database Abstraction Class」って
言うみたいですね。

100:Error 401
2001/03/19(月) 20:25 JUrUc3Rc
PHP全般のnews groupも発見。(MLと同じ内容だけど)
news.php.net
PEARもあるよ。

おまけ:CVS currentなPEARのサンプルです。

require("DB.php");

$db = DB::connect("pgsql://localhost/fdkwf");
if (DB::isError($db)) {
&nbsp;&nbsp;exit;
}
// echo $db->toString() . "<br>\n";
$db->setFetchMode(DB_FETCHMODE_ASSOC);

$sql = "select emp_code, emp_name from emp";
if (DB::isError($res = $db->query($sql))) {
&nbsp;&nbsp;echo DB::errorMessage($res);
&nbsp;&nbsp;exit;
}

echo "<table>\n";
while ($row = $res->fetchRow()) {
&nbsp;&nbsp;echo "<tr><td>$row[emp_code]</td><td>$row[emp_name]</td></tr>\n";
}
echo "</table>\n";

$db->disconnect();

101:Error 401
2001/03/19(月) 21:00 JUrUc3Rc
ついでに、PostgreSQL情報も。
PostgreSQL 7.1beta6が出てたのでインストールしました。

やっとDEBUGメッセージがpsqlにも出るようになった。
これが無いと、デバッグきついからね。

beta5でバグってた、serial型も修正されてた。

マニュアルに、『Porting from Oracle PL/SQL』が追加されてた。
テキスト換算で500行くらいのドキュメント。
マニュアルは、beta5から、かなり増えてる。

102:Error 401
2001/03/19(月) 21:10
あと、日本語対応のODBCも入ってるみたい。

ChangeLog:
> 2001-03-16 08:03 inoue
>
> * src/interfaces/odbc/: multibyte.c, multibyte.h: Oops I forgot to
> add new files for multibyte support. Sorry Eiji.

だったらしい。

103:Error 401
2001/03/19(月) 21:12
なお、ちゃんとした情報は、ChangeLogを参照してください。
ウソ書いてる可能性大。

104:名無しさん@お腹いっぱい。
2001/03/20(火) 01:44 a/ATm0Yw
PostgreSQLをpostmaster -S -i で起動しておいて
telnet www.hoge.com 5432
ってやってなんかコマンドを打ってみたいのですけど
なにうてばいいのでしょう?何打っても
EInvalid packet lengthConnection closed by foreign host.
とでてしまうのです。やさしいお兄さんおしえてください。

105:電動ナナシ
2001/03/20(火) 06:42
この辺にプロトコル仕様出てるよ。
普通に psql の感覚でコマンド打ってもダメだよ。
URLリンク(www.postgresql.org)


106:電動ナナシ
2001/03/20(火) 06:45
>>101
なかなか 7.1 Release 出ないね・・・。
石井さんは 2 月中って言っていたのに。結構難航しているのかな。


107:名無しさん@お腹いっぱい。
2001/03/21(水) 15:59 DtPUdB3c
データをフォームより次のページ渡すとき、
GET,Hidden以外でできるのでしょうか?
Hiddenを使用しないページは、ユニークなIDが
渡っているような気もしますが・・。
他にデータを格納して、次のページでそのIDを参照し
データを取得してるとか・・。
どうされてるんでしょうか?

108:名無しさん@お腹いっぱい。
2001/03/21(水) 16:21
>>107
PHP4なら、sessionを使えばできる。マニュアルの
LXVIIIセッション処理関数
を参照。

109:名無しさん@お腹いっぱい。
2001/03/22(木) 00:10 GJXSK57Q
今PHP3のスクリプトを作成していて、どうしても基本的な部分が
判らず困っております。

フォーム(test1.php3)からデータを受取り、それをデータベース(Postgre SQL)
へ登録する際、それを処理するページがtest2.php3とお考え下さい。

登録用フォームにはtext形式でname="cr"という項目にデータを入力
してもらいます。
因みにPostgre SQL側ですが、crにはNull不可としてあります。

ここでデータ登録は問題なく処理が出来ました。
しかし、もしデータが何も入っていない時と、test1.php3をブック
マークとかに登録されていた場合には、直接このページへ入って来
た時にエラー表示を出したいと思いました。

そこでただinsert処理をしていたスクリプトにエラー処理用のスクリ
プトを追加してみたいと思ったのですが、どうにも上手に処理出来ま
せん。

この場合、以下のスクリプトで解決する方法はどうすればいいでしょ
うか?

// ここにfunctionを設定?
if(ここに何をいれるのか?)
{
print('エラーです'\n);
}
ellse
{
現在使用しているinsert処理用のスクリプト
}

宜しくお願いいたします。


110:109
2001/03/22(木) 02:07 4SRnrY4g
ごめんなさい。
自分で解決出来たと思われます。

ついWindowsの癖で、フォームで使用するタグにvalue="$cr"を入れておらず、
それが問題だったような気がします。

if($cr == "")
{
print("エラーです\n");
}
else
{
insertの処理
}
で問題なさそうな気がします。(現在テストした結果ですが)

何か問題があるような場合、ご指摘いただけましたら幸いです。

111:名無しさん@お腹いっぱい。
2001/03/22(木) 13:50 BwCaGgrc
>>105
電動ナナシさんありがとうございました。
ちょっとむずかしくて解りませんでしたけど。
もしよかったらなんかサンプルコードありませんか?
例えばpg_userにアクセスするような。
HTTPがわかりやすすぎるのでしょうか?はぁ。

112:Error 401
2001/03/23(金) 14:18 PzDdYM6s
PEAR DBのCVSでUpdateが入ってました。
$ cvs update
P common.php
P mysql.php
P odbc.php
P oci.php
common.php以外は、PostgreSQLには関係無いけど :-P

ちなみに私はPEARに全面移行しました。

113:Error 401
2001/03/23(金) 19:54 PzDdYM6s
質問。
持続的接続を使ってる人います?
なんか、動きがおかしいんです。
1. php.ini : pgsql.max_persistentの値より、プロセスが増える。
2. 'now'::timestampの値がおかしい。

1.は、テストとして10を設定してるんですが、プロセスが10を超えてしまいます。
どこまで増えるかは不明。

2.は、ストアードファンクションの中で、
insert into tbl(col) values('now'::timestamp)
とやると、過去のtimestampが記録されることがあります。
ひょっとすると、過去に立ち上がったプロセスに接続されると、
この現象が起きるのかもしれませんが、良くわかりません。

・・・というわけで、現在は持続的接続は使っていません。
でも持続的接続にすると、ページあたり、-30ms位になるんだけどなぁ。

114:名無しさん@お腹いっぱい。
2001/03/23(金) 20:59 QOTp2BjA
ど素人なんですけど
持続的接続はhttpdのpidごとに張るんですよね。
だからプロセスが変わるってのは変なのではないでしょうか?
ストアドだから張ったときのnow読んでいるって言う可能性は
ないのでしょうか?
この板にがんばって発言してみようと思ってるんですけど
ほんとど素人であーぱーナこといってすいません。

115:電動ナナシ
2001/03/23(金) 21:25
>>113
ソース見たけどよくわからんなあ。
チェックは働いているみたいなんだけど。

全プロセスで pConnect() してるの?
どこかで Close() したりしてない?

daemontools 使って PgSQL 側の接続状況調べて、同時に何コネクション
張りにきているか調べてみたら?
URLリンク(tanaka-www.cs.titech.ac.jp)


116:Error 401
2001/03/23(金) 21:27
>>114
うーん、昨日から持続的接続のテストを始めて、
今日になって、'now'::timestampに昨日の日付のものが
登録されるようになったんです。

サーバは、昨日から立ち上げっぱなし、
クライントは、今日立ち上げたもの
です。

持続的接続は、クライアントがいなくなった場合、そのプロセス
は残っていて、接続要求があったときに、空いてるプロセス
があれば、そこにつなげる、というふうに思ってたんですが、
間違いでしょうか?

117:Error 401
2001/03/23(金) 21:29
>>115
あ!
PEARのDB::close()してるとこがありました。
このことが、何かおかしな状況を作り出す原因なのかな?

118:Error 401
2001/03/23(金) 21:35
>>115
daemontoolsは、ちょっとスケジュールが厳しいので、
インストールして、調査、っていうのは厳しいなぁ。
来週火曜日までに、ひととおり作り上げ、来月稼動なので。

来週火曜日で承認されたら、また調査してみます。

119:電動ナナシ
2001/03/23(金) 21:41
持続的接続というのは、あくまで Apache/PHP <--> RDBMS 間の話というのは
いいよね。で、close() すると持続的接続でも接続解除されるというのも
いいよね。

で、持続的接続の場合には次のようになる。

例えば pgsql.max_persistent = 2 とするよ。
最初に pConnect() するよね。
・PHP の持続的接続数 = 1
次に pConnect() するよね。
・PHP の持続的接続数 = 2
次に pConnect() すると失敗
・持続的接続数 > max_persistent が成立

でも、次の場合はうまくいく。
最初に pConnect() する。
・PHP の持続的接続数 = 1
次に pConnect() する。
・PHP の持続的接続数 = 2
どれかがいったん close()
・PHP の持続的接続数 = 1
次に pConnect() する。
・PHP の持続的接続数 = 2

こんな感じになると思う。間違っていたらスマン。


120:電動ナナシ
2001/03/23(金) 21:49
あ、上のはあくまで別ホストに接続する場合だよ。

pConnect 関数は、過去の接続を覚えていて
・以前接続したのと同じコネクションがあれば、それを再利用
・そうでなければ接続
を行う。

で、「以前と同じ接続」かどうかは
"pgsql_HOSTNAME_PORT_OPTIONS_TTY_DBNAME"
という文字列で判断される。つまりホスト名、ポート番号、接続オプション、
端末名、データベース名の組み合わせがいっしょなら同じ接続、
そうでなければ別の接続になる。

pgsql.max_persistent は上記組み合わせの個数を制限するもの。
仮に Apache のプロセス数が 100 あっても、同じホストの同じ DB に接続
するなら、コネクションは一つしか張られないから max_persistent の
制限にはひっかからない。

あるコネクションへのアクセスが許可される Apache のプロセス数ではないよ。


121:電動ナナシ
2001/03/23(金) 21:59
ちなみに何でこのような持続的接続をするとかというと、
・セッション確立のコストが大きい(メモリと CPU に負荷を与える)
・WWW の場合、リクエスト単位で接続するとセッション確立・破棄が
 頻繁に行われることになり、さらに負荷がかかる
から。

で、複数リクエストを一つのデータベースセッションで処理することで
この問題を解決しようということで、持続的接続というアイデアが
生まれたんだよね。確かもともとはミドルウェア(トランザクション
モニタの Connection Pooling 機能)だと思った。


122:Error 401
2001/03/26(月) 14:40 zxG0OE1w
> 持続的接続というのは、あくまで Apache/PHP <--> RDBMS 間の話というのは
> いいよね。で、close() すると持続的接続でも接続解除されるというのも
> いいよね。

ん、勘違いしてました。
close()で接続解除されるのは、あくまでも「仮想接続(勝手に名前
付けました)」で、httpd <-> postgresの接続は残るものだと思って
ました。じゃないと、postgresのプロセスが死なないことに説明
がつきません。
そもそも、close()しても、このpostgresのプロセスが残る、という
のが、何かおかしいのでしょうか?

# OracleのBC4Jにおけるコネクションぷーリングの考え方とは
# かなり違うなぁ。

※仮想接続とは、ブラウザ <-> httpdのHTTPセッションを越えた、
複数HTTPセッションにまたがる、仮想的なDBコネクションを
指しています。

> "pgsql_HOSTNAME_PORT_OPTIONS_TTY_DBNAME"
> という文字列で判断される。つまりホスト名、ポート番号、接続オプション、
> 端末名、データベース名の組み合わせがいっしょなら同じ接続、
> そうでなければ別の接続になる。

うーむ、テストは同じクライアントから、同じデータベースへの
接続を、同じユーザ名、パスワードで繰り返すものだったから、
やっぱりPostgresのプロセスが増殖していくのは納得いきません。

# PostgreSQL 7.1RC1出てますね。

123:電動ナナシ
2001/03/26(月) 16:09 Ak2GGF56
>>122
Postgres が残るってのは不思議だなあ。勘違いしてるかもしれないので、
ちょっと調べてみる(ちゃんと確認しているわけじゃなかったので)。

PostgreSQL と Apache/PHP は同じサーバーで動いているの?
lsof 入れてみて、どの Postgres プロセスが誰とお話しているか調べて
みたらどうだろ?


124:Error 401
2001/03/26(月) 17:17
>>123
電動ナナシさん、いつもどうもです。
なんか、お手間を取らせてしまってすみません。

今、とんでもなくテンパッテるので、私の方の再試は水曜日以降に
なります。

125:名無しさん@お腹いっぱい。
2001/03/26(月) 17:30 pwdcVObI
>>113
> 2.は、ストアードファンクションの中で、
> insert into tbl(col) values('now'::timestamp)
> とやると、過去のtimestampが記録されることがあります。

これは、'now'::text にしなくちゃ、って話じゃなかったらスマソ

126:Error 401
2001/03/26(月) 18:13
>>125
.> これは、'now'::text にしなくちゃ、って話じゃなかったらスマソ
むむ。
test=# select 'now'::text;
とやると、
?column?
----------
now
(1 row)
となるのですが・・・。

# PostgreSQL 7.1beta6です。
# 運用開始までに、7.1出るのだろうか・・・。

127:名無しさん@お腹いっぱい。
2001/03/26(月) 19:19
>>126
いや、そうじゃなくて、トリガーとかで 'now'::timestamp って
するとトリガー生成時点の 'now' になっちまうんで、'now'::text
にしとくって話。

128:Error 401
2001/03/26(月) 20:19 zxG0OE1w
>>127
あっ。理解できました。

で、いろいろ調べたんですが、

CURRENT_TIMESTAMP -- SQL92準拠
now() -- PostgreSQL固有?
'now'

のどれでも、現在時刻を返してくれます。

> いや、そうじゃなくて、トリガーとかで 'now'::timestamp って
> するとトリガー生成時点の 'now' になっちまうんで、'now'::text
> にしとくって話。

そういえば、この話どこかで見覚えがあるんですが、
マニュアルに載ってるのですか?
マニュアルは、ローカルでNamazu化してるんですけど、
検索できませんでした。

129:127
2001/03/26(月) 20:42
>>128
それが私もどこで見かけたんだか忘れてしまいまして・・・

130:Error 401
2001/03/28(水) 10:42 DXCaFMjw
持続的接続の調査をしました。

[環境]
PHP 4.0.4pl1 (pearはCVS currentのもの)
PostgreSQL 7.1RC1

使ったソースは以下。

-- test.php ---------
<?php
&nbsp;&nbsp;require("DB.php");
&nbsp;&nbsp;$db = DB::connect("pgsql://localhost/test", true);
&nbsp;&nbsp;if (DB::isError($db)) {
&nbsp;&nbsp;&nbsp;&nbsp;echo "Connect failed.";
&nbsp;&nbsp;&nbsp;&nbsp;exit;
&nbsp;&nbsp;}

&nbsp;&nbsp;echo "Connect success.";
&nbsp;&nbsp;$db->disconnect();
?>
----------------------

PostgreSQLは、
pg_ctl start -o -i
で起動。

-- php.ini -------------------
pgsql.allow_persistent = On ; allow or prevent persistent link
pgsql.max_persistent = 10 ; maximum number of persistent links. -1 means no limit
pgsql.max_links = -1 ; maximum number of links (persistent+
-------------------------------

続く。

131:Error 401
2001/03/28(水) 10:43 DXCaFMjw
・まずブラウザでtest.phpを表示してみる。
  →postgresのプロセスは残ったまま

・そのまま何回かリロードしてみる。
  →postgresのプロセスは残ったまま。ただしプロセス数は増えない。

・時間を置いてリロードしてみる。
  →規則性はわからないが、あるタイミングでプロセスは増えていく。

・どこまで増えるかはわかりません。

ps -ef | grep postgresの結果
postgres&nbsp;19528&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;09:27&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;./postmaster&nbsp;-D&nbsp;/usr/local/pgsql
postgres&nbsp;23715&nbsp;19528&nbsp;&nbsp;0&nbsp;10:02&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;postgres:&nbsp;nobody&nbsp;test&nbsp;127.0.0.1
postgres&nbsp;23723&nbsp;19528&nbsp;&nbsp;0&nbsp;10:04&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;postgres:&nbsp;nobody&nbsp;test&nbsp;127.0.0.1
postgres&nbsp;23813&nbsp;19528&nbsp;&nbsp;0&nbsp;10:12&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;postgres:&nbsp;nobody&nbsp;test&nbsp;127.0.0.1
postgres&nbsp;24841&nbsp;19528&nbsp;&nbsp;0&nbsp;10:26&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;postgres:&nbsp;nobody&nbsp;test&nbsp;127.0.0.1

続く。

132:Error 401
2001/03/28(水) 10:44 DXCaFMjw
・lsofをインストールしてみましたが、使い方が良くわかりません(^^;

とりあえずオプション無しの結果。

postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;3,65&nbsp;&nbsp;1651925&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;817675&nbsp;/home2/local/pgsql7.1RC1/bin/postgres
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;492888&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180226&nbsp;/lib/ld-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;&nbsp;79474&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180244&nbsp;/lib/libcrypt-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;197984&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180288&nbsp;/lib/libresolv-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;523855&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180236&nbsp;/lib/libnsl-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;&nbsp;72276&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180272&nbsp;/lib/libdl-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;545453&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180228&nbsp;/lib/libm-2.1.3.so
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;174341&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;639164&nbsp;/usr/lib/libreadline.so.4.0
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;&nbsp;&nbsp;14837&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180309&nbsp;/lib/libtermcap.so.2.0.8
postmaste&nbsp;24841&nbsp;postgres&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;3,7&nbsp;&nbsp;5309068&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180230&nbsp;/lib/libc-2.1.3.so

[考察]
うーん、全く進歩なし(^^;


133:Error 401
2001/03/28(水) 11:05 DXCaFMjw
ふと思いついて、phpinfo()してみた。

さっきのプロセスが残っている状態で見てみると、
Active Persistent Links 0
Active Links 0

disconnect()なしでスクリプトを実行すると、
Active Persistent Links 1
Active Links 1

その状態で、disconnect()すると、
Active Persistent Links 0
Active Links 0

プロセスは1個増えました。
ちなみに、これらのプロセスは24時間たっても消えません。
Apacheを止めると消えます。

[考察]
PHPの持続的接続のリンク数の管理はうまくいっているみたい。
プロセスの生成・消滅条件は、いまだわからず。

134:Error 401
2001/03/29(木) 09:00
えーと、ひょっとして気になさっている方がいるかもしれないので、
報告しておきます。

結局、現状理解の糸口さえ見つからない状態なので、
持続的接続を使うのは、とりあえず止めます。

PHP4.0.5 + PostgreSQL7.1がそろったあたりで、再チャレンジします。

135:Error 401
2001/03/29(木) 18:24
持続的接続の謎解明?

仕事の合間に、いろいろとWebを検索してみたら、
「postgresプロセスが死ぬのは、対応するapacheプロセスが
死んだとき」
という情報にあたりました。
どっかの英語のBBSです。

今使っているサーバは、apacheを起動すると、apacheのプロセスが
10個立ち上がります。
で、これに空きがある場合は、HTTPリクエストをこれらのプロセスが
処理します。HTTPセッションが終了しても、これらのプロセスは
残ったままです。
持続的接続で立ち上がったpostgresプロセスは、これらのプロセス
との間に、DBセッションを確立します。
だから、close()しても、postgresプロセスは残ったままなんです。

・・・という線で自分を説得。多分正解。

136:電動ナナシ
2001/03/30(金) 06:59
ふうむ、そういうことなのかあ。
ソースちょっと追ったけど、connect() の場合と pconnect() の場合とで
ほとんど同じ処理をしているんだよね。単にリンク数のカウンタ処理部分が
違うくらいで。

connect() だと postgres は死んでくれるの?

謎だあ。もうちょっと追ってみよう。
# 暇ができたらだけど・・・。


137:Error 401
2001/03/30(金) 09:17
>>136
>connect() だと postgres は死んでくれるの?

はい、死んでくれます。

>謎だあ。もうちょっと追ってみよう。

念の為書いときます。
configure optionの --enable-sigchildが、Oracleの持続的
接続を使う場合には必要という情報を見つけ、
リコンパイルしてみたんですが、これは関係ありませんでした。
オプション無しの場合と全く同じ挙動でした。

138:電動ナナシ
2001/03/30(金) 17:52
>>137
なんとなく原因がわかった雰囲気。

ひょっとして PostgreSQL だけでなく、あらゆる持続的接続の Close が
きちんとされてないという予測を立てたんだけど、追試できる人っている?


139:名無しさん@お腹いっぱい。
2001/03/30(金) 18:45 PF8gszDA
きちんとって何?
close で close されたら、pconnect の意味なし

140:電動ナナシ
2001/03/30(金) 19:45
え、じゃああれでいいんだ。
馬鹿さらしてしまった。鬱だし脳。


141:名無しさん@お腹いっぱい。
2001/03/30(金) 20:12 PF8gszDA
pconnect は、apacheのpreforkみたいなもの。
バックエンドをpreforkさせるための便宜的手法。
fastcgi みたいなものと言った方がわかりやすい?

142:Error 401
2001/04/03(火) 17:13
ひっそりと、PostgreSQL RC2が出てるよsage。
しかし、話題になりませんね・・・。

143:電動ナナシ
2001/04/05(木) 08:30
>>142
PostgreSQL の場合、ホビーよりビジネスでの利用が多いから、
安定性が確認されていないベータ版には興味がないのかもしれないね。

そういえば PHP-jp に pConnect() 時の Backend の数を質問していた人が
いたけど、回答がなかったね。

あと一応確認。そんなことも知らんのかって言われそうだけど・・・。

Module 版の PHP の場合、Apache で fork() された分だけプロセスが
あると思っていいんだよね?。例えば Process ID が 1000 な httpd と
1001 な httpd がある場合、httpd に組み込まれた PHP はそれぞれ
別々のプロセスとして動作するんだよね。

そうだとすると persistent_links や max_links は httpd プロセス
ごとに効くことになるから、Process 数 x {persistent|max} links に
なるのは当然ということか。
# これらの数字は PHP/Zend Process ごとに保有されるみたい。


144:名無しさん@お腹いっぱい。
2001/04/05(木) 12:21 JmQP/k0Y
>>142
>PostgreSQL の場合、ホビーよりビジネスでの利用が多いから、
>安定性が確認されていないベータ版には興味がないのかもしれないね。

7.1前提でシステムを作っている私って・・・
# 4/23リリース予定。それまでにRelease版出るかなー?

>そういえば PHP-jp に pConnect() 時の Backend の数を質問していた人が
>いたけど、回答がなかったね。

すぐに自己フォローしてたから・・・。
ちなみに、あれは私じゃありません。

>Module 版の PHP の場合、Apache で fork() された分だけプロセスが
>あると思っていいんだよね?。例えば Process ID が 1000 な httpd と

fork()って、PHPのプロセスのことですか?
だったら、fork()はしないと思いますが・・・。
# ここ、暇なときにDSOの仕組みをもう一度調べて、間違ってたら訂正します。

異なるhttpdに接続されたHTTPセッションは、全く関連性が無いと
思います。
# これも、後日訂正の可能性あり。

145:電動ナナシ
2001/04/05(木) 12:54
>>144
> fork()って、PHPのプロセスのことですか?
いや、httpd のプロセスのこと。
さっきマニュアル見たらちゃんと書いてあった。httpd の Child Process ごとに
永続的接続するよって。
鬱だし脳。
URLリンク(www.php.net)


146:名無しさん@お腹いっぱい。
2001/04/05(木) 16:26 tP58bUgQ
ブラウザ上にフォームで$test_idという項目が設けてあり、そこに2文字(本
来は英数字のみの組合せ)を入力してもらい、それをPHPを通じてPostgreSQL
からデータをピックアップ予定です。
この$test_idがselect文において
select * from t_test where test_id = $test_id
としてデータをピックアップする際の判断材料です。
しかし、フォームの場合だと何も入力しないで送信したり、2文字
と指定していても1文字しか入れないなど、色々問題が考えられま
すよね?
で、それらはPHP内にエラー処理スクリプトを書いて、自分では
「完璧!」とか思っていたのです。
でも、ちょっと不安だったので、色々とフォームに英数字以外に
記号など(*や!などなど)を入れると、エラーが出ることが判明
しました。

このような記号が入力されたとき、何か上手にエラー対処する方
法などを教えていただけませんでしょうか?

147:名無しさん@お腹いっぱい。
2001/04/05(木) 16:41
>>146
ereg()とかpreg_xxxx()などの正規表現ライブラリ関数を使って、
妥当性チェックしてみてはいかが?


148:146
2001/04/05(木) 23:25 tP58bUgQ
>>147
早速ereg("[[:alnum:]]{2}", $test_id)として、ちゃんと指定の
形で英数字2文字だけが入力されているかを判定させてみました。
無事考えていたことが出来ました。
ありがとうございます。

149:名無しさん@お腹いっぱい。
2001/04/06(金) 16:39
ereg()の正規表現って気持ち悪いね
ereg()の正規表現って気持ち悪いね

150:名無しさん@お腹いっぱい。
2001/04/06(金) 23:58 EZv8sM3A
149って気持ち悪いね
149って気持ち悪いね

151:名無しさん@お腹いっぱい。
2001/04/07(土) 05:13 vwo99Xeg
>PostgreSQL の場合、ホビーよりビジネスでの利用が多いから、
>安定性が確認されていないベータ版には興味がないのかもしれないね。

つーか、ほいほい導入してもデータの移行が大変なんだよ

152:名無しさん@お腹いっぱい。
2001/04/10(火) 14:37 zIPEt9lw
セッション管理についてわかりやすく説明されている
サイトはありますか?

153:名無しさん@お腹いっぱい。
2001/04/11(水) 01:46
基本中の基本だとは思うのですが、私の少ない脳味噌では考え付かないので、
どなたかご親切なアドバイスをいただけませんか?

フォームからInsert用のデータを受取り、それを処理するファイルがhoge.php3
とします。
フォームからのデータ自体をphp3利用でPostgreSQLにInsertすることまでは出
来ました。
しかし、このままでは本当にそのデータがちゃんとデータベースに登録されたのかど
うかがフォームに書き込んだ人は判りませんから、同じhoge.php3にデータ登録後
に今度は今ちょうど登録したデータはこれでいした、みたいに表示させたいのです。
でも、それを簡単に処理する方法がどうしても思い付きません。

是非この簡単・初歩の初歩だとは思うのですが、それすら判らない厨房に是非暖かい
アドバイスをいただけませんでしょうか?


154:名無しさん@お腹いっぱい。
2001/04/11(水) 02:49 bTSMk3Jw
$sql = "insert into hoge values('$hoge')";
$result = pg_exec($sql);
if($result){
echo "登録したデータは$hoge";
}

155:Error 401
2001/04/11(水) 10:38 BTheoUl2
>>153
どこが判らないのかが良くわかりませんが、
pg_getlastoid()
を使えば、pg_exec()でInsertされたオブジェクトのoidを取得できます。これで、
select * from table_name where oid = $last_oid
とすれば、今Instertしたタプル(行)を取り出せます。

それとも、取り出したタプルを簡単に表組して表示する方法がわからない
のかな?


156:名無しさん@お腹いっぱい。
2001/04/11(水) 14:34 ojYfWFHg
>>155
私もそれでいいと思います。

同時にinsert,selectの部分はトランザクション入れた方がいいかも。

oid取得後selectして、
表組みが面倒ならpg_fetch_array($r,$row)で配列に格納して
テンプレートファイルに埋め込むという手も。
見栄えはいいかも・・。



157:153
2001/04/11(水) 15:31 5X9lWT8g
>>154
>>155
>>156
皆さん本当にありがとうございます。
PHPの本を買って、色々関数を探してみているのですが、実際にそれ
らをどう活用するのかが今ひとつ理解しきれていません。

今晩家に帰って早速皆様から教えていただきました方法を試してみ
ます。
結果はまた今度お知らせします。

158:PHP-jp観察者
2001/04/11(水) 17:56
PHP-jp 11121
より引用。

-----------------------------
ってな、環境のシステムのプログラムを引き継ぐ事になってプログラムの改良を
行っているのですが、以下の様なコードで2回目のpg_execで処理が戻るまで
約40分くらい掛かってしまいます。
 ----------------------------------------------------------------------
  $sql1 = "SELECT * FROM usertable WHERE syumi='".$syumi_data."'";
  $user = pg_exec($conn, $sql1);
  $row = pg_numrows($user);
  $temp = "user_id in ('".pg_result($user, 0, user_id);
  for ($j = 1; $j < $row; $j++) {
   $temp = $temp."','".pg_result($user, $j, "user_id");
  }
  $temp = $temp."')";
  $sql2 = "SELECT * FROM maintable WHERE ".$temp." ORDER BY user_id";
  if (false == ($main = pg_exec($conn, $sql2))) {
   echo "検索失敗";
   return false;
  } else {
   echo "検索完了";
  }
 ----------------------------------------------------------------------

原因は、前のpg_execで見つけてきたuser_idが7000件近くあって、
-----------------------------

joinを知らない奴、逝ってよし。
しかも質問者は、selectを中止させる or postgresプロセスをkillする
方法を探してるときたもんだ。

159:153
2001/04/11(水) 19:44 5X9lWT8g
>>158
実は私が質問する際、PHP-jpと2ちゃんねるのどちらで聞こうか
迷いました。
最終的にこちらで教えてくれる人達の方が凄く親切・丁寧である
ような気がして、昨晩書き込みした次第です。
なんだかPHP-jpだと、初心者だと突き放されそうな気がして、ど
うも尻ごみしてしまいます。

160:Error 401
2001/04/11(水) 20:50
>>159
ここは、あまり煽ラーがいないので、いごこちいいですね。

161:電動ナナシ
2001/04/12(木) 10:39
>>158
これはちょっとショッキングだなあ。
SELECT m.user_id, .... FROM usertable u, maintable m WHERE u.user_id = m.user_id
AND u.syumi = :SYUMI ORDER BY m.user_id;
ってするだけの話だよね。

さっき pgsql にも流れてきたけど、根本的に SQL が分かっていないねえ。


162:Error 401
2001/04/12(木) 12:04
>>161
どんな言語が出ても、こうする人たちは一生こうしていくんだと思う。
で、「このSQL文投げると○○分帰ってきません」とかなる。

ちょっとSQL勉強して、各DBエンジンのクセやコスト算出方法を知れば
こんなことなくなると思うんだけど。

この間、ちょっとかかわった某大規模システムもそんな感じで設計されてた。
JOINを知らないのはおろか、数千レコードのあるカラムの合計を取ってくるのに、
数千回ループして、+=してた。
しかも、それ、Webシステムのサーバアプリ部分。どうなったのかな、アレ。

163:153
2001/04/12(木) 12:12 UHdu1Ra2
>>160
たまたま話題としてPHPの判る人でなければ煽れない(のかな?)
ということで、本当に煽ラーがいなくて助かります。
逆に皆さんの書き込み見ていると、欲しいと思っていた答えがズ
バリと回答されてたりしますので、この板を色々参考にさせてい
ただいてます。

164:名無しさん@お腹いっぱい。
2001/04/13(金) 00:34 I2dkOEWk
>155
 insert 直後なら、プライマリキーも保持したまま
だろうから、それを where につっこんだら
いいんじゃないのかな・・。
oid は、索引されてなくて遅い。


165:名無しさん@お腹いっぱい。
2001/04/13(金) 14:32
sage

166:153
2001/04/13(金) 23:38 kNEt/CpM
>>155
>>156
教えていただきましたことを参考に、以下の様に作成しましたがエラー表示です。
多分私の設定が違うと思うのですが、最後にselectする際の条件でwhere oid = $last_oid
部分がダメなのか?、という気がしてます。
というのも、テーブル自体にはoidというフィールドがないので、何を参照しているの?、と怒られ
ているのではないかと考えました。
因みにphpは以下の様に書いております。

$sql_1 = "insert into test values ('hoge');
$result_1 = pg_exec($conn, $sql_1);
$last_oid = pg_getlastoid($result_1);
if ($last_oid != 1)
{
結果を表示するテーブル作成
}
else
{
エラー表示
}

実行したとき、parse error in xxxxxx on line 103と出まして、103行目が上記における
select文のフレーズなんです。

どこで私は大きな間違いをしでかしてますでしょうか???

167:名無しさん@お腹いっぱい。
2001/04/13(金) 23:52 7roKMnwY
そもそも 主キーはないの?


168:153
2001/04/14(土) 00:19 6zrOcEr.
>>167
一応テーブル内にはIDというフィールドを設けております。
上記の例ではinsert部分で省略して書いてしまいました。
IDはprimary keyで、自動的に番号を振るようにtest_id_seq
を設定してあります。

169:153
2001/04/14(土) 00:24 6zrOcEr.
ごめんなさい、一つ間違ってました。
sql_1 = "insert into test values ('hoge');
$result_1 = pg_exec($conn, $sql_1);
$last_oid = pg_getlastoid($result_1);
if ($last_oid != 1)
{
$sql_2 = "select * from test where oid = $last_oid; <<<これが抜けてました。

で、103行目は上記のsql_2のフレーズでした
結果を表示するテーブル作成
}
else
{
エラー表示
}

170:名無しさん@お腹いっぱい。
2001/04/14(土) 00:42 3tHlDu72
くっきー

171:名無しさん@お腹いっぱい。
2001/04/14(土) 12:22 .31zka6.
主キーを設定しているんなら、oidではなく、それを where に入れたらいいやんか。


172:cookie
2001/04/14(土) 12:52
sage

173:153
2001/04/14(土) 13:46 DdiGfCB6
>>171
ご指摘ありがとうございます。
その場合、今登録された主キーのIDはどのようにして特定すればいい
のでしょうか?

174:電動ナナシ
2001/04/14(土) 13:58
POST された内容に含まれているでしょ?
というか、主キーが意味はわかっていないのかな・・・。
テーブル中のレコードを一意に識別する ID に相当する列のことだよ。

例えば、人事テーブルがあって、そのテーブルが
(従業員ID, 氏名, 住所, 連絡先)
という風になっており、同姓同名の人を区別するために従業員 ID を使って
識別しているなら、従業員 ID が主キーになる。

普通主キーとなる列に対しては、重複する列の挿入を禁止するために
Primary Key 制約か Unique 制約を定義するけど、その辺ちゃんとやってる?
これは PHP とか PostgreSQL とかいう以前の、データベース一般の設計の
お話だよ?


175:電動ナナシ
2001/04/14(土) 14:34
>>174
おおっと、ID も Primary Key はあるって >>168 に書いてあるね。
勘違いしていた。ごめんなさい。

なるほどね、INSERT した直後に、自動的に割り当てられる ID をどうやって
特定するかって質問なのね。

これは先の人が書いているように oid を取得して特定するしかないんじゃないかな。
それ以外の列って重複する可能性があるから当てにならないしね。

ちなみに自分は自動連番はやってない。登録フォームを表示するときに
squence から番号を取得して、その番号をフォームに保持させておく。
そうすれば、POST された内容に ID が入っているのでそれをキーに参照
できるようになる。

これの欠点は、番号に欠番が生じるということ。だけどそれがそんなに気に
するほどのことかなあ。


176:名無しさん@お腹いっぱい。
2001/04/14(土) 15:02 PpPxojBE
insert した直後なら、currval( 'sequence名') に入ってるよ。
select currval() するのもよし、直接使うのもよし。



177:名無しさん@お腹いっぱい。
2001/04/15(日) 14:43 ymJfG9Fc
>>176
NO!
同じスクリプト内であっても、別なプロセスがINSERTしてしまえば
CURRVALの内容は変わってしまう。初心者にありがちなミス。
正解は電動ナナシ氏指摘の通りOIDの取得。

178:名無しさん@お腹いっぱい。
2001/04/15(日) 15:02 /XgA0t4.
>>177
 ほんとかな。begin, end で囲っているのに?


179:176
2001/04/15(日) 18:06 QgXC.DBc
>>177
>CURRVALの内容は変わってしまう。初心者にありがちなミス。
 同じセッション内なのに、currval の値は変わるのですか?
last_value の値は保証されないようですけどね。どうか教えてください。

 なんせ、初心者 なもので。


180:名無しさん@お腹いっぱい。
2001/04/15(日) 23:12 .dQ4e2NQ
age

181:名無しさん@お腹いっぱい。
2001/04/16(月) 00:28 HgcNtlTE
> 同じセッション内なのに、currval の値は変わるのですか?
>last_value の値は保証されないようですけどね。どうか教えてください。
やってみりゃいいじゃん。

182:名無しさん@お腹いっぱい。
2001/04/16(月) 00:41 HgcNtlTE
PostgreSQL7.1リリース・・・まじかみたいね。
ファイル名がpostgresql-7.1.tar.gzになってる。

183:176
2001/04/16(月) 01:22 BsAjfbqo
>>181
 変わらないよ。要はそれを言いたい。


184:176
2001/04/16(月) 11:46 rXDXOhM2
177 さんの場合では、変わるようで、
わたしの実験ミスも考えられるし、想定外もあるし、
特定の環境というケースもあるので、変わるケースがあるなら
教えて欲しいのですよ。


185:名無しさん@お腹いっぱい。
2001/04/16(月) 14:47
>>184

話の流れと発言者が何人いるかよくわかりませんが、
>>178でいきなり
>ほんとかな。begin, end で囲っているのに?
という前提条件が登場します。
これが178氏と他の人の差じゃないかな?

>同じセッション内なのに、currval の値は変わるのですか?

という問いには、

* 同一トランザクション内であれば変わらない、が正解。
* begin, endでくくっていない1DML1トランザクションで、currval()を使うのは
誤り。他のプロセス(トランザクションで)値が変わっている可能性がある。

ということでよいでしょうか?>All

186:185
2001/04/16(月) 14:50
大間違い。

* begin, endでくくっていない1DML1トランザクションで、currval()を使うのは
誤り。他のプロセス(トランザクションで)値が変わっている可能性がある。

これは誤り。1DML1トランザクションでも、currval()は他のプロセス
(トランザクション)にかかわらず、普遍ですね。
セッション内で一貫性があるようです。

鬱氏。

187:名無しさん@お腹いっぱい。
2001/04/16(月) 17:04 rXDXOhM2
とどのつまり、今回の用途では、currval() は使ってもいいんでは


188:名無しさん@お腹いっぱい。
2001/04/16(月) 19:20 .KTK4KoY
というわけで、PostgreSQL7.1正式リリースage

# RDBMSについてしゃべる場所ってどこかないのかな?

189:名無しさん@お腹いっぱい。
2001/04/16(月) 21:24
まぁ、どうでもいいことなんだけど、MLで
「シーラカンス本」
「マンモス本」
を前提に語るのはやめて欲しいなー。
あ、俺は両方持ってるんだけど。
前者はバージョンが古いし、後者はちょっとアレだし・・・。
今一、人に薦めづらいんだよね、この本って。

190:名無しさん
2001/04/16(月) 23:32 XhwOU/N.
型でserialを宣言してるところに
insertで失敗してもカウントが1上がってしまうのですが
これはしょうがないことなのでしょうか?


191:名無しさん@お腹いっぱい。
2001/04/17(火) 00:07
sage

192:名無しさん@お腹いっぱい。
2001/04/17(火) 00:07 khLeTQ8c
MLはなんか変な奴多くない?
技術系ってそうなのかなぁ。妙に偉そうだったりするの

193:名無しさん@お腹いっぱい。
2001/04/17(火) 00:42
JavaHouseに比べればマシ。

194:名無しさん研究所
2001/04/17(火) 00:51
>>192
激しく同意。うかつに質問なんてできないっしょ。
だから意地になってマニュアル+マンモス本+過去ログで
自分で解決してる。恐ろしく効率悪いけど・・・

# 聞くは一時の恥、聞かぬは一生の恥 とも言いますが・・・

195:名無しさん@お腹いっぱい。
2001/04/17(火) 10:14
>>194
そう。ネット上じゃ逆だねぇ。。

196:名無しさん@お腹いっぱい。
2001/04/17(火) 12:33 O8m0NJyM
>>190
トランザクションを入れてみては・・

197:名無しさん@お腹いっぱい。
2001/04/17(火) 15:05 fcj0RQUQ
apache+PHP+postgreでシステム構築したいのですが、OSによる
環境の違いとかはあるのでしょうか?
あと、お勧めのOSは何ですか?

198:名無しさん@お腹いっぱい。
2001/04/17(火) 15:23
>>197
うーん、デフォルトの文字コードが違うとか、使えるシステムコールやライブラリ
のPHPのラッパ関数が違うとか、かな?

OSは、Linux系をお勧めします。

199:名無しさん@お腹いっぱい。
2001/04/18(水) 01:01 oVgMs8gw
>>190
>>196
トランザクションをアボートしても、serial型の場合、
インクリメントされちゃった値はもどんないよ~。
って、どっかのスレでも話題になってなかった?

200:153
01/04/21 16:07 2SRwUN3c
やっと皆様からご指摘いただきましたoid=$last_oidを条件に、
たった今insertで登録したデータをselectで引っ張り出すこと
が出来ました。
ありがとうございます。

201:名無しさん@お腹いっぱい。
01/04/21 19:35
えらい、時間がかかっとるやないか。

いや、ほのぼのとして、良いぞ。

202:153です
01/04/22 10:09 GJXSK57Q
>>201
実はスクリプト自体は皆さんのご指摘を元に作成出来ていたのですが、
ずっとエラーが出続けてました。
で、oid=$last_oidの部分が多分問題なのかと思って、ここを色々
いじくっていたんです。
解決出来たのは、もう一度スクリプトをじっくりと眺めていて、「"」
と「'」が2か所抜けておりました・・・

203:名無しさん@お腹いっぱい
01/05/05 16:54 ejxtLiFA
初歩的な質問ですいません。

PHPで外部からきたデータに大して、そのままSQL文をつくると、例えば、$a_post_datumが"これは'クォーテーション'です"みたいなので、

pg_exec($conn, "select col from a_table where col2 = '$a_post_datum'");

みたいにすると文字列展開で

"select col from a_table where col2 = 'これは'クォーテーション'です'"

みたいになって、SQL文が成立しなくなるんだけど、みなさん、こういうのにはどう対処しているんでしょうか?

204:名無しさん@お腹いっぱい。
01/05/05 17:35
' を \' に置換するだけ。

205:203
01/05/05 18:30 ejxtLiFA
>>204
%と_は?

206:名無しさん@お腹いっぱい。
01/05/05 20:35
前にエスケープ文字\ を入れろ。つか基本だべ?

207:203
01/05/06 16:11 kun4pZhs
'と%と_で全部?

208:名無しさん@お腹いっぱい。
01/05/06 18:36
>>207
シングルクォートのときはシングルクォートの前に入れるだけで良かったと思うけど。

209:名無しさん@お腹いっぱい。
01/05/07 20:18
7.1からvacuumいらなくなるって話聞いたことあったけれど、気のせい?
これさえいらなければなーとつくづく思うんだがね > PostgreSQL

210:名無しさん@お腹いっぱい。
01/05/07 20:56
>>209
残念ながら気のせいです。

211:名無しさん@お腹いっぱい。
01/05/08 18:58
PHPのPostgreSQLインターフェイスってUNIXソケットからローカルホストの
バックエンドに接続できないの?
pg_connectでエラーが出て、postmasterに-iをつけて起動しなおしたら
すんなり動くようになって、動くのはいいんだけれど、なんか気分悪い

親切な方教えてください

212:名無しさん@お腹いっぱい。
01/05/08 19:19 Nor6.bTw
UNIXドメインのソケット経由で接続できるはずです(やったことないけど)。
マニュアルの、「LIXPostgreSQL 関数」を参照。
pg_connect()の実引数が微妙に違うみたいです。

213:211
01/05/08 20:09
>>212
URLリンク(www.php.net)
の「表 1PostmasterとPHP」ってとこだね
ホスト名を明示しちゃうと、TCP/IP経由になっちゃうんだね
書いてあるとおりに書き換えたらUNIXソケットで接続してくれるようになったよ
どうもありがとう!

214:名無しさん@お腹いっぱい。
01/05/08 20:54
あ、章番号が変わってるんだ。ごめん。

そろそろ、自動でマニュアルをダウンロードしてmknmzかけるしくみを
作っとかんといかんな。

215:774
01/07/08 23:52 AeZs44/g
postgreSQL7.0を入れたのですが、psqlの中でヒストリ機能が使えません。
カーソルの上を押したら、前に打ったコマンドが出るようにしたいのですが、
どうしたら良いでしょうか。
ちなみに、通常のコマンドラインではカーソルの上を押せば
前のコマンドが出ます。

216:名無しさん@お腹いっぱい。
01/07/09 12:36
>>215

readline がないんじゃない?

217:名無しさん@お腹いっぱい。
01/07/09 13:21
>>216
おそらくはそれが原因だね。あるけど見つからないとか。

>>215
OS はなんだろう?FreeBSD ?
./configure --with-libraries=/usr/local/lib ....
とかで解決できないか?

218:774
01/07/09 23:37 KhxN5./k
早速のご回答ありがとうございます。
readlineは入っています。
OSはRedHat7.1です。
libへのパスを設定してもダメでした。

---------------------------
$ ls /usr/lib/lib{readline,history}*
/usr/lib/libhistory.a /usr/lib/libhistory.so.4.1 /usr/lib/libreadline.so.4
/usr/lib/libhistory.so /usr/lib/libreadline.a /usr/lib/libreadline.so.4.1
/usr/lib/libhistory.so.4 /usr/lib/libreadline.so

$ ls /usr/include/readline/*
/usr/include/readline/chardefs.h /usr/include/readline/readline.h /usr/include/readline/tilde.h
/usr/include/readline/history.h /usr/include/readline/rlconf.h
/usr/include/readline/keymaps.h /usr/include/readline/rlstdc.h

$ rpm -qa |grep readline
readline-devel-4.1-5
readline-4.1-5

219:名無しさん@お腹いっぱい。
01/07/10 02:12
>>218

libtermcap を入れてみよー

220:218
01/07/10 08:58
またまたご回答ありがとうございます。
libtermcapも入っておりました。
うーむ。

221:名無しさん@お腹いっぱい。
01/07/10 16:49
>>220

となると、 config.log を見て readline を見つけそこなっている
原因を探るだねぇ

222:名無しさん@お腹いっぱい。
01/07/14 11:38 ZarpnJWo
Warning: Unable to connect to PostgresSQL server: connectDBStart() -- connect() failed: Connection refused Is the postmaster running (with -i) at 'localhost' and accepting connections on TCP/IP port 5432? in

223:名無しさん@お腹いっぱい。
01/07/14 11:39 ZarpnJWo
↑原因はなんでしょうか。
フツーにselectで,tableの内容を表示しようとするとこうなる。
当方,管理者ではないので,設定イジくれません。

224:名無しさん@お腹いっぱい。
01/07/15 01:06 fduksvn.
pg_connect() でホスト名を空にしてないとか

225:初心者
01/07/23 06:07 xOk2bt2U
postgresのあるテーブルのdisplay_date列にdate型を格納してるんですが、
今日の日付と一致する行を表示するにはどうすればいいのでしょうか?

226:名無しさん@お腹いっぱい。
01/07/23 06:34 SYz87UN6
select * from "あるテーブル" where display_date = 'now'::date とか

227:225
01/07/24 02:01 goR17G.A
>>226さんありがおつございます。
で、cshで、.chsrcに「setenv TZ JST-9」としたものの、
psqlで、select 'now'::date;としても、7/24のはずが、
7/23(昨日の日付)が表示されてます。タイムゾーンが設定されていないようです。
postgresはunixとは別の独自のタイムゾーンを持つようだ、ということは、
マニュアルのdatetime-appendix.html
を見てなんとなくわかるのですが、しかしJSTに設定する方法が、これを見てもわかりません。
どうすればいいのでしょうか?

228:JAPU
01/07/24 04:11
set timezone to 'JST-9';
ついでにいうと、確認のためには select 'now'::datetime; が吉かもしれないにょ。

229:225=227
01/07/25 16:26 I8vfzaAc
>>228
すると、毎回set timezone to 'JST-9';の文章を実行しなければならないのですか_
あるいは、postgresの.chsrcみたいのがあればいいのですが・・・

230:名無しさん@お腹いっぱい。
01/07/25 17:23 bOBsSY92
postmaster を起こしたやつの timezone になるはず。

231:ナナシファン
01/07/25 19:13 xCgI2gSw
PHPでpg_pconnectを使ったときって、何かおかしくない?
ちゃんと動いているという事例を聞いたことがないんだけど、
期待通りに動いている人っている?

232:ほげ
01/07/25 21:06
>>231
期待どおりにって、SQL投げられるし別に普通だけど。

233:
01/10/11 22:30 tBxjcP4c


234:名無しさん@お腹いっぱい。
01/10/11 23:11
>ちゃんと動いているという事例を聞いたことがないんだけど、
狭い世界にお住まいなのですね。

235:Error401
01/10/18 17:24 fbcY2f30
今日の発見。

pg_pconnect()を使うとqueryが速くなる。何故だ・・・。

name diff total
Start -
Query 0.0416 0.0416
Fetch 0.0217 0.0633
Stop 0.0031 0.0664

name diff total
Start -
Query 0.0186 0.0186
Fetch 0.0217 0.0403
Stop 0.0031 0.0435

236:Error401
01/10/18 17:35 fbcY2f30
う、見づらいし、何が何だかわかんないね。
・Connectして
・Selectして
・ループで回ってFetchして
・表示する
プログラム。
Benchmark/Timer.php使用。

pg_connect()を使った場合
name    diff    total
Start     -
Connect   0.0185  0.0185
Query     0.0130  0.0315
Fetch Loop 0.0218  0.0533
Stop      0.0031  0.0564

pg_pconnect()を使った場合
name    diff    total
Start     -
Connect   0.0397  0.0397
Query     0.0438  0.0836
Fetch Loop 0.0217  0.1053
Stop      0.0031  0.1084

237:Error401
01/10/18 17:37
すまぬ、pg_connect()とpg_pconnect()の場合が逆だった。

238:名無しさん@お腹いっぱい。
01/11/05 22:38 I5P+61E/
age がてら。

PostgreSQL に限ったことではないのですが、
・電話番号
・郵便番号
どういう風にフィールド作ってます?

市外 CHAR(4),
局 CHAR(4),
番 CHAR(4)

前3 CHAR(3),
後4 CHAR(4)

みたいな感じ? それとも一つの TEXT/VARCHAR?
それぞれ長所短所あると思いますけど、
よろしかったらみなさまのご意見お聞かせください。

スレ違いならスマソ

239:名無しさん@お腹いっぱい。
01/11/06 15:52 aGDSTcYL
あれ?
電話番号の市外局番ってMax4桁になったの?

240:名無しさん@お腹いっぱい。
01/11/06 16:01
なったの?って昔からでんがな。

241:名無しさん@お腹いっぱい。
01/11/06 16:44
つか、5桁もある

242:名無しさん@お腹いっぱい。
01/11/06 18:24 y3LOZtVD
質問です。

PCを最近はじめ、今、PHP+PostgreSQLを勉強中の者です、
DBの、登録、削除、一覧表(毎10件)を、一つのスクリプトで実行したいのですが、一覧する際、最初の10件は、表示してくれるのですが、
11件目から~が、表示できないで困っております。
自分で考えて作ったのは、メインページからラジオボタンで選択し、
PHPスクリプトの中で、if(もしくはswicth)で、各実行をしてます。
一覧で、submitをクリックすると、11件目から表示させたいんですけど、
どうしてなのか、表示できません。

説明下手でわかりにくいかもしれませんが、誰か、イイアドバイス、お願いします。
ド素人なので、その辺も考慮して、お願いします。

243:名無しさん@お腹いっぱい。
01/11/06 18:34 OqD8s6xc
>>242
マンモス本読んだ?

244:>>243
01/11/07 10:11 ieoCTquz
マンモス本読んだけど、いまいちよくわかんないんです^^;

245:名無しさん@お腹いっぱい。
01/11/07 11:28 ieoCTquz
>>243
どの変(ページ数とか・・・)教えてくれると助かるんですが・・・。

246:名無しさん@お腹いっぱい。
01/11/07 12:02
>>245
漏れが持ってる PHP3 用のやつでよければ 81 ページからあたり。

247:245
01/11/07 12:43 ieoCTquz
>>>246
自分が持ってるのは、PHP4なので^^;

248:名無しさん@お腹いっぱい。
01/11/07 12:56 rEwaGgOJ
>>242
PHP4のやつはP144,145あたりを読めばいいかと。
でもPostgreSQLのselect文を理解してからのほうが
いいな。

249:242
01/11/07 14:14 ieoCTquz
もう少し、本読んで、勉強しなおします。
ご教授、ありがとうです。

250:その他
01/11/09 16:03 vDpRquZJ
PostgreSQLのインストール後
regression testを行ったのですが、全てが「failed」
になってしまいました。けれども、createdbもcreatetableも
insertもselectも問題無しに出来ます。でも、あとあと支障とか
あるのでしょうか?知っている方がいらしたら教えて下さい。

251:hen
02/02/07 13:36 Bho0YULV

item_id | item_name
1    | XX
2    | YY
というテーブルがあって
変数 $itemname = XX として

このときitem_id = "XX"のitem_idを取り出すにはどうすればいいのですか?

とりあえず
$sql = "select item.item_id from item
where item.item_name = $itemname"; //item_nameとコンボボックスのdataが一致する時のitem_id
$result = pg_Exec( $conn, $sql );
とやってみたけどPostgreSQL query failed: って帰ってきます・・

252:hen
02/02/07 13:42 Bho0YULV
$sql = "select item_id from item
where item_name = \"$itemname\"";

すんません
これに変えるとAttribute 'XX'not found

253:名無しさん@お腹いっぱい。
02/02/07 22:38 blA7jPNr
SQLで文字列は ' で囲む

254:  
02/02/07 23:32 z4yCqxdv
いつも、教わってばっかりだから、
たまにわ、教えてやるヨ
$sql = "select item_id from item where item_name = '$itemname'";
って書くんだよ。
''で、変数を囲むんだよ、
これ最強

255:
02/02/07 23:33 t9L0Eq4j
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50
スレリンク(ad板)l50

256:marois
02/02/10 22:51 MJ34x4JG
CGI版のPHP4をあるホスティングサービスで使っています。
pg_close($this->con);
のところで「pg_close -1」という値をクライアント(HTML上)
に返してきてしまうので困っています。
@を付けたり色々やってみたけど駄目。
同じスクリプトをPHP3で流すとOK。
ローカルのPHP4(Apache版)でもOK。
なにがいけないのでしょうか?
#このホスティングサービスPHPのサポートはしてくれないのです。

257:名無しさん@お腹いっぱい。
02/02/11 06:04 yEMLRxJJ
pg_fetch_object()でPGSQL_NUM(数値配列)引数を付けた場合,
次のような$rcプロパティでどのようにアクセスすればフィールドを
参照できるのでしょうか。

$this->rc[$i] = pg_fetch_object($result, $i, PGSQL_NUM);

258:  
02/02/11 18:01
>>256
pg_close($this->con); 自体を削除すればOK!
closeなんて、かかなくても、動く。

259:marois
02/02/11 20:58 PVwY953h
>closeなんて、かかなくても、動く。
動くとは思いますが、問題は出ないでしょうか?
一連のスクリプトで何度もOPENするのですが。
#セッションは1つなのでしょうか?
#疑ってすみません。

260:名無しさん@お腹いっぱい。
02/02/11 21:08
ついさっきOIDの表示の仕方忘れて大変だった、
select oid, * from table;
って書けばいいんだけどoid,とか記憶から消えてたね。
PostgreSQLの解説系のサイトどこに行ってもoid,の事には
あんまり触れてもないしgoogleでも引っかからないし・・・。

そういえばPostgreSQL関係で新しい本出てたね、あれなんだっけ?

261:  
02/02/12 00:06
>>259
書かなくても,問題でない。
どーせ、commitとか、してないんだろ。
そんな、PGだから、closeなんて、不要



262:marois
02/02/12 01:39 Ixi/JtIe
失礼な^^;
テーブルの更新にはトランザクションは使ってます。
一応複数SQL流すので保険として。

話はちょっとそれますが、サンプルプログラムでコネクションをグローバル
変数に保持して、それを最後まで使い続けるプログラムを見たことがありま
す。最後にユーザーがLogoutしてくれればpg_close出来ますが、いきなり
ブラウザをばっさり終了されてしまうと出来ないですよね。
コネクションにあんまり神経質になんなくても良いのですかね。

同時接続50-100ぐらいを想定しているもので...ちょっと心配なのでした。


263:名無しさん@お腹いっぱい。
02/02/12 21:51
>>260
公式本とかいうやつか?
postgresql.jpのだろ。

264:名無しさん@お腹いっぱい。
02/02/18 21:01
とりあえず、PEARのDBクラス使いませんか?>ALL

コネクション云々を考える負担が軽減されますよ。

265:名無しさん@お腹いっぱい。
02/02/18 23:58
>264
pearてわからんちん・・・( ´Д⊂ヽ ウエーン

266:(=゚ω゚)ノ ◆SI2r4V0c
02/02/19 10:36
日本語マヌアルあるよ。

267:(=゚ω゚)ノ ◆SI2r4V0c
02/02/19 10:38
URLリンク(pear.php.net)

268:名無しさん@お腹いっぱい。
02/02/19 10:44
>>262
URLリンク(www.php.net)
らしいです。

あんまり神経質にならなくてもいいみたいです。

269:名無しさん@お腹いっぱい。
02/02/19 16:40
Postgreからtimestamp型のフィールドを取り出すとき、
日付の末尾に+9という値(GMT?)が付くんですが、これを取り外すには
どのようにすればいいんでしょうか。

270:名無しさん@お腹いっぱい。
02/02/19 16:59
>266
マヌエルて助っ人野球選手がいたよね昔。
(◕ฺ∀◕ฺ)

271:marois
02/02/19 23:38 SCYCQAYn
>>268
情報ありがとうございます。
大変参考になりました。

話が変わるのですが、皆さんは文字コードに何をつかっておられますか?
結構文字化けに悩まされています。(PHP3i18でも)
私の場合、EUCでソースを書いて、EUCでDBに格納しているのですが、ブラウザが
Shift-JISと間違って判断してしまう場合があるようです。
<meta .htaccess と色々試してみたけど、駄目なときがある。
Shift-JISでソース、Shift-JISでDB格納していらっしゃる方はいらっしゃいま
すか? どんな組み合わせが文字化けしにくいんでしょうか?


272:名無しさん@お腹いっぱい。
02/02/20 00:07
>270
情報ありがとうございます。
大変参考になりました。

273:名無しさん@お腹いっぱい。
02/02/20 11:00
>>271
理屈上は、EUC-JPオンリーな運用をすれば化けないはず。

でもそれは現実的な話では無いからなぁ…

274:名無しさん@お腹いっぱい。
02/02/24 05:50 IIwngioo
php+postgreでwebアプリ構築してるんですが、
ログイン画面でユーザが入力したID、パスワードを照会するとき、
IDでSELECT ID, PASSWD ... みたいに引っ張ってきて、
そのPASSWDとPOSTに入ったパスワードをmd5で照会する、
この方法って無意味ですか?(セキュリティ上の観点で)


275:274
02/02/24 05:52
>>274
事故レス。情報不足してました。
DBには裸の状態でパスが入ってます。


276:名無しさん@お腹いっぱい。
02/02/24 06:50 gC0AF2pI
>>274
 無意味。

 DB内のパスワード見られたらクラックされる為。
 ハッシュ化(MD5、DES)したパスワードを格納する。

 質問の内容からして効率悪そうな開発をしているっぽいので、
crypt関数と、mod_auth_pgsql について調べることをおすすめ
する。

277:274
02/02/24 13:30 IIwngioo
>>276
早速調べて入れてみました。
で、今さらなんですが、パスワードはphp以外の箇所(言語)でも使うため
仕様変更が難しいようです。
まあごく限られたネットワーク内での使用を考えてるので(外には出さない)、
それほどセキュアなシステムで無くても良いんですが、DBを暗号化せず
セキュリティを高める方法ってないでしょうか(SSL以外)。

278:名無しさん@お腹いっぱい。
02/02/24 18:08 L35l4mFf
>>277

 DBを暗号化というか、DB格納パスワードをハッシュ化。

> セキュリティを高める方法ってないでしょうか(SSL以外)。

 無い。

279:名無しさん@お腹いっぱい。
02/02/24 19:44 1vBdeyQk
でも crypt かけちゃったら、ユーザーがパスワード忘れた
ときとか、どうやって元のパスワードを教えて上げるの?

パスワード設定し直すっていう方法が現実的かも知れないけど。

280:名無しさん@お腹いっぱい。
02/02/24 20:43 L35l4mFf
> どうやって元のパスワードを教えて上げるの?

 当然、教えてあげない。

> パスワード設定し直すっていう方法が現実的かも知れないけど。

 そうする。基本だよね?

281:名無しさん@お腹いっぱい。
02/02/26 00:31 EFcQI2qb
>>273
PHP3-i18nでもPHP4.0.6以降でも、出力だけSJISってのができるから、それが一番
問題起きないんじゃない? 出力がEUC-JPだと文字化けするブラウザは結構あるし。
PHP,DB内部はEUC-JPで、HTTP入出力はSJISでずっとやってますが、大きな問題は
おきてないな。


282:名無しさん@お腹いっぱい。
02/02/26 01:58 myAGwwd4
しつもーーん
URLリンク(www.jlb.dyn.to)
こんな感じで、みんなも、定期的に、バキュームしてる?
自分は、したことないぞーばきゅーむなんて。

283:名無しさん@お腹いっぱい。
02/02/26 02:19 R0qwrTOR
野球ヲタワラタ

URLリンク(ime.nu)

284:名無しさん@お腹いっぱい。
02/02/26 02:24 c48zylad
質問です。
interval型を使って年-日-時でデータを管理しているのですが、
365日で1年への繰り上がりを期待したら、
どうやら360日で繰り上がってます。

繰り上がり日数の指定ってできないのでしょうか?

285:名無しさん@お腹いっぱい。
02/02/26 15:19 ws1pgQhy
>>281

 MIMEヘッダーに文字コードをつければ化けない。
 HTMLファイルにも、httpd.conf や .htaccess に AddType を
加える事で可能。

286:  
02/03/24 17:12 S817rdf9
現在、PHP+PostgreSQLで小規模なDBシステムを開発していますが、
教えていただきたいことがあります。

それは、このシステムで出力されるデータをPDFファイルにしたいのですが、
これを実現するためには、PHPをインストールする際にpdflibを使用する旨の
オプションを指定する必要があることは知っています。

ただ、現在はインストールした後ですので、後でpdflibを追加することは
可能ですか?厨房なので、詳しい方法を教えてくれませんか?よろしくお願いします。


287:nobodyさん
02/03/25 01:50 hKhhq3k3
>>286
 コンパイル時に組み込むものだから、後からは無理だと思われ。
 リコンパイルする手間はそんなに無いと思うので、やり直しをおすすめ。

> 厨房なので

 DBシステム開発自体を辞めておけ。

288:nobodyさん
02/07/31 14:56
PHP4.2.2セキュリティー対応上げ

皆さん入れ替えましたか?

289:nobodyさん
02/07/31 16:33
( ´,_ゝ`)プッ
URLリンク(freehome.kakiko.com)

290:nobodyさん
02/09/01 20:10 h2ERcGeK
何でこのスレッド書き込みが無いの?
とりあえずあげ。

291:b
02/09/01 20:21 hC+cV5mq
URLリンク(www.jsweb.sexheroes.com)

292:お役立ちサイトです。
02/09/01 23:25 eeJda9o6
究極の総合リンク集

URLリンク(home9.highway.ne.jp)


293:ノンノン
02/09/28 21:30 Mv9w8xYv
TIMESTAMP型の日時をPHPで表示する方法が良く分かりましぇんです。

$sql = "select to_char(nichiji, 'YYYY/MM/DD') from テーブル名";
$result = pg_exec($sql);

で、良いと思うのですが、

Warning: PostgreSQL query failed: ERROR: No such function
'to_char' with the specified attributes

っていうエラーが出ます。
これって、to_charが使えないってことですか?
仮に to_char が使えない場合、どうやればいいのでしょうか?
どなたかご教授願います。

294:nobodyさん
02/09/28 21:38 B9guHGNW
整形してから引っぱり出すんじゃなくて
引っぱり出してから整形してください

295:hmk
02/09/28 21:39
よーわからんが、nichijiは本当にtimestamp型になっているのかぇ?

296:ノンノン
02/09/28 21:59 Mv9w8xYv
> よーわからんが、nichijiは本当にtimestamp型になっているのかぇ?

それは間違いないです。ハイ。

> 整形してから引っぱり出すんじゃなくて
> 引っぱり出してから整形してください

あいたたぁ。そういうやり方がありましたね。(なんて私は頭がカタイのか)
とすると、取り出したものが $nichiji に入ってるとすると

local($nichiji);

なんてものを使えば良いのでしょうか?


297:294 じゃないよ
02/09/28 22:17
「引っぱり出してから整形して」というのはたとえば、
EXTRACT(YEAR FROM nichiji) AS nchj_y,
...
みたいに SQL を書くという意味ではないかな。ちょっ
と手間は増えるけど、漏れはいつもこうしてる。

298:ノンノン
02/09/29 13:23 lz5l3CdA
なるほど、YEAR,MONTH,DAY というように取り出したいデータごとに
実行するということですね。
で、試してみました。
・・・結果はだめでした。
なので、簡単に

 select extract(YEAR from TIMESTAMP '2002-09-29')

としてやってみました。
・・・、これもダメでした。PHP を使ってもコマンドラインからも
結果は同じです。どちらも、こういうエラーが出ます。

ERROR: Function 'date_part(text, timestamp)' does not exist
Unable to identify a function which satisfies the given argument
types You will have to retype your query using explicit typecasts

何が原因なんでしょうか? PostgreSQLのバージョン?
ちなみにそのバージョンは、6.5.3 です。

299:297
02/09/29 13:49
>>298
7.0.2 なら select extract(YEAR from TIMESTAMP '2002-09-29')
は OK だね。6.5.3 だとダメ。

6.5.3 なら、
select extract(YEAR from DATETIME '2002-09-29')
で OK だけど、DATETIME は標準じゃないし、最近は
Postgres でも推奨されていないと思う。

300:ノンノン
02/09/29 14:05 lz5l3CdA
やっぱりそうですか。
ということは、to_char でエラーが出るのもパージョンのせいですね。
レンタルサーバなのでどうにもできません。
フィールドのタイプを変えるしかないないですね。
原因が分かっただけでも良かったです。

みなさん、ありがとうございました。
また、何かあれば願いしますね。


301:297
02/09/29 14:17
>>300
date_part 関数使えば、フィールドの型は変えなくて済むと
思われ。でも標準(略

302:やりたいのに
02/10/02 19:31
思い立ってから既に一週間。
PHP+PostgreSQLの勉強をしようと頑張ってますが入り口にすら立てません・・・。
とりあえず簡単なWebアプリケーションを作成しようとしてます。
<Webサーバ環境>
Win2KServer + PHP4.2.3 + Cygwin + PostgreSQL7.2.2(Cygwinと共にインストール)

pg_connect() を使うと

Warning: pg_connect() unable to connect to PostgreSQL server: could not create socket:
要求したプロトコルと互換性がないアドレスを使用しました。 (0x0000273F)

が発生して接続ができません。

使い方はどこにでもサンプルで書いてあるような
$con = pg_connect("dbname=testdb");
という形なんですが・・・これは PHP の設定なのか PostgreSQL の設定なのか
はたまた Cygwin の設定なのか Windows の設定なのか
検討がつきません。

3日悩んだあげく、ODBC経由ならどうよ?と試したらあっさり成功。
# pg_databaseからテーブル一覧取得表示

pg_ほにゃほにゃ系の関数を使う為には何をどう設定すればいいのかひたすら調査中です。
どなたか「おい、ここチェックしたのか」とか思い当たる事項があれば
突っ込んで下さると非常に喜びます(涙)


303:nobodyさん
02/10/03 06:22
Apache,PHP4,PostgreSQL7でWEB鯖構築するやり方載ってる本あったからそれでも見れば。onLinuxだったけど。

304:nobodyさん
02/10/03 06:33
Windows上でやったことないのでアレだけど、
WindowsってUNIXドメインソケット使えないよね?

としたら、PHP<->PostgreSQLの接続はTCP/IP使わなきゃいけないはずなので、

pg_connect("host=localhost dbname=testdb");

みたいにして、あとは PostgreSQL の pg_hba.conf で
localhost からの接続の認証してやればいけそうな気がするが。


305:nobodyさん
02/10/03 06:34
つーか、エラーメッセージ見れ。
pg_connect()したときにエラーメッセージ出るだろ。


306:nobodyさん
02/10/03 06:38
スマソ。俺がカキコ見てなかった…。欝だ氏のう…。

307:やりたいのに
02/10/03 11:24
お返事多謝です。非常に喜んでます♪

>>303
 その環境で構築する本は一応見てみましたが、どーも・・・。
 Cygwin上に更にApache入れる?それともWin用のApache入れるのかなぁとか
 昨日ふと思ったりしましたが・・・IISでPHPもPostgreSQLも両方動くのに
 意味なさ過ぎだなぁ・・・とか(苦笑)

>>304
> としたら、PHP<->PostgreSQLの接続はTCP/IP使わなきゃいけないはずなので、
 ですよね。
 これに関してですが、わからないなりに調べた結果、以下の点は留意しました。
 ・Postmaster起動時に-iオプションを付ける。ポートも指定してみる。
  => pg_ctl -w -o "-i -D /usr/share/postgresql/data -p 5432" start
 ・pg_hba.confの設定をチェック
  =>以下の設定になっていた。これで問題なし??
   local all trust
    host all 127.0.0.1 255.255.255.255 trust
 ・postgreSQL側でも接続を有効にしてみる。
  =>postgresql.confで以下のように設定
  tcpic socket = true
  port = 5432

> pg_connect("host=localhost dbname=testdb");
 なるほど、ローカルホストだぜ!って明示的に指定するわけですね。

早速やってみます!ありがとうございました。


308:nobodyさん
02/10/03 19:35
大助かりage

309:nobodyさん
02/10/03 22:37 yBxgrv2T
>>282
バキュームしれ。
7.2.1使って12万レコード/日くらいのトランザクションがあるけど、
結構ディスク占有率がふくれる(溜めるだけではないため)。
数万レコードでも更新が多いならお薦めだ > 使っているdata/base
#ちなみに vacuum full 実行10分ちょい > 漏れの仕事環境

vacuume or vacuume full は頼りになるぞ。



そんな漏れん家のサーバは1回/半年で十分だ。数秒で終わる(w

310:307
02/10/04 14:40 qOvfKv6+
結果報告~。
つながりました!Apacheは入れなくてもよかったです。
これまでCygwinを手動で起動して、その上でipc-daemonをサービス起動して
次にpg_ctlでPostmasterを起動して・・・とやってたんですが
cygrunsrvというコマンドでPostmasterもサービス登録する手順をみつけ
やってみたところ、突然つながりました!
接続は以下のように行いました。ユーザも何もかも指定しました(笑)
$con = pg_connect("dbname=testdb host=localhost user=test_user password=test_user");

Postmasterの登録に使用したコマンドは以下のものです(本当は1行です)

$ cygrunsrv --install PostgreSQL
--path /usr/bin/postmaster
--args "-D /usr/share/postgresql/data -i"
--dep ipc-daemon
--termsig INT
--user postgres
--shutdown

これで、試験サーバを起動してから一々ipc-daemon+Postmasterを手動で
起動する手間もかかりませんし、いい感じです。
ただ・・・Postmasterのみ再起動する方法がわからないんですよね。
pg_hba.confとかその辺を更新した後、サーバごと再起動しないと駄目という
実に非現実的な環境になってしまいました(爆)

でもまぁ、大きく一歩前進です。多分何か方法があるんでしょうし
設定とかあるのかもしれません。調べていくことにします。

多謝多謝、多謝です~!

311:nobodyさん
02/10/06 21:27 Y+aKD2A2
すっごい初歩的な質問ぽいですが…かきこします。
xreaでPostgreSQLつかってるんですが

$hst = "localhost";
$db = "ユーザID";
$us = "ユーザID";
$pass = "パスワード";

$conn = pg_connect("host=$hst dbname=$db user=$us password=$pass") or die("接続エラー");

ってやると
Warning: pg_connect() unable to connect to PostgreSQL server: PQconnectPoll() -- connect() failed:
Connection refused Is the postmaster running (with -i) at 'localhost' and accepting connections on TCP/IP port 5432?
っていわれちゃうんだけど、解決方法わからないですか?

自分のパソコン上でやるとできるのですががが。

312:nobodyさん
02/10/07 01:33 hvZZAVT1
>311
まんまやん!
-i と一緒に走らせろよ。

pg_ctl stop
pg_ctl start -o "-i"

だな

313:312
02/10/07 01:37 hvZZAVT1
追加
DBが別サーバなら pg_hba.conf の一番下辺りの trust あたりを見る。
んで、適時追加する(アクセスするサーバへの許可)。
↑の起動オプションの追加やconfの変更が出来ないんならわからん!

314:nobodyさん
02/10/07 08:25 tYSAfVj4
つーか、ApacheとPostgreSQLが同じマシンで走ってるなら、
ふつーはUNIXドメインソケットで接続するんちゃうやろか。
-i オプションつけずに動かして。

なので、「host=$hst」つーのはいらないのでは?


315:312
02/10/08 00:18 OGtZEEu6
>>314
つ~か、「自分のパソコン上でやるとできるのですががが。」だそ?
隣のパソコンにつなごうとしてうまくいかないのでは? と思うぞ...ふつ~は。

っで、隣のパソコンから己(311)のIPがipfwとかipchainsとかから
deny|dropされていない事は確かだろうな?(w IPだけじゃなくportも...

そんなんされてたら、どうにもできんが(www

316:312
02/10/08 00:19 OGtZEEu6
をぉ!
隣のパソコン≠localhost ぢゃないか!!(w

逝ってくる...

317:nobodyさん
02/10/09 01:18 LBei1JgW
質問です。
PHPから、postgresへデータを書き込む時は、どうしたらよいのでしょうか?
今、POSTされたデータを使って、
こんな感じの関数を使って、文字をEUCにして、DBに入れてます
でも、うまくいかないんです......動くんだけど
特定の文字の時、
ここから-----------------
――――――――――――――――0-5/10―
★GAME
-------------ここまで
を入れると、0移行がきれてしまって、DBに入るんです...
0移行もいれたい!でも、うまくいかない...
なぜ?

Function beauty($sSQL)
{
//文字をEUCにして綺麗にして
$sSQL=trim(mb_convert_encoding($sSQL,"EUC","SJIS"));
$sSQL=mb_convert_kana($sSQL);
//改行キーを綺麗にして
$sSQL=str_replace("\r\n", "\n",$sSQL);
$sSQL=str_replace("\r", "\n",$sSQL);
$sSQL=ereg_replace("^(\n)+|(\n)+$","",$sSQL);
//スラッシュを綺麗にして
$sSQL=addslashes(stripslashes(stripslashes($sSQL)));
//実行
return $sSQL;
}

318:nobodyさん
02/10/09 02:48 uMeBQ3Ig
カラムの型なんでしょう?

319:nobodyさん
02/10/09 07:54
つーか、なぜ $sSQL を加工する度に echo して調べないのかと小一時間(略

320:nobodyさん
02/10/16 17:38
Apache 1.3.22 + PHP 4.2.3 + PostgreSQL 7.2.1 で、
phpPgAdmin 2.4.2 を動かそうとしたんですが、フォーム入力で
なぜか先頭の4文字分が消えてしまってSQLクエリが組み立てられず
エラーになってしまいます。

PHPは --enable-mbstring --enable-mbstr-enc-trans
--enable-mbregex で configure してあり、通常のPHPでのフォーム入力
受け渡しでは問題ないのですが、phpPgAdminのPHPスクリプトが
何か特殊なことをしているのでしょうか?


321:質問ageです
02/10/22 10:45 38ZRylkG
WEB データベースでは 1ページ毎に

 $db = DB::connect();
 $res = $db->query();
 $db->disconnect();

とするのが普通なのでしょうか?
DB オブジェクト $db をグローバル変数として
他のページでアクセスする方法はあるのでしょうか。


322:nobodyさん
02/10/22 10:47
> とするのが普通なのでしょうか?
普通。けど、ココはPHPのスレ。

323:nobodyさん
02/10/22 11:08
>>322
ええ。PHPスレと知ってて質問しています。
PHP-4.2.2 を使用してます。
PHPでグローバル変数は扱えるのかな? と思って質問しました。

現在、最初に postgres の user、password を入力させて
それを各ページに POST して使い回して connect しているんですが
みなさん、このようにして使っているのでしょうか。


324:nobodyさん
02/10/22 12:38 4eylDja6
>>323
session利用して保持すれば?

325:nobodyさん
02/10/22 15:18
pgpconnect?

326:321
02/10/22 16:15
>>324
そうですね。
各ページで connect を行う場合はそうします。

ただ、DBオブジェクト(今回は Class のオブジェクト)を
グローバル化出来れば便利(早い) だと感じたのですが、
皆さんそのようには作られてないようで...
何か、問題あるのかな?
もうちょっと、色々勉強してみます。


327:nobodyさん
02/10/22 16:43
>>321
>>325が自信なさげにつぶやいてるけど
URLリンク(www.php.net)
じゃ駄目なのかと?

328:321
02/10/22 17:21
>>327
ごめんです。
別に無視していた訳ではないです。>>325 さん。

今 Class と PEAR を使って色々勉強中でして、
「こんな風に出来ないものか?」と試行錯誤してます。
pg_pconnect は DB::connect( $dsn, TRUE ) で実現
出来るようです。
色々試してみたいと思います。


329:nobodyさん
02/10/22 20:50 bCdHvFBv
>>326
DBへの接続で、パーシステントな香具師が居たかと...
「永続的接続」だっけか?

ただし、トランザクションエラーでcommitもrollbackもやってなくて
ロック状態に陥る罠。

つ~か、↑は、デバッグ時にはまった場合の話ね。
きれいになったコードでは問題ないはずだよ。

330:教えて君
02/10/30 20:04
上の永続的とかは関係なくて、
最初にconnectしてから
"begin"を宣言しておいた後、
放置してPHP終了した場合って、
"commit"しなかったんだから"rollback"しなくても良いんですよね?
pg_closeは省略できるらしいし。
どうなの?

331:330
02/10/30 20:05
要するに"rollback"も省略できるかってことです。

332:nobodyさん
02/10/30 20:11 CX80yU9D
どこが2重カキコなんじゃボケェ!
2重カキコじゃないってば!!>ERRORさん

rollbackは今までの作業を捨ててその後で新しく作業するのに使うんですよね?
取消で終了するなら言わなくてもいいっすよね?

333:330
02/10/30 20:12 CX80yU9D
>>332
俺です(鬱)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch