PHP + PostgreSQL
■ このスレッドは過去ログ倉庫に格納されています
0001りさあ
NGNG0162Error 401
NGNGどんな言語が出ても、こうする人たちは一生こうしていくんだと思う。
で、「このSQL文投げると○○分帰ってきません」とかなる。
ちょっとSQL勉強して、各DBエンジンのクセやコスト算出方法を知れば
こんなことなくなると思うんだけど。
この間、ちょっとかかわった某大規模システムもそんな感じで設計されてた。
JOINを知らないのはおろか、数千レコードのあるカラムの合計を取ってくるのに、
数千回ループして、+=してた。
しかも、それ、Webシステムのサーバアプリ部分。どうなったのかな、アレ。
0163153
NGNGたまたま話題としてPHPの判る人でなければ煽れない(のかな?)
ということで、本当に煽ラーがいなくて助かります。
逆に皆さんの書き込み見ていると、欲しいと思っていた答えがズ
バリと回答されてたりしますので、この板を色々参考にさせてい
ただいてます。
0164名無しさん@お腹いっぱい。
NGNGinsert 直後なら、プライマリキーも保持したまま
だろうから、それを where につっこんだら
いいんじゃないのかな・・。
oid は、索引されてなくて遅い。
0165名無しさん@お腹いっぱい。
NGNG0166153
NGNG>>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文のフレーズなんです。
どこで私は大きな間違いをしでかしてますでしょうか???
0167名無しさん@お腹いっぱい。
NGNG0168153
NGNG一応テーブル内にはIDというフィールドを設けております。
上記の例ではinsert部分で省略して書いてしまいました。
IDはprimary keyで、自動的に番号を振るようにtest_id_seq
を設定してあります。
0169153
NGNGsql_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
{
エラー表示
}
0170名無しさん@お腹いっぱい。
NGNG0171名無しさん@お腹いっぱい。
NGNG0172cookie
NGNG0173153
NGNGご指摘ありがとうございます。
その場合、今登録された主キーのIDはどのようにして特定すればいい
のでしょうか?
0174電動ナナシ
NGNGというか、主キーが意味はわかっていないのかな・・・。
テーブル中のレコードを一意に識別する ID に相当する列のことだよ。
例えば、人事テーブルがあって、そのテーブルが
(従業員ID, 氏名, 住所, 連絡先)
という風になっており、同姓同名の人を区別するために従業員 ID を使って
識別しているなら、従業員 ID が主キーになる。
普通主キーとなる列に対しては、重複する列の挿入を禁止するために
Primary Key 制約か Unique 制約を定義するけど、その辺ちゃんとやってる?
これは PHP とか PostgreSQL とかいう以前の、データベース一般の設計の
お話だよ?
0175電動ナナシ
NGNGおおっと、ID も Primary Key はあるって >>168 に書いてあるね。
勘違いしていた。ごめんなさい。
なるほどね、INSERT した直後に、自動的に割り当てられる ID をどうやって
特定するかって質問なのね。
これは先の人が書いているように oid を取得して特定するしかないんじゃないかな。
それ以外の列って重複する可能性があるから当てにならないしね。
ちなみに自分は自動連番はやってない。登録フォームを表示するときに
squence から番号を取得して、その番号をフォームに保持させておく。
そうすれば、POST された内容に ID が入っているのでそれをキーに参照
できるようになる。
これの欠点は、番号に欠番が生じるということ。だけどそれがそんなに気に
するほどのことかなあ。
0176名無しさん@お腹いっぱい。
NGNGselect currval() するのもよし、直接使うのもよし。
0177名無しさん@お腹いっぱい。
NGNGNO!
同じスクリプト内であっても、別なプロセスがINSERTしてしまえば
CURRVALの内容は変わってしまう。初心者にありがちなミス。
正解は電動ナナシ氏指摘の通りOIDの取得。
0178名無しさん@お腹いっぱい。
NGNGほんとかな。begin, end で囲っているのに?
0179176
NGNG>CURRVALの内容は変わってしまう。初心者にありがちなミス。
同じセッション内なのに、currval の値は変わるのですか?
last_value の値は保証されないようですけどね。どうか教えてください。
なんせ、初心者 なもので。
0180名無しさん@お腹いっぱい。
NGNG0181名無しさん@お腹いっぱい。
NGNG>last_value の値は保証されないようですけどね。どうか教えてください。
やってみりゃいいじゃん。
0182名無しさん@お腹いっぱい。
NGNGファイル名がpostgresql-7.1.tar.gzになってる。
0183176
NGNG変わらないよ。要はそれを言いたい。
0184176
NGNGわたしの実験ミスも考えられるし、想定外もあるし、
特定の環境というケースもあるので、変わるケースがあるなら
教えて欲しいのですよ。
0185名無しさん@お腹いっぱい。
NGNG話の流れと発言者が何人いるかよくわかりませんが、
>>178でいきなり
>ほんとかな。begin, end で囲っているのに?
という前提条件が登場します。
これが178氏と他の人の差じゃないかな?
>同じセッション内なのに、currval の値は変わるのですか?
という問いには、
* 同一トランザクション内であれば変わらない、が正解。
* begin, endでくくっていない1DML1トランザクションで、currval()を使うのは
誤り。他のプロセス(トランザクションで)値が変わっている可能性がある。
ということでよいでしょうか?>All
0186185
NGNG* begin, endでくくっていない1DML1トランザクションで、currval()を使うのは
誤り。他のプロセス(トランザクションで)値が変わっている可能性がある。
これは誤り。1DML1トランザクションでも、currval()は他のプロセス
(トランザクション)にかかわらず、普遍ですね。
セッション内で一貫性があるようです。
鬱氏。
0187名無しさん@お腹いっぱい。
NGNG0188名無しさん@お腹いっぱい。
NGNG# RDBMSについてしゃべる場所ってどこかないのかな?
0189名無しさん@お腹いっぱい。
NGNG「シーラカンス本」
「マンモス本」
を前提に語るのはやめて欲しいなー。
あ、俺は両方持ってるんだけど。
前者はバージョンが古いし、後者はちょっとアレだし・・・。
今一、人に薦めづらいんだよね、この本って。
0190名無しさん
NGNGinsertで失敗してもカウントが1上がってしまうのですが
これはしょうがないことなのでしょうか?
0191名無しさん@お腹いっぱい。
NGNG0192名無しさん@お腹いっぱい。
NGNG技術系ってそうなのかなぁ。妙に偉そうだったりするの
0193名無しさん@お腹いっぱい。
NGNG0194名無しさん研究所
NGNG激しく同意。うかつに質問なんてできないっしょ。
だから意地になってマニュアル+マンモス本+過去ログで
自分で解決してる。恐ろしく効率悪いけど・・・
# 聞くは一時の恥、聞かぬは一生の恥 とも言いますが・・・
0195名無しさん@お腹いっぱい。
NGNGそう。ネット上じゃ逆だねぇ。。
0196名無しさん@お腹いっぱい。
NGNGトランザクションを入れてみては・・
0197名無しさん@お腹いっぱい。
NGNG環境の違いとかはあるのでしょうか?
あと、お勧めのOSは何ですか?
0198名無しさん@お腹いっぱい。
NGNGうーん、デフォルトの文字コードが違うとか、使えるシステムコールやライブラリ
のPHPのラッパ関数が違うとか、かな?
OSは、Linux系をお勧めします。
0199名無しさん@お腹いっぱい。
NGNG>>196
トランザクションをアボートしても、serial型の場合、
インクリメントされちゃった値はもどんないよ〜。
って、どっかのスレでも話題になってなかった?
0200153
2001/04/21(土) 16:07ID:2SRwUN3cたった今insertで登録したデータをselectで引っ張り出すこと
が出来ました。
ありがとうございます。
0201名無しさん@お腹いっぱい。
2001/04/21(土) 19:35ID:???いや、ほのぼのとして、良いぞ。
0202153です
2001/04/22(日) 10:09ID:GJXSK57Q実はスクリプト自体は皆さんのご指摘を元に作成出来ていたのですが、
ずっとエラーが出続けてました。
で、oid=$last_oidの部分が多分問題なのかと思って、ここを色々
いじくっていたんです。
解決出来たのは、もう一度スクリプトをじっくりと眺めていて、「"」
と「'」が2か所抜けておりました・・・
0203名無しさん@お腹いっぱい
2001/05/05(土) 16:54ID:ejxtLiFAPHPで外部からきたデータに大して、そのまま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文が成立しなくなるんだけど、みなさん、こういうのにはどう対処しているんでしょうか?
0204名無しさん@お腹いっぱい。
2001/05/05(土) 17:35ID:???0205203
2001/05/05(土) 18:30ID:ejxtLiFA%と_は?
0206名無しさん@お腹いっぱい。
2001/05/05(土) 20:35ID:???0207203
2001/05/06(日) 16:11ID:kun4pZhs0208名無しさん@お腹いっぱい。
2001/05/06(日) 18:36ID:???シングルクォートのときはシングルクォートの前に入れるだけで良かったと思うけど。
0209名無しさん@お腹いっぱい。
2001/05/07(月) 20:18ID:???これさえいらなければなーとつくづく思うんだがね > PostgreSQL
0210名無しさん@お腹いっぱい。
2001/05/07(月) 20:56ID:???残念ながら気のせいです。
0211名無しさん@お腹いっぱい。
2001/05/08(火) 18:58ID:???バックエンドに接続できないの?
pg_connectでエラーが出て、postmasterに-iをつけて起動しなおしたら
すんなり動くようになって、動くのはいいんだけれど、なんか気分悪い
親切な方教えてください
0212名無しさん@お腹いっぱい。
2001/05/08(火) 19:19ID:Nor6.bTwマニュアルの、「LIXPostgreSQL 関数」を参照。
pg_connect()の実引数が微妙に違うみたいです。
0213211
2001/05/08(火) 20:09ID:???http://www.php.net/manual/ja/ref.pgsql.php
の「表 1PostmasterとPHP」ってとこだね
ホスト名を明示しちゃうと、TCP/IP経由になっちゃうんだね
書いてあるとおりに書き換えたらUNIXソケットで接続してくれるようになったよ
どうもありがとう!
0214名無しさん@お腹いっぱい。
2001/05/08(火) 20:54ID:???そろそろ、自動でマニュアルをダウンロードしてmknmzかけるしくみを
作っとかんといかんな。
0215774
2001/07/08(日) 23:52ID:AeZs44/gカーソルの上を押したら、前に打ったコマンドが出るようにしたいのですが、
どうしたら良いでしょうか。
ちなみに、通常のコマンドラインではカーソルの上を押せば
前のコマンドが出ます。
0216名無しさん@お腹いっぱい。
2001/07/09(月) 12:36ID:???readline がないんじゃない?
0217名無しさん@お腹いっぱい。
2001/07/09(月) 13:21ID:???おそらくはそれが原因だね。あるけど見つからないとか。
>>215
OS はなんだろう?FreeBSD ?
./configure --with-libraries=/usr/local/lib ....
とかで解決できないか?
0218774
2001/07/09(月) 23:37ID:KhxN5./kreadlineは入っています。
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
0219名無しさん@お腹いっぱい。
2001/07/10(火) 02:12ID:???libtermcap を入れてみよー
0220218
2001/07/10(火) 08:58ID:???libtermcapも入っておりました。
うーむ。
0221名無しさん@お腹いっぱい。
2001/07/10(火) 16:49ID:???となると、 config.log を見て readline を見つけそこなっている
原因を探るだねぇ
0222名無しさん@お腹いっぱい。
2001/07/14(土) 11:38ID:ZarpnJWo0223名無しさん@お腹いっぱい。
2001/07/14(土) 11:39ID:ZarpnJWoフツーにselectで,tableの内容を表示しようとするとこうなる。
当方,管理者ではないので,設定イジくれません。
0224名無しさん@お腹いっぱい。
2001/07/15(日) 01:06ID:fduksvn.0225初心者
2001/07/23(月) 06:07ID:xOk2bt2U今日の日付と一致する行を表示するにはどうすればいいのでしょうか?
0226名無しさん@お腹いっぱい。
2001/07/23(月) 06:34ID:SYz87UN60227225
2001/07/24(火) 02:01ID:goR17G.Aで、cshで、.chsrcに「setenv TZ JST-9」としたものの、
psqlで、select 'now'::date;としても、7/24のはずが、
7/23(昨日の日付)が表示されてます。タイムゾーンが設定されていないようです。
postgresはunixとは別の独自のタイムゾーンを持つようだ、ということは、
マニュアルのdatetime-appendix.html
を見てなんとなくわかるのですが、しかしJSTに設定する方法が、これを見てもわかりません。
どうすればいいのでしょうか?
0228JAPU
2001/07/24(火) 04:11ID:???ついでにいうと、確認のためには select 'now'::datetime; が吉かもしれないにょ。
0229225=227
2001/07/25(水) 16:26ID:I8vfzaAcすると、毎回set timezone to 'JST-9';の文章を実行しなければならないのですか_
あるいは、postgresの.chsrcみたいのがあればいいのですが・・・
0230名無しさん@お腹いっぱい。
2001/07/25(水) 17:23ID:bOBsSY920231ナナシファン
2001/07/25(水) 19:13ID:xCgI2gSwちゃんと動いているという事例を聞いたことがないんだけど、
期待通りに動いている人っている?
0233
01/10/11 22:30ID:tBxjcP4c0234名無しさん@お腹いっぱい。
01/10/11 23:11ID:???狭い世界にお住まいなのですね。
0235Error401
01/10/18 17:24ID:fbcY2f30pg_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
0236Error401
01/10/18 17:35ID: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
0237Error401
01/10/18 17:37ID:???0238名無しさん@お腹いっぱい。
01/11/05 22:38ID:I5P+61E/PostgreSQL に限ったことではないのですが、
・電話番号
・郵便番号
どういう風にフィールド作ってます?
市外 CHAR(4),
局 CHAR(4),
番 CHAR(4)
前3 CHAR(3),
後4 CHAR(4)
みたいな感じ? それとも一つの TEXT/VARCHAR?
それぞれ長所短所あると思いますけど、
よろしかったらみなさまのご意見お聞かせください。
スレ違いならスマソ
0239名無しさん@お腹いっぱい。
01/11/06 15:52ID:aGDSTcYL電話番号の市外局番ってMax4桁になったの?
0240名無しさん@お腹いっぱい。
01/11/06 16:01ID:???0241名無しさん@お腹いっぱい。
01/11/06 16:44ID:???0242名無しさん@お腹いっぱい。
01/11/06 18:24ID:y3LOZtVDPCを最近はじめ、今、PHP+PostgreSQLを勉強中の者です、
DBの、登録、削除、一覧表(毎10件)を、一つのスクリプトで実行したいのですが、一覧する際、最初の10件は、表示してくれるのですが、
11件目から〜が、表示できないで困っております。
自分で考えて作ったのは、メインページからラジオボタンで選択し、
PHPスクリプトの中で、if(もしくはswicth)で、各実行をしてます。
一覧で、submitをクリックすると、11件目から表示させたいんですけど、
どうしてなのか、表示できません。
説明下手でわかりにくいかもしれませんが、誰か、イイアドバイス、お願いします。
ド素人なので、その辺も考慮して、お願いします。
0243名無しさん@お腹いっぱい。
01/11/06 18:34ID:OqD8s6xcマンモス本読んだ?
0244>>243
01/11/07 10:11ID:ieoCTquz0245名無しさん@お腹いっぱい。
01/11/07 11:28ID:ieoCTquzどの変(ページ数とか・・・)教えてくれると助かるんですが・・・。
0246名無しさん@お腹いっぱい。
01/11/07 12:02ID:???漏れが持ってる PHP3 用のやつでよければ 81 ページからあたり。
0247245
01/11/07 12:43ID:ieoCTquz自分が持ってるのは、PHP4なので^^;
0248名無しさん@お腹いっぱい。
01/11/07 12:56ID:rEwaGgOJPHP4のやつはP144,145あたりを読めばいいかと。
でもPostgreSQLのselect文を理解してからのほうが
いいな。
0249242
01/11/07 14:14ID:ieoCTquzご教授、ありがとうです。
0250その他
01/11/09 16:03ID:vDpRquZJregression testを行ったのですが、全てが「failed」
になってしまいました。けれども、createdbもcreatetableも
insertもselectも問題無しに出来ます。でも、あとあと支障とか
あるのでしょうか?知っている方がいらしたら教えて下さい。
0251hen
02/02/07 13:36ID:Bho0YULVitem_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: って帰ってきます・・
0252hen
02/02/07 13:42ID:Bho0YULVwhere item_name = \"$itemname\"";
すんません
これに変えるとAttribute 'XX'not found
0253名無しさん@お腹いっぱい。
02/02/07 22:38ID:blA7jPNr0254
02/02/07 23:32ID:z4yCqxdvたまにわ、教えてやるヨ
$sql = "select item_id from item where item_name = '$itemname'";
って書くんだよ。
''で、変数を囲むんだよ、
これ最強
0255
02/02/07 23:33ID:t9L0Eq4jhttp://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
http://pc.2ch.net/test/read.cgi/ad/1012670549/l50
0256marois
02/02/10 22:51ID:MJ34x4JGpg_close($this->con);
のところで「pg_close -1」という値をクライアント(HTML上)
に返してきてしまうので困っています。
@を付けたり色々やってみたけど駄目。
同じスクリプトをPHP3で流すとOK。
ローカルのPHP4(Apache版)でもOK。
なにがいけないのでしょうか?
#このホスティングサービスPHPのサポートはしてくれないのです。
0257名無しさん@お腹いっぱい。
02/02/11 06:04ID:yEMLRxJJ次のような$rcプロパティでどのようにアクセスすればフィールドを
参照できるのでしょうか。
$this->rc[$i] = pg_fetch_object($result, $i, PGSQL_NUM);
pg_close($this->con); 自体を削除すればOK!
closeなんて、かかなくても、動く。
0259marois
02/02/11 20:58ID:PVwY953h動くとは思いますが、問題は出ないでしょうか?
一連のスクリプトで何度もOPENするのですが。
#セッションは1つなのでしょうか?
#疑ってすみません。
0260名無しさん@お腹いっぱい。
02/02/11 21:08ID:???select oid, * from table;
って書けばいいんだけどoid,とか記憶から消えてたね。
PostgreSQLの解説系のサイトどこに行ってもoid,の事には
あんまり触れてもないしgoogleでも引っかからないし・・・。
そういえばPostgreSQL関係で新しい本出てたね、あれなんだっけ?
書かなくても,問題でない。
どーせ、commitとか、してないんだろ。
そんな、PGだから、closeなんて、不要
0262marois
02/02/12 01:39ID:Ixi/JtIeテーブルの更新にはトランザクションは使ってます。
一応複数SQL流すので保険として。
話はちょっとそれますが、サンプルプログラムでコネクションをグローバル
変数に保持して、それを最後まで使い続けるプログラムを見たことがありま
す。最後にユーザーがLogoutしてくれればpg_close出来ますが、いきなり
ブラウザをばっさり終了されてしまうと出来ないですよね。
コネクションにあんまり神経質になんなくても良いのですかね。
同時接続50-100ぐらいを想定しているもので...ちょっと心配なのでした。
■ このスレッドは過去ログ倉庫に格納されています