繁体   English   中英

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

[英]“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.

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