プロが教えるわが家の防犯対策術!

はじめまして、まだCGI初心者なものでよくわからないですが教えてください。

あるCGI関連の書籍に付属のCD内に修められた顧客データベースを改造しているところです。このデータベースはCSVデータの全ての情報を検索して結果を表示するものなのですが、これを「備考($ message)以外の情報を全て検索して結果を表示する」とするにはどのように改造したらよろしいでしょうか。備考は検索しないけれど、他の情報は全て検索して結果を表示させるということです。ただし、結果として表示される画面には備考($ message)の内容も表示させたいのです。

検索に関わる箇所を抜き出すと次のようになります。初心者なので説明がうまくできていないと思いますが、ご解答できる方々は是非ともご教授お願いいたします。

############################
# 初期画面、検索結果表示
############################
sub html {
open(IN,"$file") || &error(100,'ファイルをオープンできません');
@DB = <IN>;
close(IN);
@DB = reverse(@DB);

if ($FORM{'action'} eq "search") {
$kw = $FORM{'kw'};
&jcode::convert(*kw,'euc');
foreach $line (@DB) {
$value = $line;
if ($kw =~ m/[\*\{\}\=\&\@\~\>\<\#\%\"\'\`\(\)\[\]\\\/\:\;\_\,]/){
&error(101,'検索キーが不適切です'); }

&jcode::convert(*value,'euc');
if ($value =~ /$kw/i){
push(@HIT,$line);
}
}
}else{
@HIT = @DB;
}
print "Content-type: text/html\n\n";

print <<"EOL";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=x-euc-jp">
<title>$title</title>
@style
</head>
<body>
<div align="center">
<p class="title">$title</p>
<p class="text"><b>|</b><a href="$HomeUrl">ホームページ</a><b>|</b></p>
<form method="post" action="$reload">
<input type="hidden" name="action" value="write">
<input type="submit" value="データベースに書き込む" class="buttonsmall">
</form>
<form method="post" action="$reload">
<input type="hidden" name="action" value="search">
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td>
<p class="text">名前、ユーザー名他、備考文の文字検索ができます。</p>
</td>
</tr>
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="2">
<tr valign="bottom">
<td>
<input type="text" name="kw" size="30" class="textarea">
</td>
<td>
<input type="submit" value="検索" class="buttonsmall">
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
EOL


if ($FORM{'line'} eq ''){
$line = 0;
}else{
$line = $FORM{'line'};
}

$data_count = @HIT - 1;
$view_end = $line + ($view-1);
if ($view_end >= $data_count){
$view_end = $data_count;
}
foreach ($line .. $view_end) {
($date_now,$number,$name,$email,$hp,$message,$tiku,$yuza,$tel,$fax,$busho)
= split(/\,/,$HIT[$_]);
$message =~ s/\r/<br>/g;
print <<"EOL";

############################

A 回答 (1件)

検索のロジックは、


------------------------------
1行取りだして、$lineに入れる
$lineの内容を$valueに入れる
$valueにキーワードが含まれているかどうかチェックする
------------------------------
というようになっています。これを全行分くりかえしています。
$valueがチェックの対象ですから、チェックの対象を変更したいなら$valueを調整すればOKです。
上記の「$lineの内容を$valueに入れる」の部分を、「$lineのうち必要なものだけを$valueに入れる」という処理に変えます。

簡単な方法としては、この行を、

$value = $line;
 ↓↓
$value = join ',', (split /,/, $line)[1, 3, 4, 5];

に書き換えれば良いと思います。
CSVの左から2、4、5、6個目の項目だけ取り出して、$valueに入れています。
チェックさせたい項目を指定してください。一番左がゼロ、次が1、2、3…です。

ちなみに、カンマで区切って取り出した後にわざわざまたカンマでつないでいるのは、キーワードとフィールドの切れ目を考慮してのことです。

ところで、最初に書いたロジックをもう一度よく見てください。
なんだか無駄なことしていますよね。$lineは何のためにあるのか?はじめから$valueに入れればいいのに。
そういう意味では、今回のように特定の項目だけ対象にすることを想定してあるのかもしれませんね。
    • good
    • 0
この回答へのお礼

tasekiさん、素早いご解答有難うございました。
早速試した結果、私の望み通り動いてくれました。
大変感謝いたします。重ねて御礼を言わせてください。
有難うございました。

お礼日時:2008/10/17 23:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!