キーワードを外部の検索エンジンを利用して、検索するスクリプト例を見ていきましょう。二つにファイルを分けて記述していきます。search.phpは検索する検索エンジンと検索キーワードを決定します。rdir.phpはsearch.phpからの入力情報を受け取り、検索画面の検索結果画面にリダイレクトします。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>外部検索エンジンを活用</title>
</head>
<body>
<h1>
検索エンジンを選択する
</h1>
<form method="post" action="rdir.php">
<p>検索キーワード:</p>
<input type="text" name="key" width="50" />
<p>使用する検索エンジン:</p>
<select name="sea">
<option value="google">
google
</option>
<option value="yahoo">
Yahoo!
</option>
</select>
<input type="submit" value="検索" />
</form>
</body>
</html>
「<form method="post" action="rdir.php">」によってsearch.phpの全体のアクションをrdir.phpに渡しています。「<input type="text" name="key" width="50" />」の「name="key"」で検索するキーワードをrdir.phpに渡しています。「<select name="sea">」では「name="sea"」により、どの検索エンジンでリダイレクトするかの決定を渡せるようにしています。
<?php
$strkey = urlencode($_POST[key]);
switch($_POST['sea']) {
case "google":
$url = "http://www.google.co.jp/search?q=";
break;
case "yahoo":
$url = "http://search.yahoo.co.jp/search?p=";
break;
}
header("Location: ".$url.$strkey);
?>
「$strkey = urlencode($_POST[key]);」ではポスト送信された検索キーワードの文字列「key」を「urlencode」により、URLエンコードをしさらに変数「$strkey」に代入しています。「switch($_POST['sea']) 」により、どの検索エンジンでキーワードが検索されたかをswitch文で判定します。「header("Location: ".$url.$strkey);」では「.」の文字列結合によって取得した検索エンジンのURL($URL)に検索したキーワード($strkey)を結合し検索結果のページにリダイレクトをしています。


ここでは検索結果の画面は省きますが、通常の検索エンジンで検索したと同じ、検索画面が表示されるはずです。
ここでは、よくウェブサイトに見られる新着項目にnewという新着マークを表示させる方法を実践してみます。
<html>
<head>
<title>新着情報の告知</title>
</head>
<body>
<h1>
新着情報の告知
</h1>
<ul>
<?php
clearstatcache();
$objectdir = dir("./doc");
while($strpath = $objectdir->read()) {
if($strpath!= "." && $strpath!= "..") {
$key = "rec".str_replace(".","_",$strpath);
echo("<li><a href='cookie.php?doc=".$strpath."'>".$strpath."</a>");
if((!isset($_COOKIE[$key]) || $COOKIE[$key] != filemtime("./doc/".$strpath))
&&filemtime("./doc/".$strpath)>=strtotime("-3 days")) {
echo (" <img src='new.gif' width='33' height='13' alt='new' />");
}
echo ("</li>");
}
}
$objectdir->close();
?>
</ul>
</body>
</html>
更新日時などの情報を常に最新の状態にする必要がありますので、clearstatcache()関数でファイルステータスのキャッシュをクリアします。「$objectdir = dir("./doc");」はdir関数でファイルがあるディレクトリを表し、変数「$objectdir」に代入しています。「while($strpath = $objectdir->read())」はread()で$objectdirに入っているファイルを読み込み、それを変数「$strpath」に代入してwhile文で繰り返し処理をしています。
read()によって読み込まれるファイルには一階層上を示す「..」と現在階層「.」が含まれますので、今回実際にファイルではないので「if($strpath!= "." && $strpath!= "..")」により除外します。
「$key = "rec".str_replace(".","_",$strpath);」は「"rec".str_replace(".","_",$strpath);」によりクッキーのキーを「rec」を先頭につけ、ファイル名の「.」を「_」に置き換えます。理由としては、クッキーのキーは先頭に来る文字が「1234」などの文字である場合や「.」が含まれることは許されません。例として、「1234.php」というファイルのクッキーのキーは「rec1234_php」という具合になります。
「echo("<li><a href='cookie.php?doc=".$strpath."'>".$strpath."</a>");」は各ファイルにアクセスする際、cookie.phpの処理を通し、そこからリダイレクトさせています。cookie.phpはクッキーに更新したファイルの更新年月を記録するスクリプトを記述しています。
赤い下線を引いた部分のスクリプトでは、現在のクッキー、キー$keyが存在しない場合(isset関数で判定)もしくはクッキーに記録したファイルの最終更新日時と対応した実際に 更新したファイルの最終更新日時を比較し異なり、かつ最終の更新日時が3日以内(strtotime("-3 days")で判定)のものに対して、newの画像を表示させています。
「$objectdir->close();」はディレクトリに対して読み込みが終了した後、close()でオブジェクトを閉じています。
<?php
clearstatcache();
$key = "rec".str_replace(".","_",$_GET['doc']);
if(!isset($_COOKIE[$key]) || $_COOKIE[$key] != filemtime("./doc/".$_GET['doc'])) {
setcookie($key,filemtime ("./doc/".$_GET['doc']),time()+60*60*24*90);
}
header("Location: "."./doc/".$_GET['doc']);
?>
「clearstatcache();」はファイルステータスのキャッシュをクリアします。
「$key = "rec".str_replace(".","_",$_GET['doc']);」はnew_info.phpと同様のロジックです。
赤い下線の部分のスクリプトは現在のクッキーにキー$keyがない、またはクッキーに記録されたファイルの最終更新日と対応する実際のファイルの現在の最終更新日とを比較し違っていた場合、新しくクッキーを生成し、または既存クッキーを上書きします。setcookie()関数で第一引数にファイル名、第二引数に最終更新日、第3引数にクッキーの有効期限を決定しています。
「header("Location: "."./doc/".$_GET['doc']);」はクッキーの保存処理を終了した後、対応したファイルにリダイレクトをします。

上記の実行結果はnew_info.phpの「strtotime("-3 days"」とした結果です。更新または新たにファイルを作成したのが、3日以内ですので、new画像が表示されています。ファイルはdocディレクトリ内に保存しています。new画像はnew_info.php、cookie.phpと同階層に保存しています。

上記の実行結果はnew_info.phpの「strtotime("now"」とした結果です。更新または新たにファイルを作成したのが現在時刻ですので、new画像が表示されていません。