«Неустранимая ошибка: невозможно использовать смещение строки в качестве массива», когда переменная равна 08 или 09 - PullRequest
1 голос
/ 10 марта 2010

Я пишу скрипт для вывода данных API Google Analytics и вставки их в гистограмму с помощью Google Charts API. Когда в URL появляется такая строка, я получаю желаемый результат.

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

Однако, когда в URL появляется следующая строка, я получаю сообщение об ошибке: Неустранимая ошибка: невозможно использовать смещение строки в качестве массива в gaFeedData.php в строке 56

(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 ]

5 голосов
/ 10 марта 2010

Вы должны поместить двухзначные названия месяцев в кавычки:

$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]+
...

Я предполагаю, что при объявлении элементов массива, как вы делаете, восьмеричная запись приведет к неправильной установке ключей.

0 голосов
/ 10 марта 2010

Я считаю, что @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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...