5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

PHP + PostgreSQL

1 :りさあ : 2001/02/26(月) 04:20 ID:7I8PBOt.
語りません?

2 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 04:24 ID:5V63qlVI
語ることがない。
石井君のページにでも行ってくれ。

3 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 06:22 ID:cVbm4GZ6
フリーの割りに高性能。<pgsql
7.1からOUTER JOINもサポートされるし。
初心者、金は無いがスキルを磨きたい物にはうってつけだ。

4 :いしい : 2001/02/26(月) 13:56 ID:RMNXlTC.
Apache+PHP+PostgreSQLは最強の解といえるでしょう。

5 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 18:32 ID:???
ひょっとして、結論が出てしまったのでしょうか?

6 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 19:40 ID:BFnPDmqY
ポストグレは遅いよ。ていうか海外ではぜんぜん人気ないし。
やっぱマイでしょ、マイ。


7 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 19:45 ID:???
>>4
>Apache+PHP+PostgreSQLは最強の解といえるでしょう。

最強ダッテ...
あイタタタタタタ。。。。


8 :いC : 2001/02/26(月) 21:03 ID:5kKWhb92
君たち、僕の著書をよんでないようだね(藁

9 :名無しさん@お腹いっぱい。 : 2001/02/26(月) 22:42 ID:8JeIWn.k
痛ずぎ....

10 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 01:27 ID:???
8K制限なくなった…

11 :いC : 2001/02/27(火) 02:04 ID:WUS/EdTg
みなさん、こんなとこで勉強しないで、僕がコンサルしてあげるよ。タダとは言わないからさ。

12 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 10:19 ID:???
4=馬鹿

13 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 10:32 ID:eWEYPVng
>>11
oracleと同等の性能出せるんなら考えてもいいよ。


14 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 10:40 ID:???
OracleだろーがPostgreSQLだろーがMySQLだろーがはたまたInterBaseだろーが
要は適材適所。

別にPostgeSQLがOracleと同等の性能を出す必要は無し。

コンサル受ける必要は全く無いが(w


15 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 10:42 ID:gsZQ9EIM
vacuum が無くなればそれなりなんだけどな。>pgSQL
けどモノは使いようでメンテ必須という名目で保守契約結ぶとか
バックアップきっちり取れるとか悪いことばかりじゃないし。

取りあえずdbに金出さない貧乏クライアントは逝ってよし。

16 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 11:19 ID:qXnfIXtc
遊ぶだけなのに何百万も払いたくない>Oracle

17 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 14:07 ID:???
ほかの板だと、Oracle劇遅っつーのが、一般的見解なんだが、
ここは、Oracle最高っつー奴らばかりなのか?

18 :1 : 2001/02/27(火) 14:48 ID:WGk.NFnY
ORACLE最高とかPostgres最強とかそんなことどーでもいいんだけどさ・・
やっぱ低レベルだわここの人達。。。

19 :anonymous : 2001/02/27(火) 15:20 ID:???
>>18
「語れ」しかいえないお前が一番低レベル。
「語れ」だけで高レベルな情報を得ようというのは虫が良すぎ。


20 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 15:48 ID:???
まぁ、ここの人たちってさ、>>7みたいに、理由もなく何かを貶めて、
自己のアイデンティティーを確立しようとするような奴らが多いからさ、
そのへん割り引いてくれよ。

21 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 16:57 ID:???
>>20
7もだが4も理由無しだな。どっちもどっち。

22 :電動ナナシ : 2001/02/27(火) 17:30 ID:uQsfjr.Q
でもさー、何でデータベースの話になるとすぐ
Oracle vs PostgreSQL
PostgreSQL vs MySQL
みたいに実装系の比較の話になっちゃうの?
ほかに話すこといろいろありそうじゃん。

データベース板とか作ってもらったら?
隔離板になっちゃうかもしれないけどね。


23 :電動ナナシ : 2001/02/27(火) 17:38 ID:uQsfjr.Q
でさー、こういう実装系の話をするときって、
・ある実装系が向いている仕様にはどんなものがあるか?
・ある実装系が向いていない仕様にはどんなものがあるか?
って観点で話さないと全然意味ないと思うよ。どんな実装系にだって設計思想があって、
それによって得意・不得意が出てくるんだから。

例えばデータサイズで言えば、
・単一ファイルシステムのサイズの限界があるか?
 yes: PostgreSQL, MySQL
 no: Oracle
となる以上、ファイルシステムの上限 (例えば 4GB) を超えるデータを MySQL 等で
扱うのはおかしいって話だよね。

逆に、オブジェクト指向言語実装系において、あるオブジェクトを永続化させるのに
便利なデータベースは?って問題なら
Yes!!: PostgreSQL (テーブル定義に継承が利用できるので、クラス定義と同じ構成の
    テーブルを作成できる)
Yes: Enterprise Edition なら、オブジェクト型 (View) の定義ができる
No: その他(自分でインピーダンス不整合を解消する必要がある)
という風になるでしょ?だからこういった言語処理系を前提にしたならば、PostgreSQL か
Oracle かって話しになることが多いだろうね。

こういう前提条件無視してまともな議論になるはずがないんだと思うけど?


24 :電動ナナシ : 2001/02/27(火) 17:49 ID:uQsfjr.Q
あとさー、最近のトレンドは「データベース抽象化」でしょ?
つまり、どのデータベースの実装系かってことを意識しないですむようにコーディング
するのが普通になってきているわけだよね。

何でこんなことをするかって言うと、
・開発時のデータベースと運用時のデータベースが違う(高くて買えない場合等)
・データベースに求められる仕様が変更される(例えば性能から安定性へ変わった場合)
という場合がありうるので、移植の手間を省くためにそういうことをするわけだ。さらに
抽象化は、そのためのクラスを通じて行うけど、これを大勢が何度も使うことによって
クラスの品質と使い勝手が向上して、より再利用しやすくなるって副作用もあるよね。

そうだとすると、そんな PostgreSQL はどうよ?とか MySQL はどうよ?的な質問は
意義を失ってくると思うんだが、どうよ?
# だいたい大半の人間は標準 SQL の範囲内でしか SQL 使ってないでしょ?関数とかは
 実装依存になるけど、じゃあ CASE とか /*++ とか使ってる人ってどのくらい
 いるんだろ?

まあそのうちゆり戻しがくるだろうけどさ、それは性能が最優先課題になる場合くらいしか
出てこないだろうね。


25 :電動ナナシ : 2001/02/27(火) 18:15 ID:???
あーうー、いかん。case も標準 SQL だ。
例をあげるなら型キャストとかだったな・・。
鬱出し脳。


26 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 18:23 ID:???
>Oracle vs PostgreSQL
>PostgreSQL vs MySQL
頭の中のこんな図式持ってる奴はマカー死ねとかFreeBSD氏ねとか言ってる
のと同次元だ。

27 :1 : 2001/02/27(火) 18:46 ID:WGk.NFnY
データベース版依頼だそうかな?
なんか人来なそうだな(わ

やっぱりORACLEはpostgresよりはえーぜ!
とか
Myが最高!!
とかここみたく言う人ばかりだろうね



28 :名無しさん@どっと混む : 2001/02/27(火) 22:28 ID:???
お前も人のこと言えんのかこのポストグレス厨房


29 :名無しさん@お腹いっぱい。 : 2001/02/27(火) 23:57 ID:???
これ以上荒らすな、バカヤロ。
厨房はお前だ。


30 :名無し : 2001/02/28(水) 00:27 ID:???
PostgreSQL だ MySQL だ Oracle だ とかって、そこまで熱くなれる人たちって、ある意味羨ましいです。
どうしたら、そこまでのめり込めるのでしょうか。
冒頭で書いたようなバカっぽいことでウダウダ言ってる割に、技術的には素人から見て凄そうなので
前から不思議に思ってました。UNIX板のスレなど。
煽りじゃないです。



31 :電動ナナシ : 2001/02/28(水) 00:44 ID:???
宗教だねえ、ここまでくると。
作っている人間が熱くなるならわかるけど、作っている本人よりも取り巻きの方が
熱かったりするからねえ。

確かにそこまでのめりこんで見えるものがあるのも事実だと思うけど・・。
# でも最近のメーリングリストの内容の水準の低下を見るとそうでもないか?
 どこでもインストールネタばっかりだし。


32 :1 : 2001/02/28(水) 01:32 ID:tdTwkxks
ども厨房26歳の1です。

一応Oracle、SQLSerer、My、Postgersとこの4つで開発やってるんですが、
まだドキュメントとかPostgresは少ないからチューニングの仕方がわからないんですよね。
SQLの書き方によるパフォーマンスっていろいろ試してわかってきたんですけど。
Oracleほどインデックスの効果がでないとか。。
サーバ側でいろいろチューニング試した方とかいらっしゃいますかね??
Oracleゴールドなんか持ってっても全然意味ないな。。。。
これじゃ

33 :1 : 2001/02/28(水) 01:38 ID:tdTwkxks

私の作ってるサイト(携帯コンテンツ)はかなりのアクセスがあるんで
トランザクションの数が尋常じゃないもんで
それに耐えうるような方法とかご存知でしたら知りたい・・

34 :いC : 2001/02/28(水) 02:36 ID:7JL8XSEA
知ってるけど教えてあげない。コンサルする?

35 :名無しさん@お腹いっぱい。 : 2001/02/28(水) 05:22 ID:Cj1/dvFk
SQL Serverはどうよ
http://www.microsoft.com/Japan/SQL/

36 :>35 : 2001/02/28(水) 05:42 ID:gshebUns
なんでPHP版に?
バカチョンって感じかな。。
メンテとかはしやすい

チューニングは意味ない

37 :電動ナナシ : 2001/02/28(水) 06:18 ID:???
PostgreSQL って Oracle ほどシステム統計取れない(というか全然取れない)
からチューニングは一苦労だよね。
http://www.linux.or.jp/JF/JFdocs/PostgreSQL-FAQ.html
3.7, 4.9, 4.10, 4.23 あたりは読んだ?
あとはこの辺かな。
http://www.itboost.co.jp/postgresql/pgsql_tips.php3
あと Vacuum かけないと Index は効果半減。Vacuum と Index の関係については
以下が参考になるかも?
http://www.geocrawler.com/archives/3/6/2000/3/50/3402101/

以上に書いてない事柄で、自分が知っているのはこれくらい。
1 もこれくらいは知っているだろうけど。

・PostgreSQL は遺伝的アルゴリズムを用いてアクセスパスを決定しているが、
 非常に複雑なクエリーの場合、計算量が増えすぎてしまって、そこで余計な
 時間をつぶすことがある。
 $PGDATA/pg_geqo (pg_geqo.sample をコピー) の Generations をぐっと
 減らすと、効率は悪くなるが計算時間も減るので、割と単純なクエリーの
 場合には効果が大きい。

・Join することがないテーブル群がある場合、別々のデータベースに格納し、
 かつそれぞれのデータベースを別のディスク I/O に置く。詳細は Admin Guide の
 Chapter 10 "Disk Management" を参照。
 先のリンクにあるようにテーブルを作って別のディスク上に移動し ln -s
 するのでもよし。

・PostgreSQL のセッションコンテキストの変数を操作することで、アクセス
 パスを手動で最適化することができる(これは今回はじめて知った・・)。
 詳細は Users Guide の 17. Understanding Performace と 19. の sql-set を
 参照。

# 探せば結構出てくるじゃん。


38 :電動ナナシ : 2001/02/28(水) 06:24 ID:???
>>37
> 割と単純なクエリーの 場合には効果が大きい
割と複雑な・・・の間違い。

あと、テーブル構成とかはきちんと設計できてるんだよね?

join 操作はコストが大きいから、むやみやたらにテーブルを分けるのはまずい、
場合によっては非正規化も検討するとよいってよく言われる。ただしデータの
整合性を維持するのに Trigger 使うくらいなら join した方が 100 倍いい。

あと index は本当に効果的な場合(つまり WHERE で条件として指定される場合)に
限定して使わないと、レコードを変更・追加するときのコストが大きくなる。

さらにファイル断片化とか起きないように、非常に大きなテーブルは専用の区画を
用意するとか、ときどき export & drop table & import してクリーニング
するとか・・・。

# まあこの辺は PostgreSQL に限らず、常識的な内容ばかりで・・。


39 :電動ナナシ : 2001/02/28(水) 06:40 ID:???
つか、何が悲しくて PHP 板に PostgreSQL の話を書かないといけないんだ!?

ということで話題を変更。

PHP スクリプトのデータベースアクセスにも改善の余地はないの?
細かくアクセスするよりまとめてレコード取得したほうが速いってのは
いいだろうけど、コネクションを永続化するとか、日付計算ごときでデータベースを
呼ばないとかはしているよね。

それでもダメなら Zend Optimizer 試してみて、それでもダメなら Zend
Cache 使ってみれば(試用可能)?


40 :名無しさん@お腹いっぱい。 : 2001/03/01(木) 04:55 ID:???
>>電動ナナシ
あんたすごいね

41 :1 : 2001/03/01(木) 11:36 ID:JBbZYZIY
>>電動ナナシ
超参考になりました

やっぱちゃんと開発前に時間とっていろいろ考えないとだめですよね。。
でも開発の時間のけつは決まってるし、開発と運用両刀じゃすでに終わってる感じ

インデックス張ってんのにやたらおせーと思ったらそうゆうことでしたか。。。
バキュームね


42 :22世紀を目指す名無しさん : 2001/03/01(木) 14:37 ID:???
bakyu-mu kowai mukashi view ga kowaretayo

43 :電動ナナシ : 2001/03/01(木) 20:43 ID:???
>>40
全然すごくない。厨房レベルだよ。

>>41
RDBMS はテーブル設計が超重要だからね、事前に時間をとってきちんと設計しないと結構
悲惨なことになるよ。特に忙しいサイトだとね。データ見せられてすぐに第三正規化できる
程度に正規化には習熟しておこう。

『Oracle パフォーマンスチューニング』読んでみるといいよ。Oracle と書いてあるけど、
ベースになる思考や知識は共通。だって RDBMS じゃん。メモリアクセスやディスク
アクセスのパターンがそんなに劇的に変わるはずがない。

Vacuum は index から使われないエントリを削るので、頻繁に削除・変更が起きるなら
必須だね。Rebuild はしてくれないような話も聞くが・・・。explan 使って index が
使われているか確認してみたら?

>>42
Vacuum で何か壊れたって経験はないなあ。自分の面倒見ている範囲では、もう vacuum
回数は 1 万回以上にもなるけど、何か壊れたことはない。ディスク障害とか別の原因が
あったんじゃないの?


44 :名無しさん@お腹いっぱい。 : 2001/03/03(土) 00:50 ID:oGZ0BuJI
Vacuumしなきゃいけない構造はそのうち変えるつもりだって
本家のMLでいってたな<Postgres

PHP+PostgreSQLってやはり最初はとっつきだよなやすい組合せだよな

45 :: 2001/03/07(水) 18:55 ID:jKFQhH5Q
電動ナナシ=いしい


46 :名無しさん@お腹いっぱい。 : 2001/03/07(水) 23:33 ID:/LPxFF6o
>45
うそ。141氏なら、文書の最後は。じゃなくて"."

47 :名無しさん@お腹いっぱい。 : 2001/03/08(木) 00:13 ID:gfJj0eZ.
今日初めてPostgreSQL+PHP3の組合せに取り組みました。
早速本などを参考にデータベースよりデータを取り出してみようと思ったのですが、
いきなりエラーです。

エラーは
"Unable to connect to PostgreSQL server. FATAL 1: SetUserId :
user' nobody' is not in 'pg_shadow' in /usr/local/apache/...(略)... on
line 10"
みたいに出て来ました。
これはapacheのconfiguファイルで、接続先を設定しなければならないエラーなのでしょ
うか?

48 :名無しさん@お腹いっぱい。 : 2001/03/08(木) 00:33 ID:BWgxY/8I
nobody に テーブルに対するアクセス権限を認めてあげましょう。

49 :47 : 2001/03/08(木) 01:41 ID:6UaCuFtA
>>48
これは/usr/local/pgsql/data/pg_hba.confのlocalとhostで編集でしょうか。
今このファイルを見ましたら、デフォルト設定になっていました。
一応どちらもallになっており、更にはこのファイルもreadonlyモードにしてみました。
しかし、やっぱり結果は同じでした・・・

本当に右も左も判らない私・・・

50 :48 : 2001/03/08(木) 02:12 ID:BWgxY/8I
>>47

マニュアルのこの部分を読んで設定してください。
http://www.pjam.jpweb.net/pgsql-doc/ej/user/sql-grant.htm

もし上のが意味不明に思えるなら下記の一連のスレッドをお読みください。
http://sidecar.ics.es.osaka-u.ac.jp/php-jp/archives/msg02923.html




51 :別人28号 : 2001/03/08(木) 19:16 ID:CnTEhrpA
私の場合、pg_connect(user=postgres table=xxxx)
このuserはcreateuserでつくったのに、上記の同じエラーが
出るのですが、さっぱりわけがわかりません。
createuserを使うと、pg_passwdとpg_shadowのどちらのファイルに
記述されるんでしょう。
pg_shadowはテキスト・エディターで開いても、文字化けして読めません。



52 :名無しさん@お腹いっぱい。 : 2001/03/08(木) 21:46 ID:???
バイナリファイルを開いて「文字化け」とはかわいいね。

53 :名無しさん@お腹いっぱい。 : 2001/03/08(木) 21:55 ID:qBpM5VmI
> うそ。141氏なら、文書の最後は。じゃなくて"."

句読点を「,」「.」にしてるやつ最高にうざい・・・・

# レスキューもまねして,.使ってたな。

54 :47 : 2001/03/08(木) 21:59 ID:gfJj0eZ.
>>48
ありがとうございます。
早速上のマニュアルを参考に、テーブルのアクセス権を変更してみました。
GRANT ALL ON XXXX(テーブル名) TO PUBLICでenterしたら、
chengeのような表示が出ました。
もう一度ブラウザ上でファイルを読みだしたところ、今度は違うエラー表示です。
これは多分私が真似したスクリプトが違うようで、
Parse error:
parse error in /usr/local/apache/htdocs/ユーザー/test01.php3 on line 10
でした。これはスクリプトの10行目が何かおかしいよ、という意味で解釈してい
いのでしょうか。

もしそうなら、データベース自体への接続は出来たのかと一安心してます。

55 :名無しさん@お腹いっぱい。 : 2001/03/09(金) 10:50 ID:???
>>51
pg_connectってtableの引数ないんじゃ?



56 :別人28号 : 2001/03/09(金) 15:20 ID:XDCy6L0g
>>55
functionでおま。
問題は解決。
データベースのデータがページに出力されたのをみた瞬間、
ニヤリと笑ってしまった。ああ、プログラムの喜びよ(おおげさ)

57 :名無しさん@お腹いっぱい。 : 2001/03/09(金) 23:25 ID:Era56j0U
これからPostgreSQL+PHPの勉強を始めようと思います。
今まで少しだけWindowsでidc+htx+odbc+Accessという組合せでデータベースを
ウエブ上に表示させたり、そこから更新や新規登録などをかじってみました。

そこで質問ですが、idc+htxという組合せだと
サイト訪問者--->htmlファイル等で問合せ--->idcファイルが問合せの処理--->htx
ファイルにその結果を表示
という流れだと思うのですが、PHPの場合は
サイト訪問者--->htmlファイル等で問合せ--->phpファイルが問合せの処理+その処理
結果を表示
という流れと考えていいのでしょうか?


58 :初期不良 : 2001/03/10(土) 00:07 ID:/BpOSDls
>>56
ODBC ドライバ使って MS Access から pg のデータを
編集できたときもうれしかったですわ。
データを作るならこの方がやりやすいしね。
MySQL でもこういう子とできるのかな?

59 :初期不良 : 2001/03/10(土) 00:25 ID:???
できるみたい。
http://www.softagency.co.jp/mysql/Win/win.html
とりあえず試してみます。

60 :初期不良 : 2001/03/10(土) 03:29 ID:???
簡単にできた

61 :名無しさん@お腹いっぱい。 : 2001/03/13(火) 10:47 ID:XUU/SqIk
PHP側の問題としては、標準的なSQL要求に対してのグローバルな
インタフェースを用意できていないのが問題な気がする。
一度決めたDBを乗り換えようとした場合、ムチャクチャ大変でそ?

この辺、どーにかならんのかね…

62 :名無しさん@お腹いっぱい。 : 2001/03/13(火) 10:48 ID:XUU/SqIk
あと、MySQLってトランザクションが無い時点でいきなり候補から落ちない?
そもそも商用に使っていいんだっけ?

63 :名無しさん@お腹いっぱい。 : 2001/03/13(火) 11:27 ID:CHZk5oPM
>>61
PHP4 には一応抽象化 DB クラスがあったりしますね。
で、 PHP4 で増えたこのあたりの機能のことを見ようと 「PHP4徹底攻略」を
買ってきたんだけど、 DB 回りのサンプルは PHP3 対応の旧版とほとんど
かわってねーんでやんの。
セッション機能なんかもさらっと触れられてるだけだし。

巻末の役に立たないリファレンスなんかいらないからそのあたり詳しく
書いて欲しかった。

64 :電動ナナシ : 2001/03/13(火) 13:42 ID:???
>>63
あの本はダメだよねえ。というか PHP ユーザー会で Pear に取り組もうと
いう人が広川さん以外にいない時点で、かなり終わっているね。
最近はろくな活動もしていないみたいだし。

いつまでも『PHP + PostgreSQL による高機能 Web の構築』じゃないだろうに。

・どうやったら生産性を高めることができるか
 ・どうやったら同じコードを何度も書かずにすむか
 ・どうやったら同じバグに遭遇しないですむか
・どうやったら設計が簡単になるか
 ・どうやったら設計情報を抜け漏れなく記述できるか
 ・どうやったら設計情報を共有できるか
・どうやったら実装が簡単になるか
 ・どうやったらビジネスロジック層と永続化層をきれいに分けることができるか
 ・どうやったらオブジェクトの永続化が容易になるか
といった課題を解決していかないと、小規模案件の書き捨て用言語以上の存在には
ならないだろうね。で、最初のはクラスを使うことでかなり解決できるし、
二番目のは UML(+ Web 拡張)かな?という気もするし最後のは既存の方法論が
使えるし、十分クリアできるじゃーんとか思うんだけどなぁ・・・。


65 :名無しさん@お腹いっぱい。 : 2001/03/13(火) 18:35 ID:/6OYEncI
>>63-64
言いだしっぺの法則の適用を望みます。
それを本気でやったらPHP界の英雄になれますよ。それだけでは食ってけないでしょうけど (苦笑

66 :電動ナナシ : 2001/03/13(火) 20:28 ID:???
>>65
うひゃあ!うっかり余計なことを言うもんじゃないなあ。
まあ何か出てきたらこの板にて書きますわ。

ちなみに PHP ユーザー会は日本語化についてかなり貢献していることにも
触れておかないと片手落ちだね(もともと日本語化のメンバーが中心だしなあ)。
だからクラスがどうのこうのよりも日本語化にしか関心がないという推測も
できるかもね。


67 :名無しさん@お腹いっぱい。 : 2001/03/13(火) 22:30 ID:???
PEARのDB.php(pgsql.php)使ってみたけど、ちょい使いづらいぞ。

68 :電動ナナシ : 2001/03/13(火) 23:21 ID:???
age


69 :電動ナナシ : 2001/03/13(火) 23:22 ID:???
あれ・・・書き込まれない。リトライ。

>>67
なんのなんの、あれの原型になっていると思われる DBTools.h++ に比べれば
まだまだ素直でしょう。DBTools.h++ に興味があったら
http://www.roguewave.com/support/docs/dbtug/index.cfm
へどうぞ。

冗談はともかく、慣れの問題もあると思うよ。connect->exec->result->close という
手順に慣れていると fetch だのなんだのいったお約束は邪魔に感じるとは思う。
その印象は正しいと思う。

ただ、この手のクラスライブラリは
・どのデータベースにアクセスするにも同一の手順を使える
 -> 覚えることは一つでよい
・少なくとも Pear の中のロジックについては信頼して使える。
 つまりデバッグすべき範囲を限定できる
という点に大きなメリットがあるから、そのアプリケーションを PostgreSQL
以外の RDBMS に移植するとか、アプリケーションごとに異なる RDBMS を使う
必要があるといった場合にならないとメリットを感じられないかもしれない。

言い換えれば、RDBMS の実装を一つに固定してしまうなら Pear の DB クラスは
それほど威力を持たないということ。自分でアクセスクラスを書いた方が多分
便利だろうね。


70 :Error 401 : 2001/03/14(水) 09:43 ID:on3m5pqo
PEARのDB.php(pgsql)が使いづらいと思っている点。
使い方に誤りがある場合は指摘してください。

・$connectionを公開していないのでpg_set_client_encoding()などを行えない。
・query()もsimpleQuery()もその中でpg_numrows()を実行しているのに、
 再度numRows()を実行しなければ行数が分からない。
・Selectする手段がquery(), simpleQuery(), execute()と複数あり、迷ってしますう。
・遅い(単純なページで、ページあたり+20〜+30msかかる)

といったところです。もちろん、extendして自分でクラス定義してしまえばいいんですけど。

71 :名無しさん@お腹いっぱい。 : 2001/03/14(水) 09:49 ID:ZHQnQBoo
遅いって、classとかで包容しようとするならそれは仕様つーか命題つーか。
ブラックボックスアプリがでかくなるのは当然でそれはシステムで補っていただきませう。

今書いてるモノだと、こいつは絶対エラーにならんから処理省いちゃえ的に
書くこと多いんであとで苦労することが多いんだよね。
classがそれを助けてくれるのなら大歓迎。
次のシステムで実験させて貰います。

72 :電動ナナシ : 2001/03/15(木) 03:54 ID:???
>>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 ID:???
> ・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 ID:???
あぁぁー、すごい勘違いをしてた。
インスタンス変数って、プライベートだと思っていたら、パブリック
だったんですね。
道理で、アクセッサメソッドが無いわけだ。

それから、各メソッドの説明どうもです > 電動ナナシさん
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 ID:???
>>72
>simpleQuery とかで simpleQuery("SET clientencoding TO 'EUC_JP'"); とか
>して対処できない?

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

76 :Error 401 : 2001/03/15(木) 14:07 ID:???
恥ずかしい質問なので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 ID:???
さらに疑問が。

(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 ID:???
>>76-77
ちょっと今余裕がないので、1点だけ。

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

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

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

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

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

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


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

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


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

82 :電動ナナシ : 2001/03/15(木) 17:34 ID:???
>>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 ID:???
あー、でも PostgreSQL ってエラーコードがない(errorMessage() で取得する
しかない)んだよね。それで実装されてないって可能性が大きいかも。

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


84 :Error 401 : 2001/03/15(木) 21:18 ID:L14mApPU
PHP-jp見てて、
http://lxr.php.net/source/php4/pear/DB/pgsql.php
を発見しました。

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

とりあえず、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 ID:???
> # ところで、PEARのアノニマスCVSリポジトリってあるんでしょうか?

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

cvsweb:
http://cvs.php.net/viewcvs.cgi/php4/pear/

pserverもありました。

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

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

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

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

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

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


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

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

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

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


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

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

90 :Error 401 : 2001/03/16(金) 12:10 ID:???
新しいマニュアルをダウンロードしたら、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 ID:???
>>84
query() は DB_common.php に移動したみたいだね。で、query() では simpleQuery() を
中で呼び出して使っている。こっちの方がエレガントでいいよなあ。
# Refactoring だね。:-)

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


92 :47 : 2001/03/16(金) 18:23 ID: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 ID:7X0S2/Ts
>>92 ...to public なら、全てのユーザーに許可されます。
postgresアカウントでcreateuser nobodyしてみました?

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

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

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

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

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

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

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

99 :Error 401 : 2001/03/19(月) 16:04 ID:JUrUc3Rc
なかなかよさそうなページ発見。
http://www.zend.com/codex.php?CID=10

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

100 :Error 401 : 2001/03/19(月) 20:25 ID: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 ID:JUrUc3Rc
ついでに、PostgreSQL情報も。
PostgreSQL 7.1beta6が出てたのでインストールしました。

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

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

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

102 :Error 401 : 2001/03/19(月) 21:10 ID:???
あと、日本語対応の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 ID:???
なお、ちゃんとした情報は、ChangeLogを参照してください。
ウソ書いてる可能性大。

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

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


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


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

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

109 :名無しさん@お腹いっぱい。 : 2001/03/22(木) 00:10 ID: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 ID:4SRnrY4g
ごめんなさい。
自分で解決出来たと思われます。

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

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

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

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

112 :Error 401 : 2001/03/23(金) 14:18 ID: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 ID: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 ID:QOTp2BjA
ど素人なんですけど
持続的接続はhttpdのpidごとに張るんですよね。
だからプロセスが変わるってのは変なのではないでしょうか?
ストアドだから張ったときのnow読んでいるって言う可能性は
ないのでしょうか?
この板にがんばって発言してみようと思ってるんですけど
ほんとど素人であーぱーナこといってすいません。

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

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

daemontools 使って PgSQL 側の接続状況調べて、同時に何コネクション
張りにきているか調べてみたら?
http://tanaka-www.cs.titech.ac.jp/~euske/doc/daemontools.html


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

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

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

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

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

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

119 :電動ナナシ : 2001/03/23(金) 21:41 ID:???
持続的接続というのは、あくまで 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 ID:???
あ、上のはあくまで別ホストに接続する場合だよ。

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

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

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

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


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

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


122 :Error 401 : 2001/03/26(月) 14:40 ID: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 ID:Ak2GGF56
>>122
Postgres が残るってのは不思議だなあ。勘違いしてるかもしれないので、
ちょっと調べてみる(ちゃんと確認しているわけじゃなかったので)。

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

130 :Error 401 : 2001/03/28(水) 10:42 ID: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 ID: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 ID: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 ID: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 ID:???
えーと、ひょっとして気になさっている方がいるかもしれないので、
報告しておきます。

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

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

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

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

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

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

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

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

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


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

はい、死んでくれます。

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

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

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

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


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

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


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

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

143 :電動ナナシ : 2001/04/05(木) 08:30 ID:???
>>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 ID: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 ID:???
>>144
> fork()って、PHPのプロセスのことですか?
いや、httpd のプロセスのこと。
さっきマニュアル見たらちゃんと書いてあった。httpd の Child Process ごとに
永続的接続するよって。
鬱だし脳。
http://www.php.net/manual/ja/features.persistent-connections.php


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


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

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

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

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

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

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

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

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

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


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

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

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


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

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

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



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

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

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

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

161 :電動ナナシ : 2001/04/12(木) 10:39 ID:???
>>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 ID:???
>>161
どんな言語が出ても、こうする人たちは一生こうしていくんだと思う。
で、「このSQL文投げると○○分帰ってきません」とかなる。

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

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

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

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


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

166 :153 : 2001/04/13(金) 23:38 ID: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 ID:7roKMnwY
そもそも 主キーはないの?


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

169 :153 : 2001/04/14(土) 00:24 ID: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 ID:3tHlDu72
くっきー

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


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

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

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

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

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


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

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

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

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

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


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



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

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


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

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


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

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

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

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


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


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

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

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

という問いには、

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

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

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

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

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

鬱氏。

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

203 :名無しさん@お腹いっぱい:2001/05/05(土) 16:54 ID: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 :名無しさん@お腹いっぱい。:2001/05/05(土) 17:35 ID:???
' を \' に置換するだけ。

205 :203:2001/05/05(土) 18:30 ID:ejxtLiFA
>>204
%と_は?

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

207 :203:2001/05/06(日) 16:11 ID:kun4pZhs
'と%と_で全部?

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

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

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

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

親切な方教えてください

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

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

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

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

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

216 :名無しさん@お腹いっぱい。:2001/07/09(月) 12:36 ID:???
>>215

readline がないんじゃない?

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

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

218 :774:2001/07/09(月) 23:37 ID: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 :名無しさん@お腹いっぱい。:2001/07/10(火) 02:12 ID:???
>>218

libtermcap を入れてみよー

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

221 :名無しさん@お腹いっぱい。:2001/07/10(火) 16:49 ID:???
>>220

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

222 :名無しさん@お腹いっぱい。:2001/07/14(土) 11:38 ID: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 :名無しさん@お腹いっぱい。:2001/07/14(土) 11:39 ID:ZarpnJWo
↑原因はなんでしょうか。
フツーにselectで,tableの内容を表示しようとするとこうなる。
当方,管理者ではないので,設定イジくれません。

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

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

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

227 :225:2001/07/24(火) 02:01 ID: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:2001/07/24(火) 04:11 ID:???
set timezone to 'JST-9';
ついでにいうと、確認のためには select 'now'::datetime; が吉かもしれないにょ。

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

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

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

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

97 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)