Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP有条件地在头中记录值_Php_Mobile_Opera Mini - Fatal编程技术网

使用PHP有条件地在头中记录值

使用PHP有条件地在头中记录值,php,mobile,opera-mini,Php,Mobile,Opera Mini,我对PHP很陌生,所以请容忍我 我正在尝试登录访问我网站的手机的用户代理。我通过检查$\u SERVER['HTTP\u USER\u AGENT']值来实现这一点 遇到一个小问题,我注意到此人是否通过opera mini访问我的站点,然后opera mini将实际用户代理移动到一个标题值中,该标题值标识为X-OperaMini-Phone-UA: 因此,我正在寻找PHP代码,该代码将从头文件(如果存在)中提取该文件,如果没有,则将其标识为NA以用于数据库日志记录 这是我目前用于记录日志的代码,

我对PHP很陌生,所以请容忍我

我正在尝试登录访问我网站的手机的用户代理。我通过检查$\u SERVER['HTTP\u USER\u AGENT']值来实现这一点

遇到一个小问题,我注意到此人是否通过opera mini访问我的站点,然后opera mini将实际用户代理移动到一个标题值中,该标题值标识为X-OperaMini-Phone-UA:

因此,我正在寻找PHP代码,该代码将从头文件(如果存在)中提取该文件,如果没有,则将其标识为NA以用于数据库日志记录

这是我目前用于记录日志的代码,它是由其他人编写的

<?php
mysql_connect('server.com', 'dbuser', 'dbpass');
$url = mysql_real_escape_string("http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]");
$fn = mysql_real_escape_string($_SERVER['SCRIPT_NAME']);
$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$ref = mysql_real_escape_string($_SERVER['HTTP_REFERER']);
$ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
mysql_select_db('db');
mysql_query("INSERT INTO `record` VALUES ('$url', '$fn', NOW(),'$ip', '$ref','$ua')");
?>

您可以通过以下方式获取值:

另一种方法是使用.htaccess中的rewriterule将标头添加到环境变量中,然后像往常一样通过
$\u服务器
获取它:

RewriteRule .* - [E=X-OPERAMINI-PHONE-UA:%{HTTP:X-OperaMini-Phone-UA}]

您还可以使用
$\u服务器['HTTP\u X\u OPERAMINI\u PHONE\u UA']

if(!empty($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])){
    // use $_SERVER['HTTP_X_OPERAMINI_PHONE_UA']
}else{
    // use default $_SERVER['HTTP_USER_AGENT']
}

2012年10月,Opera建议了名为
设备库存UA
的新标题。此后,新的Opera Mini/Mobile浏览器将使用新的
设备库存UA
和旧的
X-OperaMini-Phone-UA
标题。

此参数的定义如下:

此标头的值与捆绑的stock user agent的值匹配 运行Opera Mobile或Mini的操作系统

关于该更新,我创建了此函数:

public static function getUserAgentDevice() {
    if (isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])) {
        return $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'];
    }
    if (isset($_SERVER['HTTP_DEVICE_STOCK_UA'])) {
        return $_SERVER['HTTP_DEVICE_STOCK_UA'];
    }
    return $_SERVER['HTTP_USER_AGENT'];
}

我将使用函数alias
getallheaders()
。在NSAPI下也可以使用此方法,如果您运行的是
PHP>=5.4.0
,则在FastCGI下也可以使用此方法,但您可能没有。谢谢,我会尝试一下,但这只回答了一部分,我如何有条件地记录它?@Michael:我用一个更详细的示例更新了答案。为了更进一步,您必须显示当前如何进行日志记录。问题是我仍然希望保留一个事实,即Opera迷你浏览器访问了该页面,这就是我添加附加字段的原因。或者,如果值是通过X-opera头记录的,但不知道如何做,我可以预先挂起一些文本。我想说的是,我需要原始的用户代理,但我还需要知道它是不是从Opera获得的Michael:然后您必须向
记录
表中添加一个字段,并向
插入
查询中添加(可能是空的)Opera迷你头,或者连接字符串。连接是用php中的
完成的。您能显示日志代码的相关部分吗?您在哪里获取
$\u服务器['HTTP\u用户\u代理]
,以及如何存储它?
public static function getUserAgentDevice() {
    if (isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])) {
        return $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'];
    }
    if (isset($_SERVER['HTTP_DEVICE_STOCK_UA'])) {
        return $_SERVER['HTTP_DEVICE_STOCK_UA'];
    }
    return $_SERVER['HTTP_USER_AGENT'];
}