“致命错误:当变量为08或09时,不能将字符串偏移量用作数组”

时间:2010-03-10 19:47:30

标签: php arrays string

我正在编写一个脚本来输出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].", ";
    }
}

?>

2 个答案:

答案 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';