我正在编写一个脚本来输出Google AnalyticsAPI数据,并使用Google Charts API将其插入条形图。当我在URL中有这样的字符串时,我得到了所需的结果。
gaFeedData.php?y[]=2009&y[]=2010&m[]=1&m[]=2
但是,当我在URL中有以下字符串时,出现错误:致命错误:无法在第56行的gaFeedData.php中将字符串偏移用作数组
(m [] = 8可与m [] = 9互换。无论出于何种原因,m [] = 10,m [] = 11且m [] = 12工作。)
gaFeedData.php?y[]=2009&y[]=2010&m[]=8
另请注意,GA 确实拥有这几个月的数据。
我的PHP代码如下,遗漏了身份验证信息:
_config.php:
<?php
$accountType = 'GOOGLE'; // DONT EDIT! // Account type
$source = 'report'; // DONT EDIT! // Application name
$accountName = 'user@gmail.com'; // User's email
$accountPass = 'password'; // User's password
$clientName = 'useratgmail'; // Client's name
$goalid = $_GET['goal'];
$startdate = $_GET['startdate'];
$enddate = $_GET['enddate'];
$y[0] = 0;
$m[0] = 0;
$y = $_GET["y"];
$m = $_GET["m"];
$URIAuth = 'https://www.google.com/accounts/ClientLogin';
$URIFeedAcct = 'https://www.google.com/analytics/feeds/accounts/default?prettyprint=true';
$URIFeedData = 'https://www.google.com/analytics/feeds/data?prettyprint=true';
?>
gaFeedData.php:
<?php
include("_config.php");
$TABLE_ID = 'ga:11111111';
foreach ($y as $yy) {
if ($yy%400==0) $leapyear='1';
elseif ($yy%100== 0) $leapyear='0';
elseif ($yy%4==0) $leapyear='1';
else $leapyear='0';
$month = array();
$month[01][dfirst] = $yy.'-01-01';
$month[01][dlast] = $yy.'-01-31';
$month[02][dfirst] = $yy.'-02-01';
if ($leapyear=='1') $month[02][dlast] = $yy.'-02-29';
else $month[02][dlast] = $yy.'-02-28';
$month[03][dfirst] = $yy.'-03-01';
$month[03][dlast] = $yy.'-03-31';
$month[04][dfirst] = $yy.'-04-01';
$month[04][dlast] = $yy.'-04-30';
$month[05][dfirst] = $yy.'-05-01';
$month[05][dlast] = $yy.'-05-31';
$month[06][dfirst] = $yy.'-06-01';
$month[06][dlast] = $yy.'-06-30';
$month[07][dfirst] = $yy.'-07-01';
$month[07][dlast] = $yy.'-07-31';
$month[08][dfirst] = $yy.'-08-01';
$month[08][dlast] = $yy.'-08-31';
$month[09][dfirst] = $yy.'-09-01';
$month[09][dlast] = $yy.'-09-30';
$month[10][dfirst] = $yy.'-10-01';
$month[10][dlast] = $yy.'-10-31';
$month[11][dfirst] = $yy.'-11-01';
$month[11][dlast] = $yy.'-11-30';
$month[12][dfirst] = $yy.'-12-01';
$month[12][dlast] = $yy.'-12-31';
foreach ($m as $mm) {
sleep(0.2);
$ch = curl_init($URIFeedData.'&ids='.$TABLE_ID.'&start-date='.$month[$mm][dfirst].'&end-date='.$month[$mm][dlast].'&metrics=ga:visits,ga:visitors,ga:pageviews,ga:timeOnSite'.'&alt=json');
$fp = fopen("$clientName.data.feed", "w");
$accountAuth = exec('awk /Auth=.*/ '.$clientName.'.auth');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: GoogleLogin $accountAuth","GData-Version: 2"));
curl_exec($ch);
curl_close($ch);
fclose($fp);
$jsonfile = fopen("$clientName.data.feed", "r");
$jsondata = fread($jsonfile, filesize("$clientName.data.feed"));
$output = json_decode($jsondata, 512);
$data[$yy][$mm][visits] = $output[feed]["dxp\$aggregates"]["dxp\$metric"][0][value];
echo $data[$yy][$mm][visits].", ";
}
}
?>
答案 0 :(得分:5)
您需要将两位数的月份名称加入引号:
$month["07"][dfirst] = $yy.'-07-01';
否则,PHP将解释数字as an octal value:
Formally, the structure for integer literals is:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
...
我假设在以你的方式声明数组成员时,八进制表示法将导致设置错误的键。
答案 1 :(得分:0)
我相信@Pekka是正确的。我想提一下,在[dfirst]
和[dlast]
的任何地方,您都应该将索引括在引号中。所以:
if ($leapyear=='1') $month[02][dlast] = $yy.'-02-29';
else $month[02][dlast] = $yy.'-02-28';
应该是:
if ($leapyear=='1') $month['02']['dlast'] = $yy.'-02-29';
else $month['02']['dlast'] = $yy.'-02-28';