サーバ変数 のところでブラウザの銘柄が $_SERVER['HTTP_USER_AGENT']
で得られることを勉強しました。
このことを使って,このページをアクセスしたブラウザの銘柄を,SQLite を併用して数えてみましょう(2007-08-04起算)。
| ブラウザ | 回数 |
|---|---|
| Firefox/1 | 18 |
| Firefox/2 | 305 |
| MSIE 3 | 0 |
| MSIE 4 | 0 |
| MSIE 5 | 8 |
| MSIE 6 | 498 |
| MSIE 7 | 172 |
| Mozilla/3 | 0 |
| Mozilla/4 | 12 |
| Mozilla/5 | 538 |
| Mozilla/6 | 0 |
| Mozilla/7 | 0 |
| Mozilla/8 | 0 |
| Mozilla/9 | 0 |
| Opera | 29 |
| Other | 232 |
| Safari | 50 |
ソース:
<?php
$u = $_SERVER['HTTP_USER_AGENT'];
if (preg_match("/MSIE \d/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Firefox\/\d/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Safari/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Opera/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Mozilla\/\d/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Mozilla\/\d/", $u, $matches))
$x = $matches[0];
else
$x = "Other";
$db = sqlite_open('ファイル名')
or die("<p>ファイルが開けません</p>");
$sql = "update httpua set cnt = cnt + 1 where browser = '$x'";
$result = sqlite_query($db, $sql)
or die("<p>表が更新できません</p>");
$sql = "select * from httpua order by browser";
$result = sqlite_array_query($db, $sql, SQLITE_NUM)
or die("<p>表が読めません</p>");
$rows = count($result);
echo "<table border=\"1\">\n";
echo "<tr><th>ブラウザ</th><th>回数</th></tr>\n";
for ($i = 0; $i < $rows; $i++) {
echo "<tr>";
for ($j = 0; $j < 2; $j++) {
$s = $result[$i][$j];
echo "<td>$s</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
sqlite_close($db);
?>
あらかじめたとえば次のように表を作っておきます。
$db = sqlite_open("ファイル名");
sqlite_query($db, "create table httpua(browser text, cnt int)");
sqlite_query($db, "insert into httpua values('MSIE 7', 0)");
sqlite_query($db, "insert into httpua values('MSIE 6', 0)");
sqlite_query($db, "insert into httpua values('MSIE 5', 0)");
sqlite_query($db, "insert into httpua values('MSIE 4', 0)");
sqlite_query($db, "insert into httpua values('MSIE 3', 0)");
sqlite_query($db, "insert into httpua values('Firefox/1', 0)");
sqlite_query($db, "insert into httpua values('Firefox/2', 0)");
sqlite_query($db, "insert into httpua values('Safari', 0)");
sqlite_query($db, "insert into httpua values('Opera', 0)");
sqlite_query($db, "insert into httpua values('Mozilla/9', 0)"); // ?
sqlite_query($db, "insert into httpua values('Mozilla/8', 0)"); // ?
sqlite_query($db, "insert into httpua values('Mozilla/7', 0)");
sqlite_query($db, "insert into httpua values('Mozilla/6', 0)");
sqlite_query($db, "insert into httpua values('Mozilla/5', 0)");
sqlite_query($db, "insert into httpua values('Mozilla/4', 0)");
sqlite_query($db, "insert into httpua values('Mozilla/3', 0)");
sqlite_query($db, "insert into httpua values('Other', 0)");
sqlite_close($db);
?>
あるいは,サーバにログインして,次のように打ち込んでもかまいません。
sqlite ファイル名 create table httpua(browser text, cnt int); ...(中略)... .quit
上と同じことを連想配列(associative array)でやってみましょう。
$r = sqlite_array_query($db, "select ...", SQLITE_ASSOC)
とすると,結果 $r は通常の配列ではなく連想配列となり,番号ではなく名前で参照できます。
<?php
$u = $_SERVER['HTTP_USER_AGENT'];
if (preg_match("/MSIE \d/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Firefox\/\d/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Safari/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Opera/", $u, $matches))
$x = $matches[0];
elseif (preg_match("/Mozilla\/\d/", $u, $matches))
$x = $matches[0];
else
$x = "Other";
$db = sqlite_open('ファイル名')
or die("<p>ファイルが開けません</p>");
$sql = "update httpua set cnt = cnt + 1 where browser = '$x'";
$result = sqlite_query($db, $sql)
or die("<p>表が更新できません</p>");
$sql = "select * from httpua order by browser";
$result = sqlite_array_query($db, $sql, SQLITE_ASSOC)
or die("<p>表が読めません</p>");
sqlite_close($db);
echo "<table border=\"1\">\n";
echo "<tr><th>ブラウザ</th><th>回数</th></tr>\n";
foreach ($result as $entry)
echo "<tr><td>", $entry['browser'], "</td><td>", $entry['cnt'], "</td></tr>\n";
echo "</table>\n";
?>
2004-05-03起算,2007-08-04にリセットした時点では次の通りでした。
| ブラウザ | 回数 |
|---|---|
| MSIE 3 | 19 |
| MSIE 4 | 5 |
| MSIE 5 | 586 |
| MSIE 6 | 16192 |
| Mozilla/3 | 52 |
| Mozilla/4 | 171 |
| Mozilla/5 | 5785 |
| Mozilla/6 | 6 |
| Mozilla/7 | 6 |
| Other | 1489 |
Last modified: 2007-12-04 13:00:55