Perl::DBI
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/12 23:35ID:xHkBB9i/DBI.org
http://DBI.perl.org
DBI-ML-J
http://member.nifty.ne.jp/hippo2000/dbi/dbi_japan.htm
DBI.pm 日本語訳
http://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm
0103nobodyさん
03/11/20 16:44ID:???build できた経験のある人っていませんか?
0106nobodyさん
04/01/01 17:37ID:P0LnBj0e$word = "It's";
$word =~ tr/'/\\\'/;
$sth = $mydb->prepare("insert into $TABLE_name values ('$word');");
$sth->execute() ;
$sth->finish();
$mydb->disconnect();
ってやったとき"It's" の ' が消えて "Its"で登録されちゃうんですけど、どうすれば回避できますか?
$word =~ tr/'/''/; もやったけど、
DBD::Pg::st execute failed: ERROR: parser: parse error at or near "s" at character 86
ってでます。 quoteって関数使えば良いらしいけど、使い方が良くわかりません。
識者の方々殿。 よろしくお願いします。
0107nobodyさん
04/01/01 17:59ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
- $word =~ tr/'/\\\'/;
+ $word =~ s/'/\\'/g;
0108106
04/01/01 18:13ID:P0LnBj0e出来たー! 有難う。 昨日からずーーっとこれでハマッってたっす。
ところで - と + ってどういう意味?
0109106
04/01/01 18:29ID:P0LnBj0eAFOでスマソ
0110nobodyさん
04/01/01 19:11ID:???> ところで - と + ってどういう意味?
unified diff
ところで確認せずに言うけど
$sth = $mydb->prepare("insert into $TABLE_name values (?)");
$sth->execute($word);
ってやったら勝手にエスケープされんかい?
0112106
04/01/03 12:41ID:2IxFJ5oW出来ました。勉強になりました。
ありがとうございます。
0113nobodyさん
04/01/15 19:42ID:AedXtgQupush @array,$row[0];
}
print join(" ",@array);
これでレコードは全て数値で返ってくるとして、レコードが無い場合には
0を挟むようにしたいのですが、たとえば5個レコードがあると仮定して
3番目がNULLの場合には
3 4 0 52 1
でも実際には
3 4 52 1
と出力されてしまいます。
どうやったらレコードがNULLなのかどうか判断できるのでしょうか。
0114nobodyさん
04/01/15 22:17ID:???0115113
04/01/15 23:06ID:AedXtgQuなるほど。ありがとうございます。
3番目がNULLの場合ではなく、3番以降が全てNULLだとすると
3 4 0 0 0
と期待したいところ、4回目で既にレコードがないためにwhileの
ブロック内が実行されずに
3 4 0
となってしまいました。これを期待通りに出力するにはどうしたら
いいのでしょうか。
0116nobodyさん
04/01/15 23:58ID:???print join " ", map $_ + 0, @array[0..4];
以降 Perl の基本的な質問はこちらへ。
http://pc2.2ch.net/test/read.cgi/php/1072896288/
0117113
04/01/16 20:36ID:???push @array,$row[0]?$row[0]:0;
}
print join(" ",map $_ + 0,@array[0..4]);
としてみたのですが、レコードが無いと、whileブロック内が実行されないため
3 4 0 52 1
ではなく
3 4 52 1 0
になってしまいました。結局
$sth->fetchrow_arrayが必ずレコードを返すようにselect文を修正しました。
ありがとうございました。
0118nobodyさん
04/01/30 01:13ID:???曖昧な質問しても応えづらいとは思うのですが、
運用されてる方の「幸せになった話」や「なんでやねん話」を
お聞かせ願いたい。
0119nobodyさん
04/01/30 09:32ID:???0120nobodyさん
04/01/30 21:29ID:DOZLZjLQ0121nobodyさん
04/02/01 12:13ID:nycEgmtEname:text(文字型)
regist:date(日付型)
のとき
$sth = $dbh->prepare("INSERT INTO staff (name, regist) VALUES (?, ?)");
$name= "hoge";
$regist = NULL;
$sth->execute($name, $regist);
だと上手くいかないのです
0122nobodyさん
04/02/01 12:57ID:V0LjMB45個々のCGIがDBに接続するときのユーザやパスワードって皆さんどこに書き込んでいますか?
CGIにそれぞれ書き込んじゃってもいいのですが、分散するし危険な気もするので
人目にさらされない場所で一カ所で管理したいと思っています。
みなさんどうやってます?
0123nobodyさん
04/02/01 13:16ID:???つか多分それ strict 通んないだそ
>>1 にリンクされてる「DBI.pm 日本語訳」ページから 'NULL' を探せ
>>122
接続用のクラスを作ってそこに書き (/usr/local/lib/perl とかどっかその辺に)
DB 使う CGI は全部それを use してる
0124nobodyさん
04/02/01 15:55ID:nycEgmtE的確な指摘ありがとうございます
バッチリ上手くいきました
0125nobodyさん
04/02/05 15:37ID:yM4BLX2X$DB = "hogedb";
$User = "hogeuser";
$Passwd = "hogepass";
$dbh = DBI->connect("DBI:mysql:$DB:localhost", $User, $Passwd);
$login_id = $dbh->quote($login_id);
$sql = "select Cust_kanji from bb_k where login_id = " . $login_id ;
$sth->prepare($sql);
$sth->execute;
@get_data = $sth->fetchrow_array;
$Cust_kanji = $get_data[0];
$sth->finish;
$dbh->disconnect;
とやってるだけなのに、
Can't call method "prepare" on an undefined value at /u/web/bblabc/cgi-local/friends/intro_popuppreview.cgi line 56.
と怒られてしまいます。
原因として何が考えられるのでしょうか?
いろいろ調べたもののわかりませんでした。
それと不思議なのが、
同じサーバの別のスクリプトで、
DBIでMysqlにつなげて成功している場合があるということです。
どなたか教えていただければ幸いです。
0127125
04/02/05 17:27ID:???$sth->prepare($sql);
じゃなくて、
$sth = $dbh->prepare($sql);
の間違いでした。。。すみません。
まだ、DBI歴2日なもので。。。
ありがとうございます。
0128nobodyさん
04/02/07 02:17ID:7x+8FZeNコマンドラインで実行したサイの
「ex:6 rows in set (0.05 sec)」
〜secみたいなやつ
0129nobodyさん
04/02/07 18:29ID:???かなり昔に使っただけだし若干狙いが違うかもしれないが、DBI配布キットにプロファイラがある。
perldoc DBI::Profile
見てみれ
0131118
04/02/09 22:00ID:r2jpV3Tkこれって同じリモートDBマシン上の複数のDBへの接続を
キャッシュできないんですか?
マニュアルには「接続を定義するパラメータは接続属性も含めて
まったく同じでなければなりません」とあり、実際に
DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge1
DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge2
という二つの接続属性による接続を作成しても、二つ目はDBIが
panic: DBI active kids..... てな感じでエラーを吐くようなんですが。
すごくそんな訳無いやん、って気もするんですが、
そういうものなんでしょうか?
0132131=118
04/02/09 22:14ID:r2jpV3Tk問題なのはDBI::ProxyかDBDみたい。。。
0133Hippo2000
04/02/23 00:49ID:IskmOTa+テストする直接DBD::Pgを利用するように変えてみては?
DBD::Proxy-DBI::ProxyServerをApache::DBIで利用するのは、ちょっと酷な気がします。
(そっちのほうがボトルネックになるでしょう)
0134Hippo2000
04/02/23 01:01ID:IskmOTa+DBD::ODBCはUnixでも使えますけど?
MDBToolsのプロジェクトがODBCドライバを出したという話は聞いてますし、
先日、Timさんがこんなメール書いてましたけど反応なかったみたいです。
Accessing Access .mdb databases from unix (was: MS Access)
http://www.mail-archive.com/dbi-dev@perl.org/msg02755.html
MDBToolsのソースを解析しようと思ってたけどODBCドライバがあるなら
もういいかなと。
0135131
04/02/23 23:50ID:wtoD45ZJDBD::Proxyを使ってみようと思ったのはDBに接続するアプリケーションサーバが
増えたときに、コネクションの制御が(漠然と)しやすいかなと思ったのと、
接続の取得クラスをSingletonパターンで実装するとコネクションプーリングが
実現できるかもしれないかなと思ったためです。
# Apache::DBIをよく理解してなかったことも有りますが...
結局あまり詳しく追求しませんでしたが、動作が不安定なので
とりあえずは直接接続以外の方法は検討しない事にしました。
0136nobodyさん
04/03/06 11:22ID:7pY4exk3たとえばゲームのレビューを書くようなホームページを作ろうとして、
それをhtmlのページのフォームから必要な情報(ゲーム名、ゲーム会社とかレビュー内容とか)を書き込んで
それをサーバー側にデータとして蓄積していきます。
そして閲覧者が見る時に、そのゲーム名やゲーム会社名で検索できるようにするには
どのような技術を使えばよいのでしょうか。
ちなみにperlもいまいちですし、データベースの知識はミジンコくらいです><
環境は…パソコンはXPで、サーバーは有料のレンタルです。そこはperl、phpが使えるようです。
なにとぞm(__)m
0137nobodyさん
04/03/06 12:41ID:???0138nobodyさん
04/03/06 14:19ID:???0139nobodyさん
04/03/06 17:22ID:???0140nobodyさん
04/03/06 18:06ID:???0141nobodyさん
04/03/06 23:21ID:???別で聞きます…すません。
0142nobodyさん
04/03/07 01:25ID:???0143nobodyさん
04/03/07 02:51ID:FpUwyDycPerlで扱うスレで誘導されてるんで、こっちで質問させてください。
Perlから、use PgでPostgre SQLにinsertするのを書いているんですが、
なぜか登録できません。(接続はできています。)
登録するカラムが26もあるのが原因なのかと悩んでいるんですが、
何か原因考えられませんか?
ちなみに、カラムを3,4個に減らすと登録できるんです。
使ってるデータ型は、text,smallint,bool,dateだけです。
0144nobodyさん
04/03/07 12:49ID:???0145143
04/03/07 16:36ID:???0146143
04/03/07 16:41ID:5iK4kpNaif ($result->resultStatus != PGRES_COMMAND_OK) {
print "$result->resultStatus";
}
を実行したら7と表示されました。(=は半角)
これは、PGRES_NONFATAL_ERRORということでいいのでしょうか?
0147nobodyさん
04/03/07 18:28ID:???ということでよさげだが、PGRES_NONFATAL_ERROR だけでは何が起きてるのかわからんな…
たぶん詳細なメッセージが stderr なりエラーログなりに出てると思うのだが、確認できん?
なんとなくSQL文の長さ制限に引っかかってるんじゃないかという気がするのだが自信は無い
0148146
04/03/07 21:16ID:5iK4kpNaSQLのstderrはどうしたら見られるのでしょうか…?
トクトクプロフェッショナルでやってるので、telnetは使えるのですが、エラーログとかはルートじゃ無くてもOKなのでしょうか?
SQL文の流さ制限は8KB以下でいいですか?これだと8192文字には行ってないはずです。
モジュールに渡せる制限とかもあるのでしょうか?
色々書いてしまいましたが、御教授お願いします。
0149nobodyさん
04/03/07 21:22ID:???じゃなかった?
最近はDBI&DBD−Pgばかりだから忘れた
0150148
04/03/08 04:02ID:???自分でもなんでって感じなんですが、サーバーの負荷と関係あるんでしょうか?
ちなみに$conn->errorMessageは使えませんでした。
ともかくプログラム自体は合っているようなので、暫く様子見ることにします。ありがとうございました。
0151nobodyさん
04/03/08 06:53ID:???この辺が理由の気がする。
0152150
04/03/09 05:20ID:???確かについ最近まで設定ミスでRDB使えない設定になってましたし、ずさんなとこが多いのは事実のような。
でも、トラフィックはめちゃめちゃな訳では無いし、安めで色々使えるので気に入ってるのですが、他にオススメのトコありますか?
自鯖立てろは無しで…。
0153nobodyさん
04/03/10 10:25ID:???0154nobodyさん
04/03/15 22:17ID:5hxMa2mEXREAとかな。
これ以上はレンタル鯖板に行って探すか、
自鯖板行って勉強するかだな。
0155131=135
04/03/16 01:14ID:4QG7B2dVあるようで、この辺↓とか読みつつなるほどと思ったり。
ttp://mathforum.org/epigone/modperl/breetalwox/38B4DB3F.612476CE@acm.org
でも、プールしたいという想いを偽る事ができない方も多いかと思ったので参考まで。
ResourcePool by Markus Winand
ttp://search.cpan.org/~mws/
ttp://www.perldesignpatterns.com/?ResourcePool (ref
Apache-Sybase-ConPool by Michael Peppler
ttp://search.cpan.org/~mewp/
SQL-Relay
ttp://sqlrelay.sourceforge.net/
決してプロセス単位の接続永続化との比較ベンチをとる神光臨を待ってる訳じゃないですw
0156nobodyさん
04/03/31 23:28ID:???0157nobodyさん
04/05/02 03:28ID:???まずかったりしますか?
今書いてるソース、すべてつけていないもので、、、
0158nobodyさん
04/05/11 22:42ID:???MySQLをPerlから操作しようとしました。
そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
0159nobodyさん
04/05/11 23:50ID:???0161nobodyさん
04/05/12 09:20ID:???0162nobodyさん
04/05/12 09:20ID:???0163nobodyさん
04/05/12 12:09ID:???0164nobodyさん
04/05/12 12:56ID:???0165nobodyさん
04/05/12 17:30ID:???名前「no」というカラムをauto_incrementで作成してinsertすると
「no」は自動的にインクリメントされていきますがinsertと同時に
今insertしたレコードの「no」を取得する方法はありますでしょうか?
現在は
1,insertする
2,一番最後のレコードの「no」取得する
という方法をしていますがもし1と2の間にinsertされると別の「no」を
取得してしまうことになります。1〜2の間でロックを行えば解決しますが
1回のSQL発行でinsertと「no」の値を取得できるようなことは出来るのでしょうか?
0166nobodyさん
04/05/12 17:49ID:???http://dev.mysql.com/doc/mysql/ja/ODBC_and_last_insert_id.html
INSERT INTO GIRLS_DATA (no, name) VALUES(NULL, 'nobodyさん');
SELECT LAST_INSERT_ID();
0167158
04/05/12 20:10ID:???無事、使う事ができるようになりました。有難うございました。
ところで、インストールしたファイルにNullP.pmと言うファイルが有りましたが
ガッしておいたほうが良いですか?
0168nobodyさん
04/08/05 13:25ID:???DBIを経由すれば問題なく動くのでしょうか?
0169nobodyさん
04/08/06 00:05ID:???DBMSの方言に合わせたSQL文を書くのはプログラマの責任
DBIx系だとSQL方言の違いまである程度吸収してくれるモジュールがあるが
日付関数のはさすがに無いかもしれないなあ
0170168
04/08/09 13:45ID:???AUTO_INCREMENTで自動付加された値を取り出す場合、
MySQLの場合「LAST_INSERT_ID()」を使いますが、PostgreSQLの場合は
「curval('targetname')」のように行うようです。
いまはプログラムでDBに合わせてsql文を変えています。(Win環境なのでPostgresSQLは使えません・・・)
このあたりも、DBIが吸収してくれますか?
0171nobodyさん
04/08/09 14:59ID:???コマンドは用意されていますか?
自分で作るのもそう手間ではないのですが・・・。
0172nobodyさん
04/08/19 13:37ID:???他の環境でコンパイル済みのものをコピーして
パスを通してやれば問題なく動くのでしょうか?
0173nobodyさん
04/08/20 00:00ID:???0174nobodyさん
04/09/23 13:51:31ID:8pWVerC90175nobodyさん
04/11/24 21:43:11ID:???DBI:ODBC バグってるっぽい、ってのは気のせいでつか・・・?!
ActivePerl5.8/MySQL4.1.7の組み合わせで使ってて判明
確信持てないのでわかる香具師教えてくらはいな。
my $dataSource = "DBI:ODBC:test";
$dbh=DBI->connect($dataSource, $userName, $pass) || die "connect die:$!";
$sth = $dbh->prepare($query);
$sth ->execute($param) || die $dbh->errstr;
while (@row = $sth->fetchrow_array){
foreach $temp(@row){
print $temp . "\t";
}
}
ってやった結果が変なのでデバッガで見てみたら、@rowの中身が壊れてた。
テーブルの中身はほかのODBCクライアントで確認、異常なし。
壊れてたのは$queryで指定している3番目のカラムで、DB上ではvarchar(20)。
壊れてたデータは、8桁の数字の後に文字列が付いているというもので、数字だけになってた。
foreach部をdumpだっけ、書き換えてDBD側のエラーが出てきたような記憶がある。
それともActivePerl ppmパッケージのみのバグなんでしょうか・・・?
0176nobodyさん
04/11/25 03:03:01ID:???0177175
04/11/25 09:38:47ID:???ああごめんなさい、それで動いてからのカキコです。
けど、同じODBC接続でもCSEはちゃんとデータとって来れてるし、あれっ?と思って。
0178175
04/11/29 23:58:45ID:SyWDmi2S0179nobodyさん
04/12/13 09:37:18ID:LQJcn1sJ0180nobodyさん
04/12/14 18:00:43ID:gx135s3/TIMEDIFF(expr,expr2)みたいなことをしたい場合どうしたらいいでしょうか。
そうしたい場合はperlで得るepoctimeの値を保存するべき?
0181nobodyさん
2005/08/17(水) 02:05:25ID:???に番号フィールドのデータ全てを配列@aに格納、名前フィールドのデータを@bに格納するには
どう書いたらよいですか??
0182nobodyさん
2005/08/17(水) 02:11:32ID:5eFyQrDL0183nobodyさん
2005/08/17(水) 03:32:05ID:???http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+sql
0184nobodyさん
2005/08/17(水) 04:51:15ID:E/ZVNZ3Kよろ
0185nobodyさん
2005/08/17(水) 04:52:55ID:???0186nobodyさん
2005/08/17(水) 07:12:49ID:???http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+postgresql
0187nobodyさん
2005/08/20(土) 13:04:16ID:???0188nobodyさん
2005/12/02(金) 09:27:57ID:D04WUjX+>$dbh->{unicode} = 1; # fetchしたテキストフィールドのutf8flagがオン
命名のガイドラインに従うなら"sqlite_unicode"だろ。
0189nobodyさん
2006/02/24(金) 16:36:16ID:???わざとホスト名を間違えてエラーを出したのに、
undef が帰って来なくて die されてしまうんですがなぜでしょうか?
#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect( "dbi:Pg:host=aaaaa;port=5432;dbname=hoge", 'user', 'password' );
my $status = ( $dbh eq undef ) ? $DBI::errstr : 'ok';
print qq(content-type:text/html\n\n);
print $status;
exit;
この実行結果が 500 エラー。
connectできなかったら undef がくるのではないのか…
0190nobodyさん
2006/02/24(金) 17:03:13ID:j8E2zsnz500エラーだけじゃ情報が少なすぎるので、http鯖の
エラーログを見るか、
use CGI::Carp qw(fatalsToBrowser);
を使うか、自前でconnectをevalの中で実行して$@を
表示してみるなどして、どういうエラーが出てるかを
きちんと調べることをお勧めする。
0191190
2006/02/24(金) 18:17:21ID:???エラー処理を行おうと思っているのですが、undef が帰ってこなくて悩んでいます。
ですので、エラーの内容は特に何でもいい感じです。
ちなみにエラーの内容は、ホスト名をわざと間違えて実行しているので、
エラーログにももちろん
DBI connect(...) failed: could not translate host name "aaaaa" to address: Name or service not known
が出ます。
(エラーの内容はユーザ名間違いでもなんでもいいです)
参考にしているサイトやオライリーのPerlDBI本では、
undefを見てエラーチェックする例が書かれていたので…
0192191
2006/02/24(金) 18:25:23ID:???eval , $@ を使えば正しくエラー処理できてますが、
my $dbh = DBI::connect() or mySubRoutine();
のようなことがやりたい感じですが、エラー時でも or以降に行ってくれずdieされてる感じです。
0196nobodyさん
2006/02/24(金) 20:46:26ID:???0197nobodyさん
2006/02/24(金) 22:51:21ID:???環境やバージョンに依存した何かかね? PrintErrorを0にしないと、warningは
でるけど。あるいは書いてないけどどこかでRaiseErrorを有効にしてるとか?
% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass",); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
DBI connect('host=aaa','user',...) failed: could not translate host name "aaa" to address: Name or service not known
at -e line 1
死んでない
dbh is undef
% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass", {PrintError=>0}); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
死んでない
dbh is undef
0198nobodyさん
2006/02/24(金) 23:27:04ID:???0199189
2006/02/25(土) 21:19:30ID:???ご指摘ありがとうございます!
RaiseErrorが有効になっていたので、
無効にしてみたらちゃんとキャッチできました…
なにかものすごい勘違いをしていたようです。
RaiseErrorを無効にしないとdieされるから
キャッチできないってオチですね。
大変失礼しました。
0200nobodyさん
2006/03/31(金) 09:14:29ID:3Vb6MUysORA-01000が出るんですが、原因がわかりません。
常に出るわけではなく、なにをきっかけにしているのか
ずーっと悩んでいます。
Class::DBIを使った場合、カーソルが開く(もしくは閉じる)タイミングというのは
いつになるんでしょうか?
なにかヒントのようなものでもよいので
お願いします。
0201nobodyさん
2006/04/12(水) 16:46:12ID:Fg0UYczLperl command line iteratorが落ちてしまいます。
そしてMicrosoftへ連絡させられる・・・。
どのあたりに原因がありそうですか?
postgreにアクセスしないperlプログラムはちゃんと動くし、
pgAdminからならちゃんとpostgreSQLは機能します。
CPAN使ってDBIとDBD-Pgをインストールしました。
windowsでこの環境構築できた人居ますか?
0202201
2006/04/12(水) 17:35:44ID:Fg0UYczL○Interpreter
■ このスレッドは過去ログ倉庫に格納されています