次の3つのオプションがあります。
- 他のJSベースのシステム、Google Analitycsの類似物-触らないことに決めました。 アイデア自体は、さらに、JSの顧客が気に入らないというものです
- AwStatsおよびその他のログ分析ツールは、サーバーへの完全なアクセス権を持っている場合の防弾ソリューション(そしておそらく最良)です。 コードの変更は一切必要ありません。 ホスティングを共有しているのは残念ですが、ログに直接アクセスすることはできません。
- php-instrumentationを必要とする手段(コードはすべてのページで呼び出されるため)。
インターネットで調べてみると、後者のタイプ(PHP)に適したオプションがいくつかあり、一部は機能が劣っていて(特に、不十分なリファラーを示していました)、最終的にイラン起源であることが判明したためTraceWatchで停止しました 。 :-)インストールを開始したとき、私はショックを受けました-すべてのコードは難読化ツールによって処理され、ライセンスの作成者はそれを通常に戻すことを禁じています。 これは、無料で、すぐに大きな疑惑を引き起こしました。 このがらくたがデフォルト以外のディレクトリ(インクルードへのパスは絶対的で相対ではない)で獲得できず、これをコードに修正しようと試みた後、このクラフトから良いものを待つことができないことに気付きました。
次に、リファラートラッカーを作成することにしました
タスクはこれでした。日ごとに紹介を表示します。 それらがどこから来たのかを数える必要があります(GETパラメーターを使用)、Googleをフィルターします。他には何も必要ありません。 IPログなし、国、訪問数のカウントなど。 (ただし、これは実装するのに十分簡単です)
MySQL 5データベース
CREATE TABLE ` ref ` (
`id` int (11) NOT NULL auto_increment,
`ref_url` varchar (950) NOT NULL ,
`ref_date` date NOT NULL ,
`ref_count` int (11) NOT NULL default '0' ,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`ref_url`,`ref_date`),
KEY `ref_date` (`ref_date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=138 ;
そしてここ-MySQL 5の聖杯-エラーチェック付きのストアドプロシージャ-ユーザーごとに最大1つのデータベースクエリが保証されます。 この場合、(ストアドプロシージャはアトミックではないため)レコード作成時にユニットエラーが発生する可能性があります(非常に小さな確率ではあります)が、テーブルのロック/ロック解除によるリスク/速度の損失は、この失われたユニットの価値はないと考えました。
DELIMITER $$
CREATE PROCEDURE `process_url`(new_url VARCHAR (900))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION UPDATE ref SET ref_count=ref_count+1 WHERE ref_date=CURDATE() AND ref_url=new_url;
INSERT INTO ref (ref_url,ref_date,ref_count) VALUES (new_url,CURDATE(),1);
END $$
注意 :REF SET ref_url = '$ ref'にINSERT INTOを挿入、重複キーの更新時にref_date = ref_count = ref_count + 1-Nc_softハブブラウザーのおかげで、このコードはより簡単で、2-4倍高速です:- )
統計を収集します
ここでは、一般的なファイルのどこかに挿入する必要があります。 データベースへの接続がすでに確立されており、データベースが選択されていることがわかります。
function process_referrer()
{
$referrer = $_SERVER[ "HTTP_REFERER" ];
if (strpos($referrer, "your_site_name_here" )===FALSE && strlen($referrer)>0)
{
//google support, remove redundant parameters & multiple records for the same query from different countries like google.nl
if (strpos($referrer, "www.google" )!==FALSE)
{
if (preg_match( "/[?&]q=([^&]+)/" , $referrer, $matches)) {
$referrer = "Google Search: " .htmlspecialchars(urldecode($matches[1]));
} else
$referrer = "Google Search: broken query, $referrer" ;
}
//and finally, store it :crazy:
sqlexec( 'CALL process_url("' .mysql_real_escape_string($referrer). '");' );
}
}
ここで確認できるのは、ユーザーがページを歩いたり、手でアドレスを入力した(または巧妙なファイアウォールを切った)場合、データベースをぐいと動かしません。 邪悪なハッカーがリファラーでSQLインジェクションを滑らせる可能性があることを忘れないでください。したがって、いつものようにmysql_real_escape_stringが必要です。
主なものは残ります:-)
結果を見る
$max_date = sqlcount( "select MIN(ref_date) from (select DISTINCT ref_date from ref ORDER by ref_date DESC LIMIT 7) as tmp" );
$result = sqlexec( "select * from ref WHERE ref_date>='$max_date' order by ref_date DESC,ref_count DESC" );
$prev_date = "" ;
while ($row = mysql_fetch_array($result))
{
if ($row[ 'ref_date' ]!=$prev_date)
{
$articlesList .= "<h1>{$row['ref_date']}</h1>" ;
$prev_date = $row[ 'ref_date' ];
}
//Print $row data here with nice design
}
最初に、データベース内の最後の7つの日付が決定されます(ただし、現在の日付から7を差し引くこともできます)。 次に、過去7日間のすべてのレコードを取得し、日ごとに表示します。 リンクは、target = "_ blank"ですぐに可能です。
サポート手順
function sqlexec($sql)
{
if (!($result = mysql_query($sql))) showerror();
return ($result);
}
function sqlcount($sql)
{
$res = mysql_fetch_array(sqlexec($sql));
return ($res[0]);
}
結果
リンクをクリックして、あなたが書いた内容をすぐに読むことができます:-)
オリジナルはこちら: http : //3.14.by/ru/read/writing-php-referrer-tracker