简体   繁体   中英

“Fatal error: Cannot use string offset as an array” when variable is 08 or 09

I'm writing a script to output Google Analytics API data and insert it into a bar chart using Google Charts API. When I have a string like this in the URL, I get the desired result.

gaFeedData.php?y[]=2009&y[]=2010&m[]=1&m[]=2

However, when I have the following string in the URL, I get an error: Fatal error: Cannot use string offset as an array in gaFeedData.php on line 56

(the m[]=8 is interchangeable with m[]=9. For whatever reason, m[]=10, m[]=11 and m[]=12 work.)

gaFeedData.php?y[]=2009&y[]=2010&m[]=8

Also note, that GA does have data for those months.

My PHP code follows, with authentication information left out:

_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].", ";
    }
}

?>

You need to put your two-digit month names into quotes:

$month["07"][dfirst]  = $yy.'-07-01';

otherwise, PHP will interpret the number 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]+
...

I assume that in declaring the array members the way you do, the octal notation will lead to the wrong keys being set.

I believe @Pekka is correct. I wanted to mention, everywhere you have [dfirst] and [dlast] , you should be enclosing the indexes in quotes. So:

 if ($leapyear=='1')   $month[02][dlast]   = $yy.'-02-29';
    else                  $month[02][dlast]   = $yy.'-02-28';

should be:

 if ($leapyear=='1')   $month['02']['dlast']   = $yy.'-02-29';
    else                  $month['02']['dlast']   = $yy.'-02-28';

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM