frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

DBIとプレースホルダーとSQL文。

隣の島でDBI使ってSQL発行してる箇所を洗い出しているっぽい。

でも、プレースホルダー使ってるから、

結局、どんな値でSQL発行されたか、わかりにくいっ。

てな訳で、少し気になったので調べたら、簡単でした(笑)

でも、全部の箇所に仕掛けるのは面倒だなぁ。

#!/usr/bin/perl -w

use strict;

use DBI;

my $TRACE_LOG_PATH = '/home/anigon/dbi/trace.log';

my $TRACE_LEVEL = 2;

my $DB_SOUCE = 'dbi:mysql:test';

my $DB_USER = 'root';

my $DB_PASS = 'root';

my $dbh = DBI->connect($DB_SOUCE, $DB_USER, $DB_PASS);

$dbh->trace($TRACE_LEVEL, $TRACE_LOG_PATH);

my $sql = 'SELECT * FROM test WHERE name = ?';

my $sth = $obj->prepare($sql);

my $result = $sth->execute("'?&%");

…(略)

ポイントは $dbh->trace($TRACE_LEVEL, $TRACE_LOG_PATH); の部分。

これを実行すると、$TRACE_LOG_PATH で指定したパスに

ログが保存されているんで、開いてみると…

DBI::db=HASH(0x98fb698) trace level set to 2 in DBI 1.40-ithread (pid 6912)

-> prepare for DBD::mysql::db (DBI::db=HASH(0x9842268)~0x98fb698 'SELECT * FROM test WHERE name = ?') thr#9786008

Setting mysql_use_result to 0

<- prepare= DBI::st=HASH(0x98fb7dc) at dbi_place.pl line 17

-> execute for DBD::mysql::st (DBI::st=HASH(0x98fb7dc)~0x98fb86c ''?&%') thr#9786008

-> dbd_st_execute for 098fb89c

Binding parameters: SELECT * FROM test WHERE name = '\'?&%'

<- dbd_st_execute 0 rows

<- execute= '0E0' at dbi_place.pl line 18

-> DESTROY for DBD::mysql::st (DBI::st=HASH(0x98fb86c)~INNER) thr#9786008

<- DESTROY= undef

-> DESTROY for DBD::mysql::db (DBI::db=HASH(0x98fb698)~INNER) thr#9786008

&imp_dbh->mysql: 98fb934

<- DESTROY= undef

…こんな感じのが入ってるのでした。

で、「Binding parameters」の行を見ると、

めでたくプレースホルダに値がバインドされたSQL文が書いてあるので

これを参考にすればいいんではないかと思ったりしますー。

あるいは、全部の DBI使用箇所で trace 仕掛けるのは大変なんで

出力先が STDERR で良いなら、環境変数 DBI_TRACE を 2 に設定しときゃいいみたいです。

[root@localhost i386-linux-thread-multi]#  export DBI_TRACE=2

あと、mod_perl 環境下では httpd.conf で

「PerlSetEnv DBI_TRACE 2」などと環境変数を仕掛けるなんつーのもアリ。

Alias /cgi-bin/ /home/anigon/cgi-bin/

<Location /cgi-bin/>

SetHandler perl-script

PerlResponseHandler ModPerl::Registry

PerlOptions +ParseHeaders

PerlSetEnv DBI_TRACE 2

Options +ExecCGI

Order allow,deny

Allow from all

</Location>

これやっとくと、あとは勝手に apacheのエラーログにトレースした内容が記録されます。

それにしても、久々に欲しい本が。

モダンPerl入門」いいなぁ。