PHP + PostgreSQL
■ このスレッドは過去ログ倉庫に格納されています
0001りさあ
NGNG0145電動ナナシ
NGNG> fork()って、PHPのプロセスのことですか?
いや、httpd のプロセスのこと。
さっきマニュアル見たらちゃんと書いてあった。httpd の Child Process ごとに
永続的接続するよって。
鬱だし脳。
http://www.php.net/manual/ja/features.persistent-connections.php
0146名無しさん@お腹いっぱい。
NGNG来は英数字のみの組合せ)を入力してもらい、それをPHPを通じてPostgreSQL
からデータをピックアップ予定です。
この$test_idがselect文において
select * from t_test where test_id = $test_id
としてデータをピックアップする際の判断材料です。
しかし、フォームの場合だと何も入力しないで送信したり、2文字
と指定していても1文字しか入れないなど、色々問題が考えられま
すよね?
で、それらはPHP内にエラー処理スクリプトを書いて、自分では
「完璧!」とか思っていたのです。
でも、ちょっと不安だったので、色々とフォームに英数字以外に
記号など(*や!などなど)を入れると、エラーが出ることが判明
しました。
このような記号が入力されたとき、何か上手にエラー対処する方
法などを教えていただけませんでしょうか?
0147名無しさん@お腹いっぱい。
NGNGereg()とかpreg_xxxx()などの正規表現ライブラリ関数を使って、
妥当性チェックしてみてはいかが?
0148146
NGNG早速ereg("[[:alnum:]]{2}", $test_id)として、ちゃんと指定の
形で英数字2文字だけが入力されているかを判定させてみました。
無事考えていたことが出来ました。
ありがとうございます。
0149名無しさん@お腹いっぱい。
NGNGereg()の正規表現って気持ち悪いね
0150名無しさん@お腹いっぱい。
NGNG149って気持ち悪いね
0151名無しさん@お腹いっぱい。
NGNG>安定性が確認されていないベータ版には興味がないのかもしれないね。
つーか、ほいほい導入してもデータの移行が大変なんだよ
0152名無しさん@お腹いっぱい。
NGNGサイトはありますか?
0153名無しさん@お腹いっぱい。
NGNGどなたかご親切なアドバイスをいただけませんか?
フォームからInsert用のデータを受取り、それを処理するファイルがhoge.php3
とします。
フォームからのデータ自体をphp3利用でPostgreSQLにInsertすることまでは出
来ました。
しかし、このままでは本当にそのデータがちゃんとデータベースに登録されたのかど
うかがフォームに書き込んだ人は判りませんから、同じhoge.php3にデータ登録後
に今度は今ちょうど登録したデータはこれでいした、みたいに表示させたいのです。
でも、それを簡単に処理する方法がどうしても思い付きません。
是非この簡単・初歩の初歩だとは思うのですが、それすら判らない厨房に是非暖かい
アドバイスをいただけませんでしょうか?
0154名無しさん@お腹いっぱい。
NGNG$result = pg_exec($sql);
if($result){
echo "登録したデータは$hoge";
}
0155Error 401
NGNGどこが判らないのかが良くわかりませんが、
pg_getlastoid()
を使えば、pg_exec()でInsertされたオブジェクトのoidを取得できます。これで、
select * from table_name where oid = $last_oid
とすれば、今Instertしたタプル(行)を取り出せます。
それとも、取り出したタプルを簡単に表組して表示する方法がわからない
のかな?
0156名無しさん@お腹いっぱい。
NGNG私もそれでいいと思います。
同時にinsert,selectの部分はトランザクション入れた方がいいかも。
oid取得後selectして、
表組みが面倒ならpg_fetch_array($r,$row)で配列に格納して
テンプレートファイルに埋め込むという手も。
見栄えはいいかも・・。
0157153
NGNG>>155
>>156
皆さん本当にありがとうございます。
PHPの本を買って、色々関数を探してみているのですが、実際にそれ
らをどう活用するのかが今ひとつ理解しきれていません。
今晩家に帰って早速皆様から教えていただきました方法を試してみ
ます。
結果はまた今度お知らせします。
0158PHP-jp観察者
NGNGより引用。
-----------------------------
ってな、環境のシステムのプログラムを引き継ぐ事になってプログラムの改良を
行っているのですが、以下の様なコードで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する
方法を探してるときたもんだ。
0159153
NGNG実は私が質問する際、PHP-jpと2ちゃんねるのどちらで聞こうか
迷いました。
最終的にこちらで教えてくれる人達の方が凄く親切・丁寧である
ような気がして、昨晩書き込みした次第です。
なんだかPHP-jpだと、初心者だと突き放されそうな気がして、ど
うも尻ごみしてしまいます。
0161電動ナナシ
NGNGこれはちょっとショッキングだなあ。
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 が分かっていないねえ。
0162Error 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どの変(ページ数とか・・・)教えてくれると助かるんですが・・・。
■ このスレッドは過去ログ倉庫に格納されています