DBIとプレースホルダーとSQL文。
隣の島でDBI使ってSQL発行してる箇所を洗い出しているっぽい。
でも、プレースホルダー使ってるから、
結局、どんな値でSQL発行されたか、わかりにくいっ。
てな訳で、少し気になったので調べたら、簡単でした(笑)
でも、全部の箇所に仕掛けるのは面倒だなぁ。
#!/usr/bin/perl -wuse 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/これやっとくと、あとは勝手に apacheのエラーログにトレースした内容が記録されます。<Location /cgi-bin/>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
PerlSetEnv DBI_TRACE 2
Options +ExecCGI
Order allow,deny
Allow from all
</Location>
「モダンPerl入門」いいなぁ。