[英]“Fatal error: Cannot use string offset as an array” when variable is 08 or 09
我正在編寫一個腳本,以輸出Google Analytics(分析)API數據並將其插入到使用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].", ";
}
}
?>
您需要將兩位數的月份名稱放在引號中:
$month["07"][dfirst] = $yy.'-07-01';
否則,PHP將數字解釋為八進制值 :
Formally, the structure for integer literals is:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
...
我假設在以聲明方式聲明數組成員時,八進制表示法將導致設置錯誤的鍵。
我相信@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';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.