SQLiteでたまにアクセスログが取れない
PHPが使えないサーバーにあるホームページのアクセスログを取得するため、
JavaScriptを使ってPHPが使えるレンタルサーバーに飛び、
PHP+SQLite2でアクセスログを集計していました。
最近パソコンを買い替えたのを機にPHPをVersion 5.4.8にアップデートしたところ、
ローカル環境でSQLite2が使えなくなり、この際pdo_sqliteにプログラムを書き換えました。
レンタルサーバーではSQLite2 がまだ使えるため、以前のプログラムはそのままにして
SQLite2 とPDO両方でログをとってみました。
するとSQLite2では取れているのにPDOでは取れていない、
逆にPDOでは取れているのにSQLite2では取れていないログがあることに気が付きました。
(詳しくは下記の画像をご覧ください 赤丸がついているものが他方にはないログです)
https://box.yahoo.co.jp/guest/viewer?sid=box-l-oolzr4jkzfiedw4zavuldosoha-1001&uniqid=12bc9230-5e96-41fb-b00e-271a1aa79397&viewtype=detail#du%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ds%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26tu%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ts%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26vt%3Dpublic%26lf%3Dlist%26ls%3D1%26lm%3D20%26il%3D1
何が問題なのでしょうか?
プログラム? SQLite? PHP? サーバー? 閲覧者のブラウザ?
また回避法をご存知でしたらご教授願います。
(log.js)
ref =document.referrer;
var qword="";
if(ref.indexOf("?")!=-1){
ref2=ref.split("?");
query=ref2[1].split("&");
qword="?qword=";
for (i=0; i<query.length; i++){
qword+=query[i]+"*";
}
ref=ref2[0];
}
document.write('<script src=" http://○○○/log2.php?ref='+ ref + qword +'"></script>');
document.write('<script src=" http://○○○/log.php?ref='+ ref + qword +'"></script>');
(log.php)
<?php
$referer = stripslashes($_GET['ref']);
$d=date_create();
$date=date_format($d,"Y/m/d");
$time=date_format($d,"H:i:s");
$day=date_format($d,"w");
$referer=sqlite_escape_string($referer);
$url=sqlite_escape_string($_SERVER['HTTP_REFERER']);
$accept_language=sqlite_escape_string($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$remote_addr=sqlite_escape_string($_SERVER['REMOTE_ADDR']);
$user_agent=sqlite_escape_string($_SERVER['HTTP_USER_AGENT']);
$db=sqlite_open("log.sqlite");
$sql="INSERT INTO log_table (
log_date,
log_time,
log_day,
log_url,
log_referer,
log_language,
log_remote_addr,
log_user_agent)
VALUES(
'$date',
'$time',
$day,
'$url',
'$referer',
'$accept_language',
'$remote_addr',
'$user_agent')";
sqlite_query($db,$sql);
sqlite_close($db);
(log2.php)
<?php
$referer = stripslashes($_GET['ref']);
$d=date_create();
$date=date_format($d,"Y/m/d");
$time=date_format($d,"H:i:s");
$day=date_format($d,"w");
$db=new PDO("sqlite:/home/○○○/www/log.sqlite3",null,null);
$referer=$db->quote($referer);
$url=$db->quote($_SERVER['HTTP_REFERER']);
$accept_language=$db->quote($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$remote_addr=$db->quote($_SERVER['REMOTE_ADDR']);
$user_agent=$db->quote($_SERVER['HTTP_USER_AGENT']);
$sql="INSERT INTO log_table (
log_date,
log_time,
log_day,
log_url,
log_referer,
log_language,
log_remote_addr,
log_user_agent)
VALUES(
'$date',
'$time',
$day,
$url,
$referer,
$accept_language,
$remote_addr,
$user_agent)";
$res=$db->prepare($sql);
$res->execute();
$db=null;
レンタルサーバーの環境
さくらインターネット
PHP Version 5.2.17
Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
SQLite 2.8.17
pdo_sqlite 3.3.7
お礼
遅くなりましたが、ありがとうございます。 私の乏しい知識ではうまくいかない様です。
補足
できたようです。 Main.cppに void add_message(AnsiString msg){ FmMain->Memo1->Lines->Add(msg); } static int callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; ~ } とし、Main.hのextern部に両方宣言するとうまくいきました。