第7章のリスト7.10に示したmemberadm(150ページ)とリスト7.12のbbord.cgi(154ページ)に、また不具合が発見されました。IDやパスワードのチェックを行うSELECT文の判定方法に不具合があり、常にチェックがエラーになってしまうというものです。ご迷惑をおかけして、まことに申しわけありませんでした。
対策としては、SELECT文を実行しているexecuteの返り値判定(計3カ所)を、次のパッチのように修正してください。
diff -cr Perl.old/bboard.cgi Perl/bboard.cgi
*** Perl.old/bboard.cgi Mon Aug 6 12:35:44 2001
--- Perl/bboard.cgi Mon Aug 6 12:36:17 2001
***************
*** 147,153 ****
sub check_id {
my($id, $url) = @_;
my $sth = $mydb->prepare("SELECT 1 FROM member WHERE id='$id'");
! if ($sth->execute == 0) {
error ('この ID は会員登録されていません', $url);
}
}
--- 147,154 ----
sub check_id {
my($id, $url) = @_;
my $sth = $mydb->prepare("SELECT 1 FROM member WHERE id='$id'");
! $sth->execute;
! if ($sth->rows == 0) {
error ('この ID は会員登録されていません', $url);
}
}
***************
*** 160,166 ****
$idq = $mydb->quote($id);
$pq = $mydb->quote($passwd);
$sth = $mydb->prepare("SELECT 1 FROM member WHERE id=$idq AND passwd=$pq");
! if ($sth->execute == 0) {
error ('パスワードが間違っています', $url);
}
$sth->finish;
--- 161,168 ----
$idq = $mydb->quote($id);
$pq = $mydb->quote($passwd);
$sth = $mydb->prepare("SELECT 1 FROM member WHERE id=$idq AND passwd=$pq");
! $sth->execute;
! if ($sth->rows == 0) {
error ('パスワードが間違っています', $url);
}
$sth->finish;
diff -cr Perl.old/memberadm Perl/memberadm
*** Perl.old/memberadm Mon Aug 6 12:35:44 2001
--- Perl/memberadm Mon Aug 6 12:36:17 2001
***************
*** 61,67 ****
elsif ($command eq 'list') {
usage() if (@ARGV != 0);
$sth = $db->prepare("SELECT id,name,email,passwd FROM member");
! $num = $sth->execute;
for ($i=0; $i<$num; $i++) {
($id, $name, $email, $passwd) = $sth->fetchrow_array;
printf "%s %s %s %s\n", $id, $name, $email, $passwd;
--- 61,68 ----
elsif ($command eq 'list') {
usage() if (@ARGV != 0);
$sth = $db->prepare("SELECT id,name,email,passwd FROM member");
! $sth->execute;
! $num = $sth->row;
for ($i=0; $i<$num; $i++) {
($id, $name, $email, $passwd) = $sth->fetchrow_array;
printf "%s %s %s %s\n", $id, $name, $email, $passwd;
修正済みのコードも用意してありますので、ダウンロードしてお使いください(mysql-book-4ed-perl-samples.tar.gz)。なお、このコードには下記5月17日付けの不具合への修正も含まれています。(2001/08/06)